基于eCos在基于ARM7硬件平臺(tái)上的應(yīng)用
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á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比較類(lèi)似,因此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)似,即用來(lái)對(duì)不同段分別指定不同的鏈接地址。在*.ldi中需要修改MEMORY和SECTI*兩部分。對(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: RIGIN=0x02000000, LENGTH=0x80000。處理器內(nèi)部集成了8 KB SRAM,其起始地址為0,大小為0x2000,所以這個(gè)內(nèi)存塊定義為sram: RIGIN=0x00000000,LENGTH=0x2000。這樣系統(tǒng)的MEMORY部分就由名為ram和sram的兩個(gè)內(nèi)存塊構(gòu)成。系統(tǒng)比較重要的兩處SECTI*部分的修改為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)。
評(píng)論