完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我的第二个裸板程序的目的是,将程序在ARM外接的SDRAM上运行程序,而不是,arm的片内ram。再此之前先得聊一聊“链接地址”和“存储地址”。 还记得,第一个裸板程序的链接地址是如何确立的吗? arm-linux-ld -Ttest 0x0000000 来指定了代码段的起始地址。也就是说代码的链接地址,就是在链接的是时候确立的。 那么什么是存储地址呢?我们知道,我们编写的C代码,会被编译成汇编指令,进一步变成机器码,最后加载到arm的内存中。也就是说我们的汇编指令被存储在内存之中,而指令对应的地址,就是他的“存储地址”。其实“存储地址”的值,一直由pc这个寄存器所记载着。想改变“存储地址”的值直接改变pc好了(补充说明:汇编指令和机器码是一一对应的,汇编其实就是机器码的助记符;有的机器码可能就代表一条汇编指令,有的机器码可能单纯的代表一个数据,而有的可能既包含指令又包含数据,这没有什么可奇怪的~~)。 那他们之间的关系是什么呢? 再说链接地址,他是指令应该运行的地方,也就是说,正常情况下指令的存储地址,和链接地址应该是相同的。不然程序会出错。我还想问:为啥会出错?呵呵,我是这么理解的。链接地址是在程序一开始链接时就已经确定了,目的就是规划整个程序,比如说这个全局变量放在哪?那个静态又搁在哪?事前就确定好,那么到时程序访问的时候,就可以按照原先说好的位置去找他,那么这个“链接地址”就是我所说的“原先说好的位置”,而“存储地址”,就是“实际存在的位置”,如果说,“原先说好的位置”和“实际存在的位置”不一样,那么出问题是必然的啊,是吧! 但是为啥说是可能出问题呢?那就是说存在:即使“链接地址”和“存储地址”不一样,也不会出错的代码——位置无关码。例如一些相对跳转指令b,bl(首先他们得不会去访问一些全局变量或者是静态变量)他们只需要在当前位置加上偏移量即可,不需要一个确切的地址。也就是说他们压根用不到链接地址,那么自然也就不会出错了。到这里似乎都清楚了,但是反过来想想,为啥会存在两种地址又是“链接地址”又是“存储地址”,或者说“原先说好的位置”和“实际存在的位置”为什么会不一样!!于是终于引出了今天的关键点——代码重定位。 当我们打开电脑的时候,硬盘上的程序会加载到内存中运行,这就是代码重定位!“实际存在的位置”是硬盘,“原先说好的位置”是内存。 那么,现在就开始我的,第二个裸板程序,将程序在arm外接的SDRAM上运行程序。 和电脑一样,我的开发板的代码首先是存在于NandFlash,上电后NandFlash中前4K的代码,会被自动拷贝到arm片内内存中。 今天我们把,这4K代码再次移动到SDRAM中去执行。要完成这次代码重定位,看需要完成那些工作。 首先开makefile:
复制代码 第四行中将链接地址设置为0x30000000,(其他命令的和上一次程序中完全一样,详见上一篇博客)0x30000000为SDRAM的基地址。这就是在和arm说好,到时代码是在SDRAM上执行的。但是事实,目前代码还在arm的片内内存。我们首先得把代码搬到SDRAM中,这段代码在汇编引导码中实现:
复制代码 我就把函数的主体提取出来讲讲:
复制代码 text表示是代码段的开始,那个_start这个全局的标签的链接地址就是0x30000000(链接的时候就说好的,不是吗?)下面的地址在此基础上依次递增。所以,第12行至第15行的命令都存在一个问题,就是他们存储地址和链接地址不一样,但是不用担心会出错,因为它们都是位置无关码。第15行执行之后,链接地址,就等于存储地址了。前面说过了,存储地址,其实就是pc中的值,ldr pc, =on_sdram 这句命令就是让存储地址的值为标签on_sdram地址的值,on_sdram地址的值在链接时候确定了,由0x30向下累加,所以on_sdram的值就是0x3000010。那么接下来那行命令ldr sp, =0x34000000 的存储地址和链接地址就都是0x3000010,之后的命令的存储地址和链接地址也都一致了。此时程序就已经在SDRAM里运行了。具体过程如图所示: 其中的SDRAM的配置过程,和代码搬运过程,我没有仔细讲,大家可以看程序理解。 C代码和之前的一模一样,就不贴了。下载之后,发现灯闪的比较慢了,是因为SDRAM的运行速度比片内内存慢~~ 宋桓公 2014-11-29 |
|
相关推荐
8个回答
|
|
顶宋公,精深胜过博大,期待宋公的下一期分享!
|
|
|
|
顶,支持搂主
|
|
|
|
感谢支持~~
|
|
|
|
你们的关注就是我的动力
|
|
|
|
双引号恰到好处。颇有老大的味道。精华@
|
|
|
|
感谢版主支持,加精啦~~哈哈
|
|
|
|
精华啊!就是老大啊!
|
|
|
|
厉害了我的哥,写的真是不错
|
|
|
|
只有小组成员才能发言,加入小组>>
197个成员聚集在这个小组
加入小组为什么点亮LED的例子放在NORFlash上跑会出现奇怪的现象?
2177 浏览 6 评论
1982 浏览 5 评论
韦东山老师推出的《玩转ARM裸机实战》课程将帮你以上问题一扫而光!
4540 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-20 13:15 , Processed in 0.927501 second(s), Total 91, Slave 71 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号