新闻中心

EEPW首页 > 嵌入式系统 > 设计应用 > ARM7嵌入式系统中启动程序的实现

ARM7嵌入式系统中启动程序的实现

作者:时间:2013-12-05来源:网络收藏

中生成的匹配表中包含地址映射,存储页大小(1M,64K,或4K)以及是否允许存取等信息。
例如:目标板上的16兆DRAM的物理地址区间为0xc000,0000~0xc07f,ffff和0xc100,0000~0xc17f,ffff;16兆ROM的虚拟地址区间为:0x0000,0000~0x00ff,ffff。匹配表配置如下:

0x0000,00000xc000,0000r/w
0x0010,00000xc010,0000…
0x0020,00000xc020,0000…
…………
0x0070,00000xc070,0000r/w
0x0080,00000xc100,0000…
…………
0x00f0,00000xc170,0000…
0x0100,00000x0000,0000ro
0x0110,00000x0010,0000
0x01f0,00000x00f0,0000
0x0200,00000x0200,0000inaccessable
……………
可以看到左边是连续的虚拟地址空间,右边是不连续的物理地址空间,而且将DRAM映射到了0地址区间。MMU通过虚拟地址和页面表位置信息,按照转换逻辑获得对应物理地址,输出到地址总线上。
应注意到的是使能MMU后,程序继续运行,但是对于程序员来说程序计数器的指针已经改变,指向了ROM所对应的虚拟地址。
⑵目标文件的分布装载分析
首先创建一个文本文件,称为分布装载描述文件。它为应用程序的各部分指定装载区间和执行区间。
举例如下:
FLASH0x010000000x011fffff;2MFLASH
{
FLASH0x01000000
{
boot.o(BOOT,+First)
*(+RO)
}
DRAM0x00000000

{
vector.0(VECTOR,+First)
int_handler.o(+RO)
*(+RW,+ZI)
}
}
在arm链接器的命令行里加入”-scovdescription-file-scf”或”-scatterdescription-file”,编译链接后,将产生一个分布装载文件。
链接器同时产生一组符号,给出每个分布描述文件中命名的区间的长度,装载地址和执行地址。由于链接器和C库都没有将代码从它的装载区间拷贝到执行区间,或创建一个零初始化区域的功能,所以要由应用程序员利用这组符号产生的信息完成这项工作,这是在呼叫C程序之前必须完成的,举例如下:
LDRr0,=|Load$$DRAM$$Base|
LDRr1,=|Image$$DRAM$$Base|
CMPr0,r1检查装载地址和执行地址是否相同
BEQdo_zi_init相同,则不拷贝该区间,初始化零数据区
MOVr2,r1;不相同,将装载区拷贝到执行区
LDRr4,=|Image$$DRAM$$length|
ADDr2,r2,r4
BLcopy
do_zi_init
LDRr1,=|Image$$DRAM$$ZI$$Base|
MOVr2,r1
LDRr4,=|Image$$DRAM$$ZI$$length|
ADDr2,r2,r4
MOVr3,#0
BLzi_init调用零初始化子程序

结语:
本文介绍的已经在以CirrusLogic公司的EP7211和Ateml公司的AT91M40400开发的系统上运行并测试通过。今后可以在这一基础上添加串行通信模块和FLASH操作模块,开发系统监控程序,从而实现应用程序的在线升级。


上一页 1 2 下一页

评论


相关推荐

技术专区

关闭