3 硬件启动过程
编写硬件启动的初始化过程是HAL移植的一个难点。当硬件重新上电后,系统的程序指针会自动指向地址0(通常地址0存放着bootloader代码段,本例中从外部Flash 0x80000000地址引导)。在eCos操作系统中,程序首先会运行vectors.S文件(该文件存在于hal/arm/arch/src/目录下),它定义了reset_vector、start等各种启动标号。接着调用SmartARM2200平台层的hal_platform_setup. h文件中的宏platform_setupl。
haLplatform_setup.h定义了宏platform_setupl以供vectors.S调用。该宏定义了目标板上SRAM和Flash的初始化启动,其中包括了它们的总线宽度、读写速度、内存大小。然后根据不同的启动方式执行程序。对于RAM启动方式,无需进行程序段与数据段的搬移,系统已认为SRAM的起始地址即为程序的起始地址;对于ROM启动方式,需要拷贝数据段,而程序段无需拷贝。
在程序拷贝完成后,系统会进行其他硬件的初始化过程,包括系统时钟、监控串口等基本硬件设备。
4 内存布局文件编写
平台的内存布局文件在include/pkgconf目录下。通常,每个平台包括了RAM、ROM两种不同启动方式的内存布局文件集。每种启动方式的内存布局文件集都由3个类型的描述文件组成:.h文件包含内存域的C宏定义;.ldi文件定义内存域和内存段位置的链接脚本文件;.mlt文件包括由MLT工具产生的对内存布局的描述。当需要手动修改内存布局时,只有.h和.ldi文件可以被修改,.mlt文件只能由MLT工具生成。
下面以SmartARM2200的RAM启动方式内存布局为例,说明mlt_arm_lpc2xxx_smartarm2200_ram.h和mlt_arm_lpc2xxx_smartarm2200_ram.ldi的程序结构。
由于SmartARM2200的开发板有1个16 KB的内部RAM和1个16 MB的外部SRAM,因而要定义两个内存域ram0和ram。系统设置寄存器在初始化时已经把内存段重新映射,因而两个SRAM的基地址就是 0x40000000和0x81000000,分配方式都是可读写的内存段。
在mlt_arm_lpc2xxx_smartarm2200_ram.ldi中分为两大部分。首先是MEMORY部分,它定义了在RAM启动方式下所需要的内存域,以及该内存域的起始地址和长度。MEMORY部分的内容必须与mlt_arm_lpc2xxx_smartarm2200_ram.h中定义的宏相一致。其次,是SECTIONS部分,它定义了RAM启动方式下所规定的内存段,这些内存段的定义与系统内存管理功能有关。在 SECTION_XXX后带有相应的参数,这些参数包括了内存段所属的内存域、起始地址(或者是对齐方式)、虚拟内存地址(VMA)和加载内存地址 (LMA)。