打印

ADS Linker设定及2440init.s中标号编译结果的疑惑

[复制链接]
2602|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ADaiPlay|  楼主 | 2010-7-29 20:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近看2440的init.s文件的代码搬运部分时,发现以前自以为是的逻辑全被打乱了
1.如果将程序入口点设定为0x3000_0000,那么init.s中“B ResetHandler”的ResetHandler是不是被编译器弄成0x3000_0000,依次HandlerUndef是0x3000_0004呢? 可是B指令的跳转范围最大32M啊?
2.ini.s中在跳转到main()以前的标号地址有加0x3000_0000的偏移量吗?{main()以后的代码还可以理解,无论代码或标号都以0x3000_0000为基址向上加的}main()之前的代码就糊涂了,这段代码无论如何也是以0x0为起始地址的?(1)如果是,那么中断入口怎么办(以2440nand启动为例,他开始可以运行4K起始代码,可以保留中断入口,可是2440资料上讲nand时明明说启动后,4KSRAM可做他用,那不是将中断入口毁了吗?);(2)如果不是,那么芯片响应中断时,到0x0找复位异常,或0x4找未定义异常可是什么都找不到了。。。
3.main()之前的代码,只在以0x0为起始地址的地方运行?无论是自nand还是nor启动?如何解决Linker设定的程序入口点0x3000_0000问题呢?

:L 头都大了
大侠们,小鸟在等待,在等待哈,给点资料链接也可以啊。

相关帖子

沙发
centimetre| | 2010-7-30 08:46 | 只看该作者
的跳转范围最大32M啊? -- 这个是指offset,偏移量是32M

程序入口点设定为0x3000_0000 --这个是需要设置link脚本或者robase来实现的,不是设置程序入口点来决定的

www.cmtekchina.com

使用特权

评论回复
板凳
xinzha| | 2010-7-30 08:50 | 只看该作者
entry_point如果不设置,就默认是scatter文件中的首地址(这个只针对于用仿真器调试,如果是真机运行,一切都依赖于scatter),如果设置了可能就混乱了。
你还是先去看看编译链接和scatter文档吧。
arm的官方网站http://infocenter.arm.com/help/index.jsp
如果你装了ads或者rvds,里面就自带很全面的文档了

使用特权

评论回复
地板
ADaiPlay|  楼主 | 2010-7-30 15:55 | 只看该作者
可能问题没说清楚,最大的疑惑是:有些代码可能既在0x0运行,有可能被搬运到RAM运行,那么这段代码中包含的标号如何处理呢?ROM和RAM地址不一样的,标号在程序中被定义成相对的?最直接的例子就是异常入口,它是在ROM起始处,可是程序运行在RAM中,怎么将PC转到RAM0x3000_0000处的异常入口去呢?

使用特权

评论回复
5
xinzha| | 2010-7-30 16:57 | 只看该作者
这里包含了remap的机制和firmware,bootloader的一些问题,lz还是先看文档再研究这些吧。
异常向量地址绝不可能是0x30000000,只有两种可能,0xffff0000或者0x00000000

使用特权

评论回复
6
ADaiPlay|  楼主 | 2010-7-31 08:12 | 只看该作者
谢谢
#xinzha 同志
偶去找些资料研究研究。顺一顺剪不断理还乱的思绪:)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:老实做人,塌心做事——为理想挥汗 网站:www.edreamtek.com 文章:http://blog.csdn.net/adaiplay

23

主题

626

帖子

6

粉丝