ARM7在嵌入式应用中启动程序的实现
可以看到左边是连续的虚拟地址空间,右边是不连续的物理地址空间,而且将
DRAM映射到了0地址区间。 MMU通过虚拟地址和页面表位置信息,按照转换逻辑获得对应物理地址,输出到地址总线上。应注意到的是使能
MMU后,程序继续运行,但是对于程序员来说程序计数器的指针已经改变,指向了ROM所对应的虚拟地址。⑵目标文件的分布装载分析
首先创建一个文本文件,称为分布装载描述文件。它为应用程序的各部分指定装载区间和执行区间。
举例如下:
FLASH 0x01000000 0x011fffff ;2M FLASH
{
FLASH 0x01000000
{
boot.o(BOOT
,+First)* (+RO)
}
DRAM 0x00000000
{
vector.0(VECTOR
,+First)int_handler.o (+RO)
* (+RW
,+ZI)
}
}
在ARM链接器的命令行里加入“-scov description-file –scf”或“-scatter description-file”,编译链接后,将产生一个分布装载文件。
链接器同时产生一组符号,给出每个分布描述文件中命名的区间的长度,装载地址和执行地址。由于链接器和C库都没有将代码从它的装载区间拷贝到执行区间,或创建一个零初始化区域的功能,所以要由应用程序员利用这组符号产生的信息完成这项工作,这是在呼叫C程序之前必须完成的,举例如下:
LDR r0, = Load$$DRAM$$Base
LDR r1, = Image$$DRAM$$Base
CMP r0, r1 ;
检查装载地址和执行地址是否相同BEQ do_zi_init ;
相同,则不拷贝该区间,初始化零数据区MOV r2, r1
; 不相同,将装载区拷贝到执行区LDR r4, = Image$$DRAM$$length
ADD r2, r2, r4
BL copy
do_zi_init
LDR r1, = Image$$DRAM$$ZI$$Base
MOV r2, r1
LDR r4, = Image$$DRAM$$ZI$$length
ADD r2, r2, r4
MOV r3, #0
BL zi_init ;
调用零初始化子程序
4.结束语:
本文介绍的启动程序已经在以Cirrus Logic公司的EP7211和Ateml公司的AT91M40400开发的系统上运行并测试通过。今后可以在这一基础上添加串行通信模块和FLASH操作模块,开发系统监控程序,从而实现应用程序的在线升级。
参考资料:
《嵌入式微处理器及其应用开发》 计算机世界第四十三期
姜桥 罗蕾
《面向二十一世纪的嵌入式系统综述》 北京诺浩数字基因研究所
中国单片机公共实验(BOL)
吕京建 肖海桥
《
EP7211数据手册》《
ARM7TDMI数据手册》