先来看一个问题抛砖引玉(mini2440开发板,mdk开发工具):
int haha=0xdeadbeaf;
int main()
{
if(haha==0xdeadbeaf)
执行A
else
执行B
}
加载文件这样写:
LR_ROM1 0x30000000 0x100000 { ;sdram初始地址
SDNOR 0x30000000 {
*.o (RESET, +First)
.ANY (+RO)
}
SDRW 0x31000000 {
.ANY (+RW)
}
SDZI +0 {
.ANY (+ZI)
}
}
当我们把程序烧写到地址0x30000000处的sdram中进行调试,程序执行B。
根本原因:当我们把可执行程序烧写到0x30000000后,让程序从0x30000000开始执行,我们自己写的启动代码中会直接进入main,而使用mdk自带的启动代码则会进入_main中进行程序的搬移,会把在执行程序中的rw段的内容从加载地址搬移到链接地址0x31000000,并把zi段的链接地址中的内容清零。
解决办法:当我们自己写启动代码的话,可以把程序的加载地址和链接地址设为一样的,这样的话,把可执行文件烧到加载地址之后就不需要搬移数据了。或者自己写一段rw段内容的搬移程序。
现在的板子不比二十年前了,ramrom都够大了,尽量不要使用分散加载,都放在一起最好,省的出错
阅读(1750) | 评论(0) | 转发(0) |