新聞中心

EEPW首頁 > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > eCos在基于ARM7硬件平臺上的應(yīng)用

eCos在基于ARM7硬件平臺上的應(yīng)用

作者: 時(shí)間:2008-03-09 來源: 收藏

  摘要 簡單介紹eCos的體系結(jié)構(gòu),詳細(xì)論述eCos的可配置機(jī)制的實(shí)現(xiàn)原理,重點(diǎn)介紹eCos在以AT91M55800為核心的ARM7硬件平臺上的移植步驟,結(jié)合本系統(tǒng)簡要介紹內(nèi)核的配置方法。最后給出了基于eCos應(yīng)用軟件的編寫方法。

本文引用地址:http://2s4d.com/article/79807.htm

  關(guān)鍵詞

  eCos(Embedded Configurable Operating System)最初是由Cygnus Solutions公司為面向嵌入式領(lǐng)域而開發(fā)的源碼公開、具有很強(qiáng)的可移植性和可配置性的,適合于深度嵌入式開發(fā)的實(shí)時(shí)操作系統(tǒng)。現(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è)計(jì),將不同功能的軟件分成不同的組件,使其分別位于系統(tǒng)的不同層次。這種層次結(jié)構(gòu)實(shí)現(xiàn)了eCos的可配置性、可移植性、兼容性和可擴(kuò)展性。圖l是eCos系統(tǒng)的層次結(jié)構(gòu)框圖。硬件抽象層(HAL)使其上層次結(jié)構(gòu)不必關(guān)心具體的硬件結(jié)構(gòu),因此只需對HAL進(jìn)行修改就可以使整個(gè)eCos的應(yīng)用移植到新的硬件平臺上。

  

  內(nèi)核是eCos的一個(gè)核心組件,也是系統(tǒng)的一個(gè)可選組件,一些較為復(fù)雜的應(yīng)用需要內(nèi)核的支持。內(nèi)核提供了多個(gè)可供選擇的調(diào)度算法,可以很好地支持多任務(wù)處理。eCos內(nèi)核提供了一組豐富的同步源語,完全能滿足各種嵌入式應(yīng)用的需求。內(nèi)核還負(fù)責(zé)對中斷和例外進(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è)無內(nèi)核的系統(tǒng)引導(dǎo)程序。是eCos的一個(gè)特殊應(yīng)用。RedBoot可以加載eCos應(yīng)用程序,并提供Debug支持,是開發(fā)eCos系統(tǒng)時(shí)非常有用的工具。設(shè)備驅(qū)動程序負(fù)責(zé)對硬件設(shè)備進(jìn)行控制和管理,并完成設(shè)備數(shù)據(jù)的讀/寫操作。設(shè)備驅(qū)動程序自身也采用層次結(jié)構(gòu),上層驅(qū)動程序(相當(dāng)于一個(gè)虛設(shè)備)可以調(diào)用下層驅(qū)動程序(物理設(shè)備)。驅(qū)動程序?yàn)樯蠈榆浖峁?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的一個(gè)主要特性就是其可配置特性。可配置性最終是靠代碼中的條件編譯來完成的,條件編譯是編程語言的特點(diǎn),并不是eCos的原創(chuàng)。當(dāng)一個(gè)軟件工程中的條件編譯項(xiàng)的數(shù)目和復(fù)雜性達(dá)到一定程度時(shí),其中有一些條件編澤項(xiàng)就會因?yàn)榇嬖谶壿嬌系囊蕾囮P(guān)系而使條件編譯產(chǎn)生沖突。而如何發(fā)現(xiàn)并有效解決這種沖突才是eCos可配置性的特點(diǎn),如圖2所示,其可配置特性的實(shí)現(xiàn)主要由組件定義語言CDL(Component DefinitionLaguage)、組件倉庫ecos.db、圖形配置工具eonfigtool三者共同完成。

  

  (1)組件定義語言CDL

  CDL是eCos組件框架中的一個(gè)關(guān)鍵部分,eCos所有模塊的程序包中都包含一個(gè)CDL腳本對該包進(jìn)行描述并提供配置選項(xiàng)。以本系統(tǒng)中的串口驅(qū)動程序包為例,在該包對應(yīng)的CDL中定義了一個(gè)名為CYGPKG_IO_SERIAL_ARM_AT91的cdl_package。在這個(gè)cdl_package中詳細(xì)列出了該包的一些屬性,如該包必須在工程已經(jīng)包含了硬件抽象層包CYGPKG_HAL_ARM_AT9l和上層串口I/O包CYGPKG_IO_SERIAL的情況下才會被使能。另外,串口的一些常用特性,如波特率、設(shè)備名、緩沖區(qū)大小等配置選項(xiàng)也是必不可少的。在一些復(fù)雜的CDL中還會包含對該包中的源程序進(jìn)行編譯時(shí)的一些編譯選項(xiàng)。在進(jìn)行配置的時(shí)候,該包還會產(chǎn)生一個(gè)包含了各個(gè)可配置參數(shù)數(shù)值的頭文件。當(dāng)其他包使用由CYGPKG_IO_SERIAL_ARMAT9l包提供的可配置參數(shù)時(shí),這個(gè)新產(chǎn)生的頭文件就會被相關(guān)的源文件通過#include語法包含。

  (2)組件倉庫ecos.db

  ecos.db是一個(gè)包含了所有可用程序包和配置模版的文本文件。在該文件中,需要注冊所有的CDL包。在注冊時(shí)以package關(guān)鍵字提供相應(yīng)包的名稱、CDL腳本文件的文件路徑以及對該包的一個(gè)簡單描述。在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)用戶保存一個(gè)配置時(shí),configtool會根據(jù)CDL語言的提示生成相應(yīng)的頭文件,也會將指定的頭文件從配置包中復(fù)制到配置文件所在的工作目錄。無論是生成的頭文件還是拷貝的頭文件,都會在編譯時(shí)被源程序所引用。對于內(nèi)核源程序,configtool又可以理解成編譯器。當(dāng)用戶的配置選項(xiàng)被保存并且對工程進(jìn)行編譯時(shí),configtool會在后臺調(diào)用真正的編譯器GCC,根據(jù)配置包CDL中的編譯選項(xiàng)控制GCC對所有需要的內(nèi)核源文件進(jìn)行編譯并生成庫文件和對應(yīng)的鏈接腳本。當(dāng)然configtool只是對eCos內(nèi)核進(jìn)行編譯,用戶的應(yīng)用程序只需在編譯時(shí)和由configtool編譯生成的庫文件進(jìn)行鏈接就可以得到最終的可執(zhí)行映像文件。

  2 系統(tǒng)硬件框架

  本系統(tǒng)是一個(gè)以ARM7為核心構(gòu)成的測控系統(tǒng),通過對傳感器的脈沖信號進(jìn)行處理而得到待測物料的流量,并通過控制給料器的給料速度達(dá)到流量控制的目的。對于一個(gè)有實(shí)用價(jià)值的測控系統(tǒng),必須具有人機(jī)交互、閉環(huán)控制、數(shù)據(jù)通信和存儲等功能。本課題所研制的流量測控系統(tǒng)的硬件框圖如圖3所示。

  

  圖3中,處理器為ARM7內(nèi)核的工業(yè)級芯片AT91M55800,其強(qiáng)大的功能保證了系統(tǒng)的實(shí)時(shí)性和穩(wěn)定性的要求。2 MB的Flash SST39VFl60用來保存程序代碼、測量所需的一些參數(shù)以及測量結(jié)果的簡單統(tǒng)計(jì)信息。在工業(yè)生產(chǎn)中,經(jīng)常需要對一次測量中的數(shù)據(jù)進(jìn)行歷史再現(xiàn),以便對一些事故或故障進(jìn)行排查。本系統(tǒng)通過采用1MB的大容量RAM來實(shí)現(xiàn)這一功能:除了用來作為程序運(yùn)行時(shí)的內(nèi)存外,RAM還用來實(shí)時(shí)保存每一時(shí)刻的測量數(shù)據(jù)。USB總線的通信口用來和現(xiàn)場計(jì)算機(jī)進(jìn)行通信,以實(shí)現(xiàn)一些更加完善的處理,如數(shù)據(jù)打印、結(jié)果分析、實(shí)時(shí)數(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),以實(shí)現(xiàn)閉環(huán)控制。由于在工業(yè)環(huán)境中使用,對于一些長線連接必須采取隔離措施。本系統(tǒng)對測量脈沖、485通信信號和4~20mA電流信號都采取了光電隔離措施。

  3 eCos在系統(tǒng)上的移植與應(yīng)用軟件編寫

  3.1 eCos內(nèi)核的移植

  由于eCos內(nèi)核采用了可配置的模塊化設(shè)計(jì)思想,因此只要修改硬件抽象層HAL的代碼和CDL腳本并且在ecos.db中注冊就可以應(yīng)用于新的且標(biāo)系統(tǒng)。HAL又可以細(xì)分為3個(gè)層次:①體系結(jié)構(gòu)抽象層。eCos是可以應(yīng)用于多種體系結(jié)構(gòu)平臺上的操作系統(tǒng),如ARM、MIPS、POWERPC等,在eCos發(fā)布時(shí)已經(jīng)將這些體系結(jié)構(gòu)層的移植包一同發(fā)布了出來。本系統(tǒng)的體系結(jié)構(gòu)抽象層是ARM7體系結(jié)構(gòu)抽象層。②變體抽象層。對于同一種體系結(jié)構(gòu)的處理器,各生產(chǎn)廠家會有不同的系列和型號(如Atmel的AT91系列、Philips的LPC系列等),雖然它們都采用ARM?體系結(jié)構(gòu),但是不同的寄存器配置模式和中斷處理方法也會影響到eCos的移植。本系統(tǒng)所使用的處理器AT91M55800使用較為普遍,在eCos開源社區(qū)已經(jīng)有移植好的AT9lM55800變體抽象層的代碼和CDL腳本,只需作系統(tǒng)啟動后對I/O口的賦值情況等少許的改動即可完成對變體抽象層的移植。③平臺抽象層。平臺抽象層是對目標(biāo)系統(tǒng)的整個(gè)硬件平臺進(jìn)行抽象,包括平臺的啟動、芯片配置、定時(shí)、I/O寄存器及中斷寄存等等。

  系統(tǒng)需要進(jìn)行的移植工作主要是平臺抽象層的移植,而平臺抽象層中最重要的是Flash驅(qū)動包和內(nèi)存布局文件的移植。主要的步驟為:

  ①安裝AT91M55800變體抽象層包。從eCos開源社區(qū)下載好的變體抽象層包在一個(gè)名為eb55的文件夾中,在這個(gè)文件夾中還有cdl、include、src等子文件夾分別包含了CDL腳本、頭文件,源文件。由于eCos的軟件包有嚴(yán)格的層次結(jié)構(gòu),所以在安裝軟件包時(shí)應(yīng)遵循這一結(jié)構(gòu)以便于維護(hù)。AT91M55800屬于ARM7的一個(gè)變體,同AT9l系列的其他CPU處于同一層次,所以變體抽象層軟件包文件夾eb55的具體路徑應(yīng)為/hal/arm/at91/eb55。接下來還應(yīng)在ecos.db中注冊變體抽象層包,以package關(guān)鍵字注冊名為CYGPKG_HAL_ARM_AT91_EB55的包,這個(gè)名字必須和包中CDL文件hal_arm_at91_eb55.cdl中的所定義的包名完全一致。在包名后面的花括號中登記hal_arm_at91_eb55.cdl文件的路徑及文件名,以及對該包的簡單文字說明。

 ?、诰帉慒lash的底層驅(qū)動軟件包,以便能夠操作目標(biāo)系統(tǒng)的Flash存儲器。由于本系統(tǒng)在前期調(diào)試和代碼固化時(shí)利用了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)個(gè)塊空間,其塊大小為4K(0x1000),寫操作的命令碼符合JEDEC標(biāo)準(zhǔn)。這些特點(diǎn)與Atmel公司AT49系列Flash比較類似,因此Flash驅(qū)動程序可以從eCos發(fā)布時(shí)自帶的AT49系列Flash的驅(qū)動程序修改得到。最重要的地方是修改描述Flash特性的結(jié)構(gòu)體flash_dev_info_t變量中成員block_size和block_count的值,使其分別為Oxl000和0x200。

  接下來需要編寫與Flash底層驅(qū)動對應(yīng)CDL腳本,使配置工具configtool能夠正確配置編譯Flash驅(qū)動程序。這個(gè)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方式。每種模式都有兩個(gè)相應(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的實(shí)際情況修改內(nèi)存布局文件中相關(guān)參數(shù)的值。本系統(tǒng)具有l(wèi)MB的RAM,但有一半用來存放測量數(shù)據(jù),根據(jù)系統(tǒng)實(shí)際的硬件情況,其起始地址為0x02000000,大小為0x80000,所以這個(gè)內(nèi)存塊定義為ram:ORIGIN=0x02000000,LENGTH=0x80000。處理器內(nèi)部集成了8KB SRAM,其起始地址為0,大小為0x2000,所以這個(gè)內(nèi)存塊定義為sram:ORIGIN=0x00000000,LENGTH=0x2000。這樣系統(tǒng)的MEMO-RY部分就由名為ram和sram的兩個(gè)內(nèi)存塊構(gòu)成。系統(tǒng)比較重要的兩處SECTIONS部分的修改為SECTION_fixd_vectors(sram,0x20,LMA_EQ_VMA)和SEC-TION_rom_vectots(ram,0x02008000,LMA_EQ_VMA),第一處表示fixed_vectors段分配在從0x20開始的sram中,且LMA_EQ_VMA指定其加載地址等于虛擬地址。由于RedBoot運(yùn)行時(shí)需要占用從0x02000000開始的一定空間的RAM,所以第二處使程序代碼從0x02008000開始的ram中運(yùn)行。*.1di文件修改完畢后需要相應(yīng)地修改*.h文件中的宏,如#define CYGMEM_REGION_ram(0x02000000)。

 ?、茉诮M件倉庫ecos.db中為以關(guān)鍵字target添加名為Flowr55的新目標(biāo)平臺。在這個(gè)目標(biāo)平臺中還必須用關(guān)鍵字packages包括ARM7體系結(jié)構(gòu)層包和AT91M55800變體抽象層包,同時(shí)為了實(shí)現(xiàn)調(diào)試還必須包括串口驅(qū)動包和Flash驅(qū)動包及其上層驅(qū)動包。除了這些被包含的軟件包外,根據(jù)不同的選擇configtool還會為目標(biāo)平臺包掭加一些默認(rèn)的包,如內(nèi)核包、數(shù)學(xué)庫包等。另外,還應(yīng)加入一些對該平臺的簡單描述。

  3.2 內(nèi)核的配置

  移植完成以后,一個(gè)最基本的目標(biāo)平臺就產(chǎn)生了。在configtool中可以看到Templatcs菜單的硬件平臺列表中新增了Flow55目標(biāo)平臺模版,以default方式打開這個(gè)模版。各個(gè)軟件包的CDL腳本中都給出了默認(rèn)的配置值,有些值需要根據(jù)具體的應(yīng)用要求重新配置。本系統(tǒng)一些重要的配置情況如下:

 ?、儆捎谙到y(tǒng)線程數(shù)量較少(小于10),所以選擇效率更高的位圖調(diào)度器Bitmap scheduler,并將線程數(shù)numbersof priority levels限定為16,以提高任務(wù)切換的速度。當(dāng)點(diǎn)擊位圖調(diào)度器的單選按鈕時(shí),configtool會檢測到一個(gè)配置沖突。由于時(shí)間片輪轉(zhuǎn)是默認(rèn)使能的,而時(shí)間片輪轉(zhuǎn)僅僅對應(yīng)于多級隊(duì)列調(diào)度器,所以出現(xiàn)配置沖突。Configtool會給出一個(gè)推薦的解決沖突的方法,即禁止時(shí)間片輪轉(zhuǎn),按照這個(gè)推薦的解決方法可以安全地解決這個(gè)沖突。這個(gè)地方可以充分體現(xiàn)出eCos強(qiáng)大的可配置性。

 ?、谟捎谂浜蟁edBoot一起使用,所以內(nèi)核配置為RAM啟動方式。這樣,系統(tǒng)上電后程序?qū)⒂蒖edBoot復(fù)制到RAM中運(yùn)行,以提高速度。

  ③系統(tǒng)的晶振頻率為16 MHz,經(jīng)PLL倍頻后為32MHz,所以需將Clock speed配置為32000000;RTC是系統(tǒng)的時(shí)鐘節(jié)拍發(fā)生器,本系統(tǒng)的時(shí)鐘節(jié)拍時(shí)間選為20ms,所以也需要對RTC相關(guān)項(xiàng)進(jìn)行配置。具體參數(shù)為Real-time clocknumerator配置為2000000000,Real-time clock denormnator配置為100,Real-time clock period配置為20000。

  其余的配置選項(xiàng)使用默認(rèn)的配置值即可。完成配置工作后,對內(nèi)核進(jìn)行編譯可以產(chǎn)生內(nèi)核庫文件和鏈接腳本以及相關(guān)頭文件。這些生成的文件再同應(yīng)用程序一起編譯、鏈接,生成最終的可執(zhí)行映像文件。

  3.3 基于eCos操作系統(tǒng)的應(yīng)用軟件的編寫

  eCos是一個(gè)單進(jìn)程多線程的操作系統(tǒng),多個(gè)線程在宏觀上可以認(rèn)為是并發(fā)運(yùn)行的,而且各線程之間耦合低,便于軟件的編寫和維護(hù)。針對這一特點(diǎn),本系統(tǒng)的軟件結(jié)構(gòu)如圖4所示。

  

  本系統(tǒng)主要有兩種程序運(yùn)行方式,分別稱為方式A和方式B。方式A中,硬件中斷產(chǎn)生后,相應(yīng)的ISR(In-terrupt Service Routine)程序運(yùn)行,由于ISR中是禁止中斷的,所以在ISR中只進(jìn)行最簡單的操作,ISR退出后內(nèi)核調(diào)用相應(yīng)的DSR(Deferred Service Routime)。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í)函數(shù)進(jìn)入休眠,直到延時(shí)完畢后再次進(jìn)入就緒態(tài)被內(nèi)核調(diào)用。

  根據(jù)測控系統(tǒng)的實(shí)際情況,具體的線程編寫如下:方式A為流量計(jì)算線程、溫度測量線程、鍵盤處理線程、USB通信處理線程。方式B為測量數(shù)據(jù)顯示和曲線繪制線程、流量控制線程、初始標(biāo)定線程。

  4 結(jié)論

  經(jīng)過實(shí)踐,本系統(tǒng)運(yùn)行穩(wěn)定,實(shí)時(shí)性能良好。由于eCos的強(qiáng)大可配置性使得系統(tǒng)的軟硬件可維護(hù)性強(qiáng),在進(jìn)行硬件改動或應(yīng)用要求改動后可方便地進(jìn)行升級。

晶振相關(guān)文章:晶振原理


評論


相關(guān)推薦

技術(shù)專區(qū)

關(guān)閉