簡(jiǎn)單介紹eCos的體系結(jié)構(gòu),詳細(xì)論述eCos的可配置機(jī)制的實(shí)現(xiàn)原理,重點(diǎn)介紹eCos在以AT91M55800為核心的ARM7硬件平臺(tái)上的移植步驟,結(jié)合本系統(tǒng)簡(jiǎn)要介紹內(nèi)核的配置方法。最后給出了基于eCos應(yīng)用軟件的編寫(xiě)方法。
關(guān)鍵詞 eCos 可配置機(jī)制 ARM7 移植 硬件平臺(tái)
eCos(Embedded Configurable Operating System)最初是由Cygnus Solutions公司為面向嵌入式領(lǐng)域而開(kāi)發(fā)的源碼公開(kāi)、具有很強(qiáng)的可移植性和可配置性的,適合于深度嵌入式開(kāi)發(fā)的實(shí)時(shí)操作系統(tǒng)。現(xiàn)在eCos主要由eCosCentric公司和eCos開(kāi)源社區(qū)共同開(kāi)發(fā)維護(hù)。eCos的特性,特別是它的可配置性,能有效縮短嵌入式產(chǎn)品的開(kāi)發(fā)周期并降低成本。
1? eCos的體系結(jié)構(gòu)及可配置性
1.1? eCos體系結(jié)構(gòu)
eCos采用模塊化設(shè)計(jì),將不同功能的軟件分成不同的組件,使其分別位于系統(tǒng)的不同層次。這種層次結(jié)構(gòu)實(shí)現(xiàn)了eCos的可配置性、可移植性、兼容性和可擴(kuò)展性。圖1是eCos系統(tǒng)的層次結(jié)構(gòu)框圖。硬件抽象層(HAL)使其上層次結(jié)構(gòu)不必關(guān)心具體的硬件結(jié)構(gòu),因此只需對(duì)HAL進(jìn)行修改就可以使整個(gè)eCos的應(yīng)用移植到新的硬件平臺(tái)上。
內(nèi)核是eCos的一個(gè)核心組件,也是系統(tǒng)的一個(gè)可選組件,一些較為復(fù)雜的應(yīng)用需要內(nèi)核的支持。內(nèi)核提供了多個(gè)可供選擇的調(diào)度算法,可以很好地支持多任務(wù)處理。eCos內(nèi)核提供了一組豐富的同步源語(yǔ),完全能滿足各種嵌入式應(yīng)用的需求。內(nèi)核還負(fù)責(zé)對(duì)中斷和例外進(jìn)行處理,它的中斷滯后處理機(jī)制保證了系統(tǒng)的實(shí)時(shí)性。此外,內(nèi)核還具有內(nèi)存分配機(jī)制和定時(shí)機(jī)制,并提供多線程GDB調(diào)試支持。內(nèi)核為上層軟件和應(yīng)用軟件提供了豐富的API接口函數(shù)。
RedBoot是一個(gè)無(wú)內(nèi)核的系統(tǒng)引導(dǎo)程序,是eCos的一個(gè)特殊應(yīng)用。RedBoot可以加載eCos應(yīng)用程序,并提供Debug支持,是開(kāi)發(fā)eCos系統(tǒng)時(shí)非常有用的工具。設(shè)備驅(qū)動(dòng)程序負(fù)責(zé)對(duì)硬件設(shè)備進(jìn)行控制和管理,并完成設(shè)備數(shù)據(jù)的讀/寫(xiě)操作。設(shè)備驅(qū)動(dòng)程序自身也采用層次結(jié)構(gòu),上層驅(qū)動(dòng)程序(相當(dāng)于一個(gè)虛設(shè)備)可以調(diào)用下層驅(qū)動(dòng)程序(物理設(shè)備)。驅(qū)動(dòng)程序?yàn)樯蠈榆浖峁?biāo)準(zhǔn)的API函數(shù),應(yīng)用程序可以使用這些API函數(shù)對(duì)設(shè)備進(jìn)行訪問(wèn)。
eCos包含的網(wǎng)絡(luò)支持包支持完整的TCP/IP網(wǎng)絡(luò)協(xié)議棧。eCos還提供了標(biāo)準(zhǔn)庫(kù)(ANSI C庫(kù)和數(shù)學(xué)庫(kù))、兼容層(POSIX兼容和uITRON兼容)、文件系統(tǒng)等。作為一種開(kāi)放軟件,eCos還可以很方便地容納第三方軟件。
1.2? 可配置性原理
eCos的一個(gè)主要特性就是其可配置特性。可配置性最終是靠代碼中的條件編譯來(lái)完成的,條件編譯是編程語(yǔ)言的特點(diǎn),并不是eCos的原創(chuàng)。當(dāng)一個(gè)軟件工程中的條件編譯項(xiàng)的數(shù)目和復(fù)雜性達(dá)到一定程度時(shí),其中有一些條件編譯項(xiàng)就會(huì)因?yàn)榇嬖谶壿嬌系囊蕾囮P(guān)系而使條件編譯產(chǎn)生沖突。而如何發(fā)現(xiàn)并有效解決這種沖突才是eCos可配置性的特點(diǎn),如圖2所示,其可配置特性的實(shí)現(xiàn)主要由組件定義語(yǔ)言CDL(Component Definition Language)、組件倉(cāng)庫(kù)ecos.db、圖形配置工具configtool三者共同完成。
(1)??組件定義語(yǔ)言CDL
CDL是eCos組件框架中的一個(gè)關(guān)鍵部分,eCos所有模塊的程序包中都包含一個(gè)CDL腳本對(duì)該包進(jìn)行描述并提供配置選項(xiàng)。以本系統(tǒng)中的串口驅(qū)動(dòng)程序包為例,在該包對(duì)應(yīng)的CDL中定義了一個(gè)名為CYGPKG_IO_SERIAL_ARM_AT91的cdl_package。在這個(gè)cdl_package中詳細(xì)列出了該包的一些屬性,如該包必須在工程已經(jīng)包含了硬件抽象層包CYGPKG_HAL_ARM_AT91和上層串口I/O包CYGPKG_IO_SERIAL的情況下才會(huì)被使能。另外,串口的一些常用特性,如波特率、設(shè)備名、緩沖區(qū)大小等配置選項(xiàng)也是必不可少的。在一些復(fù)雜的CDL中還會(huì)包含對(duì)該包中的源程序進(jìn)行編譯時(shí)的一些編譯選項(xiàng)。在進(jìn)行配置的時(shí)候,該包還會(huì)產(chǎn)生一個(gè)包含了各個(gè)可配置參數(shù)數(shù)值的頭文件。當(dāng)其他包使用由CYGPKG_IO_SERIAL_ARM_AT91包提供的可配置參數(shù)時(shí),這個(gè)新產(chǎn)生的頭文件就會(huì)被相關(guān)的源文件通過(guò)#include語(yǔ)法包含。
(2)? 組件倉(cāng)庫(kù)ecos.db
ecos.db是一個(gè)包含了所有可用程序包和配置模版的文本文件。在該文件中,需要注冊(cè)所有的CDL包。在注冊(cè)時(shí)以package關(guān)鍵字提供相應(yīng)包的名稱、CDL腳本文件的文件路徑以及對(duì)該包的一個(gè)簡(jiǎn)單描述。在ecos.db中還會(huì)以target關(guān)鍵字生成配置模版,從而提供目標(biāo)平臺(tái)的一些基本組成結(jié)構(gòu),使目標(biāo)平臺(tái)包括所需要的已經(jīng)注冊(cè)了的CDL配置包。
(3) 圖形配置工具configtool
configtool是利用MFC編寫(xiě)的Windows程序,是eCos可配置性的執(zhí)行者,也可以理解成是CDL腳本的解釋器。一方面它讀取ecos.db文件中的目標(biāo)平臺(tái)和已注冊(cè)的配置包信息,根據(jù)配置包的路徑找到相應(yīng)的CDL腳本,然后根據(jù)腳本中給出的屬性向程序員提供圖形化的配置信息;另一方面,它還可以接受用戶的輸入,包括單選按鈕、復(fù)選框、下拉列表、文本輸入等。當(dāng)用戶保存一個(gè)配置時(shí),configtool會(huì)根據(jù)CDL語(yǔ)言的提示生成相應(yīng)的頭文件,也會(huì)將指定的頭文件從配置包中復(fù)制到配置文件所在的工作目錄。無(wú)論是生成的頭文件還是拷貝的頭文件,都會(huì)在編譯時(shí)被源程序所引用。對(duì)于內(nèi)核源程序,configtool又可以理解成編譯器。當(dāng)用戶的配置選項(xiàng)被保存并且對(duì)工程進(jìn)行編譯時(shí),configtool會(huì)在后臺(tái)調(diào)用真正的編譯器GCC,根據(jù)配置包CDL中的編譯選項(xiàng)控制GCC對(duì)所有需要的內(nèi)核源文件進(jìn)行編譯并生成庫(kù)文件和對(duì)應(yīng)的鏈接腳本。當(dāng)然configtool只是對(duì)eCos內(nèi)核進(jìn)行編譯,用戶的應(yīng)用程序只需在編譯時(shí)和由configtool編譯生成的庫(kù)文件進(jìn)行鏈接就可以得到最終的可執(zhí)行映像文件。
2? 系統(tǒng)硬件框架
本系統(tǒng)是一個(gè)以ARM7為核心構(gòu)成的測(cè)控系統(tǒng),通過(guò)對(duì)傳感器的脈沖信號(hào)進(jìn)行處理而得到待測(cè)物料的流量,并通過(guò)控制給料器的給料速度達(dá)到流量控制的目的。對(duì)于一個(gè)有實(shí)用價(jià)值的測(cè)控系統(tǒng),必須具有人機(jī)交互、閉環(huán)控制、數(shù)據(jù)通信和存儲(chǔ)等功能。本課題所研制的流量測(cè)控系統(tǒng)的硬件框圖如圖3所示。
圖3中,處理器為ARM7內(nèi)核的工業(yè)級(jí)芯片AT91M55800,其強(qiáng)大的功能保證了系統(tǒng)的實(shí)時(shí)性和穩(wěn)定性的要求。2 MB的Flash SST39VF160用來(lái)保存程序代碼、測(cè)量所需的一些參數(shù)以及測(cè)量結(jié)果的簡(jiǎn)單統(tǒng)計(jì)信息。在工業(yè)生產(chǎn)中,經(jīng)常需要對(duì)一次測(cè)量中的數(shù)據(jù)進(jìn)行歷史再現(xiàn),以便對(duì)一些事故或故障進(jìn)行排查。本系統(tǒng)通過(guò)采用1 MB的大容量RAM來(lái)實(shí)現(xiàn)這一功能:除了用來(lái)作為程序運(yùn)行時(shí)的內(nèi)存外,RAM還用來(lái)實(shí)時(shí)保存每一時(shí)刻的測(cè)量數(shù)據(jù)。USB總線的通信口用來(lái)和現(xiàn)場(chǎng)計(jì)算機(jī)進(jìn)行通信,以實(shí)現(xiàn)一些更加完善的處理,如數(shù)據(jù)打印、結(jié)果分析、實(shí)時(shí)數(shù)據(jù)的硬盤(pán)保存等。分辨率為320×240的LCD用來(lái)作為系統(tǒng)的顯示終端配合4×5的鍵盤(pán)來(lái)完成系統(tǒng)的人機(jī)交互操作。對(duì)變頻器的控制和對(duì)溫度信號(hào)的采集通過(guò)485總線完成。6路脈沖信號(hào)是本系統(tǒng)測(cè)量功能的核心,通過(guò)對(duì)這6路脈沖進(jìn)行處理可以得到流量相關(guān)的所有信息。4~20 mA電流信號(hào)用來(lái)控制給料系統(tǒng),以實(shí)現(xiàn)閉環(huán)控制。由于在工業(yè)環(huán)境中使用,對(duì)于一些長(zhǎng)線連接必須采取隔離措施。本系統(tǒng)對(duì)測(cè)量脈沖、485通信信號(hào)和4~20 mA電流信號(hào)都采取了光電隔離措施。
3? eCos在系統(tǒng)上的移植與應(yīng)用軟件編寫(xiě)
3.1? eCos內(nèi)核的移植
由于eCos內(nèi)核采用了可配置的模塊化設(shè)計(jì)思想,因此只要修改硬件抽象層HAL的代碼和CDL腳本并且在ecos.db中注冊(cè)就可以應(yīng)用于新的目標(biāo)系統(tǒng)。HAL又可以細(xì)分為3個(gè)層次: ①? 體系結(jié)構(gòu)抽象層。eCos是可以應(yīng)用于多種體系結(jié)構(gòu)平臺(tái)上的操作系統(tǒng),如ARM、MIPS、POWERPC等,在eCos發(fā)布時(shí)已經(jīng)將這些體系結(jié)構(gòu)層的移植包一同發(fā)布了出來(lái)。本系統(tǒng)的體系結(jié)構(gòu)抽象層是ARM7體系結(jié)構(gòu)抽象層。②? 變體抽象層。對(duì)于同一種體系結(jié)構(gòu)的處理器,各生產(chǎn)廠家會(huì)有不同的系列和型號(hào)(如Atmel的AT91系列、Philips的LPC系列等),雖然它們都采用ARM7體系結(jié)構(gòu),但是不同的寄存器配置模式和中斷處理方法也會(huì)影響到eCos的移植。本系統(tǒng)所使用的處理器AT91M55800使用較為普遍,在eCos開(kāi)源社區(qū)已經(jīng)有移植好的AT91M55800變體抽象層的代碼和CDL腳本,只需作系統(tǒng)啟動(dòng)后對(duì)I/O口的賦值情況等少許的改動(dòng)即可完成對(duì)變體抽象層的移植。③? 平臺(tái)抽象層。平臺(tái)抽象層是對(duì)目標(biāo)系統(tǒng)的整個(gè)硬件平臺(tái)進(jìn)行抽象,包括平臺(tái)的啟動(dòng)、芯片配置、定時(shí)、I/O寄存器及中斷寄存等等。
系統(tǒng)需要進(jìn)行的移植工作主要是平臺(tái)抽象層的移植,而平臺(tái)抽象層中最重要的是Flash驅(qū)動(dòng)包和內(nèi)存布局文件的移植。主要的步驟為:
①? 安裝AT91M55800變體抽象層包。從eCos開(kāi)源社區(qū)下載好的變體抽象層包在一個(gè)名為eb55的文件夾中,在這個(gè)文件夾中還有cdl、include、src等子文件夾分別包含了CDL腳本、頭文件,源文件。由于eCos的軟件包有嚴(yán)格的層次結(jié)構(gòu),所以在安裝軟件包時(shí)應(yīng)遵循這一結(jié)構(gòu)以便于維護(hù)。AT91M55800屬于ARM7的一個(gè)變體,同AT91系列的其他CPU處于同一層次,所以變體抽象層軟件包文件夾eb55的具體路徑應(yīng)為/hal/arm/at91/eb55。接下來(lái)還應(yīng)在ecos.db中注冊(cè)變體抽象層包,以package關(guān)鍵字注冊(cè)名為CYGPKG_HAL_ARM_AT91_EB55的包,這個(gè)名字必須和包中CDL文件hal_arm_at91_eb55.cdl中的所定義的包名完全一致。在包名后面的花括號(hào)中登記hal_arm_at91_eb55.cdl文件的路徑及文件名,以及對(duì)該包的簡(jiǎn)單文字說(shuō)明。
②? 編寫(xiě)Flash的底層驅(qū)動(dòng)軟件包,以便能夠操作目標(biāo)系統(tǒng)的Flash存儲(chǔ)器。由于本系統(tǒng)在前期調(diào)試和代碼固化時(shí)利用了RedBoot,而RedBoot通過(guò)Flash驅(qū)動(dòng)程序操作目標(biāo)Flash,所以必須先移植好Flash驅(qū)動(dòng)程序才能進(jìn)行更進(jìn)一步的開(kāi)發(fā)工作。
首先需要編寫(xiě)底層驅(qū)動(dòng)程序源文件。不同的Flash的塊空間大小以及寫(xiě)操作一般是不一樣的。本系統(tǒng)所用的Flash SST39VF160是2 MB的16位NOR Flash,共有512(0x200)個(gè)塊空間,其塊大小為4K(0x1000),寫(xiě)操作的命令碼符合JEDEC標(biāo)準(zhǔn)。這些特點(diǎn)與Atmel公司AT49系列Flash比較類似,因此Flash驅(qū)動(dòng)程序可以從eCos發(fā)布時(shí)自帶的AT49系列Flash的驅(qū)動(dòng)程序修改得到。最重要的地方是修改描述Flash特性的結(jié)構(gòu)體flash_dev_info_t變量中成員block_size和block_count的值,使其分別為0x1000和0x200。
接下來(lái)需要編寫(xiě)與Flash底層驅(qū)動(dòng)對(duì)應(yīng)CDL腳本,使配置工具configtool能夠正確配置編譯Flash驅(qū)動(dòng)程序。這個(gè)CDL文件完全可以參照AT49驅(qū)動(dòng)包中的CDL文件編寫(xiě)。以cdl_package關(guān)鍵字定義名為CYGPKG_DEVS_Flash_SST_39VF160的包,在命令體中給出具體的配置參數(shù)。由于底層驅(qū)動(dòng)包必須結(jié)合上層驅(qū)動(dòng)才能工作,所以在命令體中用active_if CYGPKG_IO_Flash命令告訴configtool,必須在上層驅(qū)動(dòng)包CYGPKG_IO_Flash已經(jīng)被包含的情況下底層驅(qū)動(dòng)包才會(huì)使能。
最后,需要在ecos.db中注冊(cè)底層驅(qū)動(dòng)軟件包。具體做法和變體抽象層包的注冊(cè)方法相同。
③? 修改內(nèi)存布局文件,使configtool能夠正確定位程序在系統(tǒng)存儲(chǔ)器中的位置。eCos提供3種不同的運(yùn)行方式,即ROM方式、RAM方式、ROMRAM方式。每種模式都有兩個(gè)相應(yīng)的布局文件,如RAM方式的mlt_arm_at91_eb55_ram.ldi和mlt_arm_at91_eb55_ram.h。*.ldi和常見(jiàn)的ARM開(kāi)發(fā)環(huán)境ADS中scattered鏈接方式下的*.scf文件的作用類似,即用來(lái)對(duì)不同段分別指定不同的鏈接地址。在*.ldi中需要修改MEMORY和SECTIONS兩部分。對(duì)于代碼在RAM中運(yùn)行的內(nèi)核及應(yīng)用程序,需要根據(jù)系統(tǒng)RAM的實(shí)際情況修改內(nèi)存布局文件中相關(guān)參數(shù)的值。本系統(tǒng)具有1? MB的RAM,但有一半用來(lái)存放測(cè)量數(shù)據(jù),根據(jù)系統(tǒng)實(shí)際的硬件情況,其起始地址為0x02000000,大小為0x80000,所以這個(gè)內(nèi)存塊定義為ram: ORIGIN=0x02000000, LENGTH=0x80000。處理器內(nèi)部集成了8 KB SRAM,其起始地址為0,大小為0x2000,所以這個(gè)內(nèi)存塊定義為sram: ORIGIN=0x00000000,LENGTH=0x2000。這樣系統(tǒng)的MEMORY部分就由名為ram和sram的兩個(gè)內(nèi)存塊構(gòu)成。系統(tǒng)比較重要的兩處SECTIONS部分的修改為SECTION_fixed_vectors (sram, 0x20, LMA_EQ_VMA) 和SECTION_rom_vectors (ram, 0x02008000, LMA_EQ_VMA),第一處表示fixed_vectors段分配在從0x20開(kāi)始的sram中,且LMA_EQ_VMA指定其加載地址等于虛擬地址。由于RedBoot運(yùn)行時(shí)需要占用從0x02000000開(kāi)始的一定空間的RAM,所以第二處使程序代碼從0x02008000開(kāi)始的ram中運(yùn)行。*.ldi文件修改完畢后需要相應(yīng)地修改*.h文件中的宏,如#define CYGMEM_REGION_ram? (0x02000000)。
④? 在組件倉(cāng)庫(kù)ecos.db中為以關(guān)鍵字target添加名為Flow55的新目標(biāo)平臺(tái)。在這個(gè)目標(biāo)平臺(tái)中還必須用關(guān)鍵字packages包括ARM7體系結(jié)構(gòu)層包和AT91M55800變體抽象層包,同時(shí)為了實(shí)現(xiàn)調(diào)試還必須包括串口驅(qū)動(dòng)包和Flash驅(qū)動(dòng)包及其上層驅(qū)動(dòng)包。除了這些被包含的軟件包外,根據(jù)不同的選擇configtool還會(huì)為目標(biāo)平臺(tái)包添加一些默認(rèn)的包,如內(nèi)核包、數(shù)學(xué)庫(kù)包等。另外,還應(yīng)加入一些對(duì)該平臺(tái)的簡(jiǎn)單描述。
3.2? 內(nèi)核的配置
移植完成以后,一個(gè)最基本的目標(biāo)平臺(tái)就產(chǎn)生了。在configtool中可以看到Templates菜單的硬件平臺(tái)列表中新增了Flow55目標(biāo)平臺(tái)模版,以default方式打開(kāi)這個(gè)模版。各個(gè)軟件包的CDL腳本中都給出了默認(rèn)的配置值,有些值需要根據(jù)具體的應(yīng)用要求重新配置。本系統(tǒng)一些重要的配置情況如下:
①? 由于系統(tǒng)線程數(shù)量較少(小于10),所以選擇效率更高的位圖調(diào)度器Bitmap scheduler,并將線程數(shù)numbers of priority levels限定為16,以提高任務(wù)切換的速度。當(dāng)點(diǎn)擊位圖調(diào)度器的單選按鈕時(shí),configtool會(huì)檢測(cè)到一個(gè)配置沖突。由于時(shí)間片輪轉(zhuǎn)是默認(rèn)使能的,而時(shí)間片輪轉(zhuǎn)僅僅對(duì)應(yīng)于多級(jí)隊(duì)列調(diào)度器,所以出現(xiàn)配置沖突。Configtool會(huì)給出一個(gè)推薦的解決沖突的方法,即禁止時(shí)間片輪轉(zhuǎn),按照這個(gè)推薦的解決方法可以安全地解決這個(gè)沖突。這個(gè)地方可以充分體現(xiàn)出eCos強(qiáng)大的可配置性。
②? 由于配合RedBoot一起使用,所以內(nèi)核配置為RAM啟動(dòng)方式。這樣,系統(tǒng)上電后程序?qū)⒂蒖edBoot復(fù)制到RAM中運(yùn)行,以提高速度。
③? 系統(tǒng)的晶振頻率為16 MHz,經(jīng)PLL倍頻后為32 MHz,所以需將Clock speed配置為32000000;RTC是系統(tǒng)的時(shí)鐘節(jié)拍發(fā)生器,本系統(tǒng)的時(shí)鐘節(jié)拍時(shí)間選為20 ms,所以也需要對(duì)RTC相關(guān)項(xiàng)進(jìn)行配置。具體參數(shù)為Real?time clock numerator配置為2000000000,Real?time clock denominator配置為100,Real?time clock period配置為20000。
其余的配置選項(xiàng)使用默認(rèn)的配置值即可。完成配置工作后,對(duì)內(nèi)核進(jìn)行編譯可以產(chǎn)生內(nèi)核庫(kù)文件和鏈接腳本以及相關(guān)頭文件。這些生成的文件再同應(yīng)用程序一起編譯、鏈接,生成最終的可執(zhí)行映像文件。
3.3? 基于eCos操作系統(tǒng)的應(yīng)用軟件的編寫(xiě)
eCos是一個(gè)單進(jìn)程多線程的操作系統(tǒng),多個(gè)線程在宏觀上可以認(rèn)為是并發(fā)運(yùn)行的,而且各線程之間耦合低,便于軟件的編寫(xiě)和維護(hù)。針對(duì)這一特點(diǎn),本系統(tǒng)的軟件結(jié)構(gòu)如圖4所示。
本系統(tǒng)主要有兩種程序運(yùn)行方式,分別稱為方式A和方式B。方式A中,硬件中斷產(chǎn)生后,相應(yīng)的ISR(Interrupt Service Routine)程序運(yùn)行,由于ISR中是禁止中斷的,所以在ISR中只進(jìn)行最簡(jiǎn)單的操作,ISR退出后內(nèi)核調(diào)用相應(yīng)的DSR(Deferred Service Routine)。DSR中中斷是使能的,所以可以進(jìn)行一些稍復(fù)雜的處理,如簡(jiǎn)單的數(shù)據(jù)運(yùn)算、內(nèi)核調(diào)用(發(fā)送信號(hào)量和郵箱等)。在得到相應(yīng)的信號(hào)量或消息郵箱后,相應(yīng)的線程進(jìn)入就緒態(tài)被內(nèi)核調(diào)度運(yùn)行。本系統(tǒng)中對(duì)鍵盤(pán)的處理就是基于這種方式——按鍵產(chǎn)生硬件中斷、ISR執(zhí)行,接著在DSR中進(jìn)行相應(yīng)的運(yùn)算得到具體的鍵值后以消息郵箱的方式通知并喚醒鍵盤(pán)處理線程,鍵盤(pán)處理線程在完成任務(wù)后進(jìn)入休眠直到再次有按鍵發(fā)生而被喚醒。方式B中,各線程只是周期性地被內(nèi)核調(diào)度運(yùn)行,如測(cè)量數(shù)據(jù)顯示線程,在顯示一次數(shù)據(jù)后調(diào)用延時(shí)函數(shù)進(jìn)入休眠,直到延時(shí)完畢后再次進(jìn)入就緒態(tài)被內(nèi)核調(diào)用。
根據(jù)測(cè)控系統(tǒng)的實(shí)際情況,具體的線程編寫(xiě)如下: 方式A為流量計(jì)算線程、溫度測(cè)量線程、鍵盤(pán)處理線程、USB通信處理線程。方式B為測(cè)量數(shù)據(jù)顯示和曲線繪制線程、流量控制線程、初始標(biāo)定線程。
4? 結(jié)論
經(jīng)過(guò)實(shí)踐,本系統(tǒng)運(yùn)行穩(wěn)定,實(shí)時(shí)性能良好。由于eCos的強(qiáng)大可配置性使得系統(tǒng)的軟硬件可維護(hù)性強(qiáng),在進(jìn)行硬件改動(dòng)或應(yīng)用要求改動(dòng)后可方便地進(jìn)行升級(jí)。
評(píng)論
查看更多