3142|5

82

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

问个ADS中有关RO段的问题 [复制链接]

1.是不是在ADS中设置了RO段的起始位置,比如0x30000000,生成的.bin文件就得放入该地址空间才能运行,还是不论在什么内存空间,只要找到程序的入口地址就能运行了
2.2410的bootloader中,RO段设置为0x30100000,烧入flash中,复位后程序从0x0开始运行并把RO、RW搬到0x30100000开始的地址中,最后BL Main跳转,我想问下这个BL Main是怎么寻址到内存中的main函数的
查了些资料说有地址无关这么一说,不知如何理解

最新回复

这个你要看一下ARM的指令格式 用B 和BL这种指令通俗的讲是跳转到相对地址,编译时计算当前地址到跳转位置的相对地址,范围为-32M~+32M 所以在0x0处和0x30000000处都可以执行 因为bootloader初始化时要把flash里的内容拷到SDRAM中,所以不可能在SDRAM中运行, 当程序已经搬到SDRAM中后,会有一条语句,ldr pc,=×××,表明是从0x0处的SRAM跳到0x30000000处的SDRAM中 你可以看一下你自己的程序 所以大范围的跳转用ldr pc,=×××  详情 回复 发表于 2007-11-10 17:08
点赞 关注

回复
举报

65

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
程序中一般不写明确的地址,地址靠makefile文件确定,也就是设置。
BL MAIN,如果编译器自己的库中包含启动代码,一般隐含有入口,并规定名称。
如果需自己写启动代码,则自己定义入口,在启动代码中声明并使用。


 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
1.设置了RO段的起始位置在0x30000000,程序起始就必须要搬到0x30000000处才能执行,因为程序编译时会把你相关的宏替换成绝对地址。
2.设置RO=0x30000000后,即程序的起始位置在0x30000000,编译器会根据你的代码计算出main的地址,假设为0x30001000,于是把MAIN用0x30001000替换,当用BL Main跳转时,就会跳到0x30001000处了 。
 
 
 

回复

78

帖子

0

TA的资源

一粒金砂(中级)

4
 
谢谢楼上回答
我不明白为什么bootloader编译时的RO地址为0x30100000,但烧入flash后,复位,此时从地址0x0运行,程序能够运行,我只要是指还没进行搬移前的那小段汇编,他是被2410自动复制到内部ram运行的,请问着小段汇编代码既然已经是RO=0x30100000,为何在0x0能够运行
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

5
 
建议LZ看看Scatter Loading相关书籍
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

6
 
这个你要看一下ARM的指令格式
用B 和BL这种指令通俗的讲是跳转到相对地址,编译时计算当前地址到跳转位置的相对地址,范围为-32M~+32M
所以在0x0处和0x30000000处都可以执行
因为bootloader初始化时要把flash里的内容拷到SDRAM中,所以不可能在SDRAM中运行,
当程序已经搬到SDRAM中后,会有一条语句,ldr pc,=×××,表明是从0x0处的SRAM跳到0x30000000处的SDRAM中
你可以看一下你自己的程序
所以大范围的跳转用ldr pc,=×××
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表