ecos(redboot)移植剖析
生活随笔
收集整理的這篇文章主要介紹了
ecos(redboot)移植剖析
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
說(shuō)明:雖然是轉(zhuǎn)載但已找不到原作的地址,也經(jīng)過(guò)了我的一些加工修改。
ecos(redboot)移植剖析
(redboot)移植
不同平臺(tái)之間的移植(CPU相同,硬件平臺(tái)不同)
mypath是ecos的安裝目錄,mypath/ecos/package/ecos.db記錄了現(xiàn)有的包(package)和目標(biāo)板(target)描述。一個(gè)target包含若干的package,target的描述會(huì)出現(xiàn)在configtool的templete的選項(xiàng)里。Target里同時(shí)指定了包含的package。照貓畫(huà)虎的添加上自己的package和target后就可以在configtool的templete里看到。
Ecos的軟件分了若干的模塊,移植工作主要在他的hal層進(jìn)行(包含在package/hal路徑下),所謂hal(硬件抽象層)就是把和硬件相關(guān)的軟件湊到一起,因?yàn)槠渌蟛糠执a使用C和C++,和硬件都是無(wú)關(guān)的,所以主要研究這一部分代碼就可以進(jìn)行移植,實(shí)際工作更加簡(jiǎn)單,因?yàn)閑cos的HAL還分了幾層,Common HAL, Architecture HAL,Variant HAL,Platform HAL,這幾個(gè)層次同樣可以在軟件結(jié)構(gòu)上找到對(duì)應(yīng)關(guān)系,以三星的snds平臺(tái)為例,首先在hal路徑下可以看到common目錄,/hal/arm/arch/目錄,以及/hal/arm/snds/目錄。這和上面的幾層基本是對(duì)應(yīng)的,當(dāng)然這里這里面可以認(rèn)為Variant HAL,Platform HAL合并了,值得注意的是以上每個(gè)目錄下的cdl目錄下的cdl文件,打開(kāi)configtool,在build->templete中選擇samsung snds平臺(tái)和redboot包后,可以看到出現(xiàn)相應(yīng)的選項(xiàng),其中有一個(gè)eCOS Hal選項(xiàng),該選項(xiàng)展開(kāi)以后有ARM architecture,再展開(kāi)以后還有Samsung SNDS evaluation board 選項(xiàng),展開(kāi)后同樣有諸多選項(xiàng),分別打開(kāi)以上目錄中的cdl文件,和這些選項(xiàng)對(duì)照,發(fā)現(xiàn)每一層的選項(xiàng)和每一層的CDL文件中的描述一一對(duì)應(yīng)(雖然不知道CDL文件的語(yǔ)法,但對(duì)應(yīng)關(guān)
系還是很清晰)。可以說(shuō)每一層之間相同的軟件模塊都有很大的借鑒,(一般可以直接COPY,然后根據(jù)不同之處作相應(yīng)的改動(dòng)即可)。對(duì)于現(xiàn)代的CPU,因?yàn)槭茿RM體系的,所以位置和arm下其他cpu模塊是并列的,同時(shí)可以大量借鑒。
另一個(gè)問(wèn)題是configtool中的選項(xiàng)如何在代碼中實(shí)現(xiàn),其實(shí)研究一下可以發(fā)現(xiàn)大部分選項(xiàng)對(duì)應(yīng)一個(gè)宏定義,而選項(xiàng)的值將被用作代替這個(gè)宏,當(dāng)然選項(xiàng)中還有對(duì)一些文件的選擇,將在編譯鏈接的時(shí)候用到。通過(guò)配置文件配置完畢后,會(huì)被要求保存ecc文件,同時(shí)會(huì)在該目錄下生成一個(gè)build目錄和install目錄,build目錄存放編譯的目標(biāo)文件,這時(shí)再看hal目錄,發(fā)現(xiàn)每一層只剩下和自己平臺(tái)相關(guān)的文件了。Install目錄下存放了生成的各種格式的可執(zhí)行的文件和編譯鏈接所需要的庫(kù)文件和頭文件。
對(duì)于需要修改和研究的文件,在ecos的文檔中有一個(gè)相應(yīng)的列表,因?yàn)楝F(xiàn)代CPU是ARM核,所以對(duì)以下文件研究即可。
Variant HALSome 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 Descriptioninclude/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 HALExtras files may be added for platform specific serial drivers. Extra files for handling interrupts and exceptions will be present if it makes sense.
File Descriptioninclude/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.csrc/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多個(gè)文件有一些也是不需要的,反正基本結(jié)構(gòu)了解了以后,心理就能踏實(shí)一點(diǎn)了,呵呵。
另外,看文檔的過(guò)程中順便看了看ecos的特性,應(yīng)該說(shuō)還是很不錯(cuò),文件系統(tǒng),協(xié)議棧都很全,還支持SMP,同樣是實(shí)時(shí),并且源代碼開(kāi)放,免費(fèi)。比起那個(gè)ucos是強(qiáng)大多了,唯一缺陷是移植和使用復(fù)雜一點(diǎn)(但可移植性絕對(duì)強(qiáng)),而且國(guó)內(nèi)介紹的書(shū)籍也不多,實(shí)在是可惜。希望借著這次機(jī)會(huì)能有所推廣。前面只是基本的剖析,有興趣的還是應(yīng)該多看文檔,多分析,后面會(huì)把看代碼中的心得貼出大家共同學(xué)習(xí)。
redboot和自己的bootloader可以并行,“實(shí)際上hal_platform_setup.h中實(shí)現(xiàn)了平臺(tái)的基本初始化”,是通過(guò)PLATFORM_SETUP1這個(gè)宏實(shí)現(xiàn)的。
如果沒(méi)有硬件板子,可以先簡(jiǎn)單做一個(gè)軟件仿真,應(yīng)用ADW調(diào)試工具,在option選項(xiàng)中選擇configure----ARMulate-----configure,在其中設(shè)置必要的微處理器內(nèi)核,和一些其他選項(xiàng),[適應(yīng)你的cpu] 就可以仿真了。?[我的程序是在SDT環(huán)境下做的]ARMulate,是arm公司提供的軟件仿真調(diào)試代理。在清華那本《ARM體系結(jié)構(gòu)與編程》中有介紹。
再說(shuō)一下Redboot,雖然現(xiàn)代可能已經(jīng)移植好了,但是我們的目的是學(xué)習(xí)嘛,所以我就把我針對(duì)s344b0x01移植時(shí)的相關(guān)代碼和步驟說(shuō)一下,讓大家批評(píng)指正。首先:改動(dòng)ecos.db增加我的packages和targetpackage CYGPKG_HAL_ARM_HLAS {alias { "Dongsin HLAS" hal_arm_hlas arm_hlas_hal}directory hal/arm/hlasscript hal_arm_hlas.cdlhardwaredescription "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_ARMCYGPKG_HAL_ARM_HLAS}enable { CYGHWR_HAL_ARM_LITTLEENDIAN}description "The hlas target provides the packages needed to run eCos on aDongsin HLAS eval board." ? ?}然后,修改我的packages CYGPKG_HAL_ARM_HLAS.CDL 大部分可以參考模板。三、 定義I/O moacos 在做這部分工作時(shí)一定要有耐性,定義要按照模板進(jìn)行 這塊做的好會(huì)給以后的編程帶來(lái)方便。四、 編寫基本的串口驅(qū)動(dòng)了,
啊! 還有點(diǎn)事,不說(shuō)了,講的不好有用則看。
一直推薦研究這個(gè)bootloader是因?yàn)閑cos的可移植性方面的工作和提供的工具是其他開(kāi)發(fā)源碼bootloader無(wú)法相比的,希望能總結(jié)出新平臺(tái)的移植細(xì)節(jié),從而使大家在其他平臺(tái)上也可以迅速移植并使用。雖然源代碼有了,有些東西還是應(yīng)該分析清楚,以配合硬件組連調(diào)。
ecos(redboot)移植剖析
(redboot)移植
不同平臺(tái)之間的移植(CPU相同,硬件平臺(tái)不同)
mypath是ecos的安裝目錄,mypath/ecos/package/ecos.db記錄了現(xiàn)有的包(package)和目標(biāo)板(target)描述。一個(gè)target包含若干的package,target的描述會(huì)出現(xiàn)在configtool的templete的選項(xiàng)里。Target里同時(shí)指定了包含的package。照貓畫(huà)虎的添加上自己的package和target后就可以在configtool的templete里看到。
Ecos的軟件分了若干的模塊,移植工作主要在他的hal層進(jìn)行(包含在package/hal路徑下),所謂hal(硬件抽象層)就是把和硬件相關(guān)的軟件湊到一起,因?yàn)槠渌蟛糠执a使用C和C++,和硬件都是無(wú)關(guān)的,所以主要研究這一部分代碼就可以進(jìn)行移植,實(shí)際工作更加簡(jiǎn)單,因?yàn)閑cos的HAL還分了幾層,Common HAL, Architecture HAL,Variant HAL,Platform HAL,這幾個(gè)層次同樣可以在軟件結(jié)構(gòu)上找到對(duì)應(yīng)關(guān)系,以三星的snds平臺(tái)為例,首先在hal路徑下可以看到common目錄,/hal/arm/arch/目錄,以及/hal/arm/snds/目錄。這和上面的幾層基本是對(duì)應(yīng)的,當(dāng)然這里這里面可以認(rèn)為Variant HAL,Platform HAL合并了,值得注意的是以上每個(gè)目錄下的cdl目錄下的cdl文件,打開(kāi)configtool,在build->templete中選擇samsung snds平臺(tái)和redboot包后,可以看到出現(xiàn)相應(yīng)的選項(xiàng),其中有一個(gè)eCOS Hal選項(xiàng),該選項(xiàng)展開(kāi)以后有ARM architecture,再展開(kāi)以后還有Samsung SNDS evaluation board 選項(xiàng),展開(kāi)后同樣有諸多選項(xiàng),分別打開(kāi)以上目錄中的cdl文件,和這些選項(xiàng)對(duì)照,發(fā)現(xiàn)每一層的選項(xiàng)和每一層的CDL文件中的描述一一對(duì)應(yīng)(雖然不知道CDL文件的語(yǔ)法,但對(duì)應(yīng)關(guān)
系還是很清晰)。可以說(shuō)每一層之間相同的軟件模塊都有很大的借鑒,(一般可以直接COPY,然后根據(jù)不同之處作相應(yīng)的改動(dòng)即可)。對(duì)于現(xiàn)代的CPU,因?yàn)槭茿RM體系的,所以位置和arm下其他cpu模塊是并列的,同時(shí)可以大量借鑒。
另一個(gè)問(wèn)題是configtool中的選項(xiàng)如何在代碼中實(shí)現(xiàn),其實(shí)研究一下可以發(fā)現(xiàn)大部分選項(xiàng)對(duì)應(yīng)一個(gè)宏定義,而選項(xiàng)的值將被用作代替這個(gè)宏,當(dāng)然選項(xiàng)中還有對(duì)一些文件的選擇,將在編譯鏈接的時(shí)候用到。通過(guò)配置文件配置完畢后,會(huì)被要求保存ecc文件,同時(shí)會(huì)在該目錄下生成一個(gè)build目錄和install目錄,build目錄存放編譯的目標(biāo)文件,這時(shí)再看hal目錄,發(fā)現(xiàn)每一層只剩下和自己平臺(tái)相關(guān)的文件了。Install目錄下存放了生成的各種格式的可執(zhí)行的文件和編譯鏈接所需要的庫(kù)文件和頭文件。
對(duì)于需要修改和研究的文件,在ecos的文檔中有一個(gè)相應(yīng)的列表,因?yàn)楝F(xiàn)代CPU是ARM核,所以對(duì)以下文件研究即可。
Variant HALSome 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 Descriptioninclude/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 HALExtras files may be added for platform specific serial drivers. Extra files for handling interrupts and exceptions will be present if it makes sense.
File Descriptioninclude/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.csrc/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多個(gè)文件有一些也是不需要的,反正基本結(jié)構(gòu)了解了以后,心理就能踏實(shí)一點(diǎn)了,呵呵。
另外,看文檔的過(guò)程中順便看了看ecos的特性,應(yīng)該說(shuō)還是很不錯(cuò),文件系統(tǒng),協(xié)議棧都很全,還支持SMP,同樣是實(shí)時(shí),并且源代碼開(kāi)放,免費(fèi)。比起那個(gè)ucos是強(qiáng)大多了,唯一缺陷是移植和使用復(fù)雜一點(diǎn)(但可移植性絕對(duì)強(qiáng)),而且國(guó)內(nèi)介紹的書(shū)籍也不多,實(shí)在是可惜。希望借著這次機(jī)會(huì)能有所推廣。前面只是基本的剖析,有興趣的還是應(yīng)該多看文檔,多分析,后面會(huì)把看代碼中的心得貼出大家共同學(xué)習(xí)。
redboot和自己的bootloader可以并行,“實(shí)際上hal_platform_setup.h中實(shí)現(xiàn)了平臺(tái)的基本初始化”,是通過(guò)PLATFORM_SETUP1這個(gè)宏實(shí)現(xiàn)的。
如果沒(méi)有硬件板子,可以先簡(jiǎn)單做一個(gè)軟件仿真,應(yīng)用ADW調(diào)試工具,在option選項(xiàng)中選擇configure----ARMulate-----configure,在其中設(shè)置必要的微處理器內(nèi)核,和一些其他選項(xiàng),[適應(yīng)你的cpu] 就可以仿真了。?[我的程序是在SDT環(huán)境下做的]ARMulate,是arm公司提供的軟件仿真調(diào)試代理。在清華那本《ARM體系結(jié)構(gòu)與編程》中有介紹。
再說(shuō)一下Redboot,雖然現(xiàn)代可能已經(jīng)移植好了,但是我們的目的是學(xué)習(xí)嘛,所以我就把我針對(duì)s344b0x01移植時(shí)的相關(guān)代碼和步驟說(shuō)一下,讓大家批評(píng)指正。首先:改動(dòng)ecos.db增加我的packages和targetpackage CYGPKG_HAL_ARM_HLAS {alias { "Dongsin HLAS" hal_arm_hlas arm_hlas_hal}directory hal/arm/hlasscript hal_arm_hlas.cdlhardwaredescription "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_ARMCYGPKG_HAL_ARM_HLAS}enable { CYGHWR_HAL_ARM_LITTLEENDIAN}description "The hlas target provides the packages needed to run eCos on aDongsin HLAS eval board." ? ?}然后,修改我的packages CYGPKG_HAL_ARM_HLAS.CDL 大部分可以參考模板。三、 定義I/O moacos 在做這部分工作時(shí)一定要有耐性,定義要按照模板進(jìn)行 這塊做的好會(huì)給以后的編程帶來(lái)方便。四、 編寫基本的串口驅(qū)動(dòng)了,
啊! 還有點(diǎn)事,不說(shuō)了,講的不好有用則看。
一直推薦研究這個(gè)bootloader是因?yàn)閑cos的可移植性方面的工作和提供的工具是其他開(kāi)發(fā)源碼bootloader無(wú)法相比的,希望能總結(jié)出新平臺(tái)的移植細(xì)節(jié),從而使大家在其他平臺(tái)上也可以迅速移植并使用。雖然源代碼有了,有些東西還是應(yīng)該分析清楚,以配合硬件組連調(diào)。
總結(jié)
以上是生活随笔為你收集整理的ecos(redboot)移植剖析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 刀剑封魔录之上古传说攻略有哪些(《刀剑o
- 下一篇: __FUNCTION__, __FILE