Chinaunix首页 | 论坛 | 博客
  • 博客访问: 284802
  • 博文数量: 58
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 600
  • 用 户 组: 普通用户
  • 注册时间: 2015-11-27 08:37
个人简介

从linux了解世界

文章分类
文章存档

2017年(5)

2016年(51)

2015年(2)

我的朋友

分类: 嵌入式

2016-03-03 23:00:42

先来看一个问题抛砖引玉(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) |
给主人留下些什么吧!~~