1. 程式人生 > >ecos(redboot)移植剖析

ecos(redboot)移植剖析

不同平臺之間的移植(CPU相同,硬體平臺不同) mypath是ecos的安裝目錄 mypath/ecos/package/ecos.db記錄了現有的包(package)和目標板(target)描述.

一個target包含若干的package,target的描述會出現在configtool的templete的選項裡。Target裡同時指定了包含的package。照貓畫虎的新增上自己的package和target後就可以在configtool的templete裡看到。

Ecos的軟體分了若干的模組,移植工作主要在他的hal層進行(包含在package/hal路徑下),所謂hal(硬體抽象層)就是把和硬體相關的軟體湊到一起,因為其他大部分程式碼使用C和C++,和硬體都是無關的,所以主要研究這一部分程式碼就可以進行移植,實際工作更加簡單,因為ecos的HAL還分了幾層,Common HAL, Architecture HAL,Variant HAL,Platform HAL,這幾個層次同樣可以在軟體結構上找到對應關係,以三星的snds平臺為例,首先在hal路徑下可以看到common目錄,/hal/arm/arch/目錄,以及/hal/arm/snds/目錄。這和上面的幾層基本是對應的,當然這裡這裡面可以認為Variant HAL,Platform HAL合併了, 值得注意的是以上每個目錄下的cdl目錄下的cdl檔案,開啟configtool,在build->templete中選擇samsung snds平臺和redboot包後,可以看到出現相應的選項,其中有一個eCOSHal選項,該選項展開以後有ARMarchitecture,再展開以後還有SamsungSNDS evaluation board 選項,展開後同樣有諸多選項,分別開啟以上目錄中的cdl檔案,和這些選項對照,發現每一層的選項和每一層的CDL檔案中的描述一一對應(雖然不知道CDL檔案的語法,但對應關係還是很清晰)。可以說每一層之間相同的軟體模組都有很大的借鑑,(一般可以直接COPY,然後根據不同之處作相應的改動即可)。對於現代的CPU,因為是ARM體系的,所以位置和arm下其他cpu模組是並列的,同時可以大量借鑑。

另一個問題是configtool中的選項如何在程式碼中實現,其實研究一下可以發現大部分選項對應一個巨集定義,而選項的值將被用作代替這個巨集,當然選項中還有對一些檔案的選擇,將在編譯連結的時候用到。

通過配置檔案配置完畢後,會被要求儲存ecc檔案,同時會在該目錄下生成一個build目錄和install目錄,build目錄存放最終需要編譯的程式碼,這時再看hal目錄,發現每一層只剩下和自己平臺相關的檔案了。

Install目錄下存放了生成的各種格式的可執行的檔案和編譯連結所需要的庫檔案和標頭檔案。

對於需要修改和研究的檔案,在ecos的文件中有一個相應的列表,因為現代CPU是ARM核,所以對以下檔案研究即可。

Variant HAL
Some variant HALs may add extra files for variant specific serial drivers, or for handling interrupts/exceptions if it makes sense.

Note that these files may be mostly empty if the CPU variant can be controlled by the generic architecture macros. The definitions present are only conditionally defined - if the equivalent platform headers provide the definitions, those override the variant definitions.

File Description
include/var_arch.h Saved register frame format, various thread, register and stack related macros.
include/var_cache.h Cache related macros.
include/var_intr.h Interrupt related macros.
include/var_regs.h Extra register definitions for the CPU variant. include/variant.inc Various assembly macros used during system initialization.
src/var_intr.c Interrupt functions if necessary.
src/var_misc.c hal_variant_init function and any necessary extra functions.
src/variant.S Interrupt handler table definition.
src/<arch>_<variant>.ld Linker macros.

Platform HAL
Extras files may be added for platform specific serial drivers. Extra files for handling interrupts and exceptions will be present if it makes sense.

File Description

include/hal_diag.h Defines functions used for HAL diagnostics output. This would normally be the ROM calling interface wrappers, but may also be the low-level IO functions themselves, saving a little overhead.
include/platform.inc Platform initialization code. This includes memory controller, vectors, and monitor initialization. Depending on the architecture, other things may need defining here as well: interrupt decoding, status register initialization value, etc.
include/plf_cache.h Platform specific cache handling.
include/plf_intr.h Platform specific interrupt handling.
include/plf_io.h PCI IO definitions and macros. May also be used to override generic HAL IO macros if the platform endianness differs from that of the CPU.
include/plf_stub.h Defines stub initializer and board reset details. src/hal_diag.c May contain the low-level device drivers. But these may also reside in plf_stub.c
src/platform.S Memory controller setup macro, and if necessary interrupt springboard code.
src/plf_misc.c Platform initialization code.
src/plf_mk_defs.c Used to export definitions from C header files to assembler header files.
src/plf_stub.c Platform specific stub initialization and possibly the low-level device driver.

以上20多個檔案有一些也是不需要的,反正基本結構瞭解了以後,心理就能踏實一點了,呵呵

另外,看文件的過程中順便看了看ecos的特性,應該說還是很不錯,檔案系統,協議棧都很全,還支援SMP,同樣是實時,並且原始碼開放,免費。比起那個ucos是強大多了,唯一缺陷是移植和使用複雜一點(但可移植性絕對強),而且國內介紹的書籍也不多,實在是可惜。希望藉著這次機會能有所推廣。

前面只是基本的剖析,有興趣的還是應該多看文件,多分析,後面會把看程式碼中的心得貼出大家共同學習。 有一個錯誤糾正一下,build目錄下存放的是編譯的目標檔案,不是原始檔。 redboot和自己的bootloader可以並行,實際上hal_platform_setup.h中實現了平臺的基本初始化,是通過PLATFORM_SETUP1這個巨集實現的。

如果沒有硬體板子,可以先簡單做一個軟體模擬,應用ADW除錯工具,在option選項中選擇configure----ARMulate-----configure,在其中設定必要的微處理器核心,和一些其他選項,[適應你的cpu] 就可以模擬了。[我的程式是在SDT環境下做的]

ARMulate,是arm公司提供的軟體模擬除錯代理。在清華那本《ARM體系結構與程式設計中有介紹〉。

再說一下Redboot,雖然現代可能已經移植好了,但是我們的目的是學習嘛,所以我就把我針對s344b0x01移植時的相關程式碼和步驟說一下,讓大家批評指正。

首先:改動ecos.db增加我的packages和target
package CYGPKG_HAL_ARM_HLAS {
alias { "Dongsin HLAS" hal_arm_hlas arm_hlas_hal}
directory hal/arm/hlas
script hal_arm_hlas.cdl
hardware description " The HLAS HAL package provides the support needed to un eCos on a Dongsin HLAS eval board" }
target hlas {
alias { "Dongsin HLAS" HLAS hlas hlas100}
packages { CYGPKG_HAL_ARM CYGPKG_HAL_ARM_HLAS }
enable { CYGHWR_HAL_ARM_LITTLEENDIAN}
description " The hlas target provides the packages needed to run eCos on a Dongsin HLAS eval board." }
然後,修改我的packages CYGPKG_HAL_ARM_HLAS.CDL 大部分可以參考模板

三、 定義I/O moacos 在做這部分工作時一定要有耐性,定義要按照模板進行 這塊做的好會給以後的程式設計帶來方便。

四、 編寫基本的串列埠驅動了,

一直推薦研究這個bootloader是因為ecos的可移植性方面的工作和提供的工具是其他開發原始碼bootloader無法相比的,希望能總結出新平臺的移植細節,從而是大家在其他平臺上也可以迅速移植並使用。雖然原始碼有了,有些東西還是應該分析清楚,以配合硬體組連調。