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