SmartARM2200开发板的RedBoot的移植
(3)修改平台抽象层的有关代码
硬件平台层所需编写的代码文件的一般功能如下:include/plf_io.h,I/O定义和系统寄存器的宏定义。include/hal_platform_setup.h,平台启动代码。本文件主要用ARM汇编指令编写,实现平台上电后程序的启动和执行。
src/smartarm2200_misc.C,HAL的底层扩展函数,包括LCD的相关函数及控制台初始化函数。
var/v2_0/include/包括hal_cache.h、hal_diag.h、hal_var_ints.h、lpc2xxx_misc.h、 plf_stub.h、var_arch.h、var_io.h等头文件,定义了标准函数接口及通用I/O和寄存器。
var/v2_0/src/lpc2xxx_misc.C,HAL的底层标准函数,包括时钟平台初始化、时钟延时函数、中断使能、中断屏蔽、中断响应等。
var/v2_O/src/hal_diag.c,硬件抽象层诊断输出函数,包含eCos系统中printf打印的硬件设备驱动程序。
misc/redboot_RAM.ecru,基于RAM启动方式的RedBoot最小配置文件。
misc/redboot_ROM.ecm,基于ROM启动方式的RedBoot最小配置文件。本文引用地址:https://www.eepw.com.cn/article/157884.htm
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)。
评论