[Redboot]ecos(redboot)移植剖析

发表于:2008-08-04来源:作者:点击数: 标签:Redbootecosredboot移植剖析
不同平台之间的移植(CPU相同,硬件平台不同) mypath是ecos的安装目录 mypath/ecos/package/ecos.db记录了现有的包(package)和目标板(target)描述. 一个target包含若干的package,target的描述会出现在configtool的templete的选项里。Target里同时指定了包

不同平台之间的移植(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中的选项如何在代码中实现,其实研究一下可以发现大部分选项对应一个宏定义,而选项的值将被用作代替这个宏,当然选项中还有对一些文件的选择,将在编译链接的时候用到。

通过配置文件配置完毕后,会被要求保存eclearcase/" target="_blank" >cc文件,同时会在该目录下生成一个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无法相比的,希望能总结出新平台的移植细节,从而是大家在其他平台上也可以迅速移植并使用。虽然源代码有了,有些东西还是应该分析清楚,以配合硬件组连调。作者:知秋一叶

原文转自:http://www.ltesting.net