基于eCos在基于ARM7硬件平臺上的應用
3.1 eCos內核的移植
由于eCos內核采用了可配置的模塊化設計思想,因此只要修改硬件抽象層HAL的代碼和CDL腳本并且在ecos.db中注冊就可以應用于新的目標系統(tǒng)。HAL又可以細分為3個層次: ① 體系結構抽象層。eCos是可以應用于多種體系結構平臺上的操作系統(tǒng),如ARM、MIPS、POWERPC等,在eCos發(fā)布時已經將這些體系結構層的移植包一同發(fā)布了出來。本系統(tǒng)的體系結構抽象層是ARM7體系結構抽象層。② 變體抽象層。對于同一種體系結構的處理器,各生產廠家會有不同的系列和型號(如Atmel的AT91系列、Philips的LPC系列等),雖然它們都采用ARM7體系結構,但是不同的寄存器配置模式和中斷處理方法也會影響到eCos的移植。本系統(tǒng)所使用的處理器AT91M55800使用較為普遍,在eCos開源社區(qū)已經有移植好的AT91M55800變體抽象層的代碼和CDL腳本,只需作系統(tǒng)啟動后對I/O口的賦值情況等少許的改動即可完成對變體抽象層的移植。③ 平臺抽象層。平臺抽象層是對目標系統(tǒng)的整個硬件平臺進行抽象,包括平臺的啟動、芯片配置、定時、I/O寄存器及中斷寄存等等。
移植工作主要是平臺抽象層的移植,而平臺抽象層中最重要的是Flash驅動包和內存布局文件的移植。主要的步驟為:
?、?安裝AT91M55800變體抽象層包。從eCos開源社區(qū)下載好的變體抽象層包在一個名為eb55的文件夾中,在這個文件夾中還有cdl、include、src等子文件夾分別包含了CDL腳本、頭文件,源文件。由于eCos的軟件包有嚴格的層次結構,所以在安裝軟件包時應遵循這一結構以便于維護。AT91M55800屬于ARM7的一個變體,同AT91系列的其他CPU處于同一層次,所以變體抽象層軟件包文件夾eb55的具體路徑應為/hal/arm/at91/eb55。接下來還應在ecos.db中注冊變體抽象層包,以package關鍵字注冊名為CYGPKG_HAL_ARM_AT91_EB55的包,這個名字必須和包中CDL文件hal_arm_at91_eb55.cdl中的所定義的包名完全一致。在包名后面的花括號中登記hal_arm_at91_eb55.cdl文件的路徑及文件名,以及對該包的簡單文字說明。
?、?編寫Flash的底層驅動軟件包,以便能夠操作目標系統(tǒng)的Flash存儲器。由于本系統(tǒng)在前期調試和代碼固化時利用了RedBoot,而RedBoot通過Flash驅動程序操作目標Flash,所以必須先移植好Flash驅動程序才能進行更進一步的開發(fā)工作。
首先需要編寫底層驅動程序源文件。不同的Flash的塊空間大小以及寫操作一般是不一樣的。本系統(tǒng)所用的Flash SST39VF160是2 MB的16位NOR Flash,共有512(0x200)個塊空間,其塊大小為4K(0x1000),寫操作的命令碼符合JEDEC標準。這些特點與Atmel公司AT49系列Flash比較類似,因此Flash驅動程序可以從eCos發(fā)布時自帶的AT49系列Flash的驅動程序修改得到。最重要的地方是修改描述Flash特性的結構體flash_dev_info_t變量中成員block_size和block_count的值,使其分別為0x1000和0x200。
接下來需要編寫與Flash底層驅動對應CDL腳本,使配置工具configtool能夠正確配置編譯Flash驅動程序。這個CDL文件完全可以參照AT49驅動包中的CDL文件編寫。以cdl_package關鍵字定義名為CYGPKG_DEVS_Flash_SST_39VF160的包,在命令體中給出具體的配置參數。由于底層驅動包必須結合上層驅動才能工作,所以在命令體中用active_if CYGPKG_IO_Flash命令告訴configtool,必須在上層驅動包CYGPKG_IO_Flash已經被包含的情況下底層驅動包才會使能。
最后,需要在ecos.db中注冊底層驅動軟件包。具體做法和變體抽象層包的注冊方法相同。
?、?修改內存布局文件,使configtool能夠正確定位程序在系統(tǒng)存儲器中的位置。eCos提供3種不同的運行方式,即ROM方式、RAM方式、ROMRAM方式。每種模式都有兩個相應的布局文件,如RAM方式的mlt_arm_at91_eb55_ram.ldi和mlt_arm_at91_eb55_ram.h。*.ldi和常見的ARM開發(fā)環(huán)境ADS中scattered鏈接方式下的*.scf文件的作用類似,即用來對不同段分別指定不同的鏈接地址。在*.ldi中需要修改MEMORY和SECTI*兩部分。對于代碼在RAM中運行的內核及應用程序,需要根據系統(tǒng)RAM的實際情況修改內存布局文件中相關參數的值。本系統(tǒng)具有1 MB的RAM,但有一半用來存放測量數據,根據系統(tǒng)實際的硬件情況,其起始地址為0x02000000,大小為0x80000,所以這個內存塊定義為ram: RIGIN=0x02000000, LENGTH=0x80000。處理器內部集成了8 KB SRAM,其起始地址為0,大小為0x2000,所以這個內存塊定義為sram: RIGIN=0x00000000,LENGTH=0x2000。這樣系統(tǒng)的MEMORY部分就由名為ram和sram的兩個內存塊構成。系統(tǒng)比較重要的兩處SECTI*部分的修改為SECTION_fixed_vectors (sram, 0x20, LMA_EQ_VMA) 和SECTION_rom_vectors (ram, 0x02008000, LMA_EQ_VMA),第一處表示fixed_vectors段分配在從0x20開始的sram中,且LMA_EQ_VMA指定其加載地址等于虛擬地址。由于RedBoot運行時需要占用從0x02000000開始的一定空間的RAM,所以第二處使程序代碼從0x02008000開始的ram中運行。*.ldi文件修改完畢后需要相應地修改*.h文件中的宏,如#define CYGMEM_REGION_ram (0x02000000)。
評論