tiny6410裸机实验第5章--------------DDR(代码重定位)

【说明】

              前面我们说过,NAND启动的时候,6410会把NAND中前4页每页2KB(而不是前8KB,这里很多人理解错)复制到片内内存中,从物理地址0开始运行,那我们就有个问题了,如果我们的程序超过8KB怎么办?显然超过8KB的部分不会复制进片内内存,那超过8KB的部分在哪运行呢?这就是这节的要介绍的,代码重定位。


【DDR】

              什么是DR,就是动态存储器,也就我们说的内存了,DDR其实第一个D是 double的意思,也就是双倍速率动态存储器

             CPU可以直接对其进行随机访问,但是前提是要先用代码初始化DDR,这也是这一章实验部分的重点。


【重定位】

              显然,程序应该放在内存中运行,可是我们的程序在片内内存,而且只有8KB,怎么办?

              办法就是我们用这8KB程序初始化DDR,然后初始化NAND FLASH,再把NAND FLASH中完整的代码复制到DDR中,最后跳到DDR中运行

              这个就是重定位, 这样重定位以后,程序运行就正常了,除非程序大小超过了内存(使用虚拟内存,及时超过也没事,这里我们是裸机,所以超过不行)

    


【一些问题】

               办法想到了,但是又有一个新问题,那就是复制到DDR的哪里?它可有256MB,随便放哪吗? 

               显然不是,回忆前一节关于链接地址和物理地址的概念,如果复制到的地址不等于链接地址,程序是会出问题的。

               所以,解决办法是,链接地址是哪,我们就复制到哪。记得我们给的链接脚本中程序开始地址吗?没错,0X50000000

               在6410的体系中,这个是DDR的开始地址,所以,如果我们的程序用了这个链接脚本,我们就得把它复制到0X50000000开始的地方,也就是DDR最前面

               当然,换了链接地址,重定位到DDR的地址也就得跟着变咯。


【还有问题】

               问题不是解决了吗?还有什么问题吗?

               又要回到我们的前8KB了,我们复制到DDR后,程序是能正常运行了,但是我们把这前8KB给忘记了,它可不是在0X50000000开始的地址处,它在0地址

               那这8KB不就是物理地址不等于链接地址吗?没错!就是不等!那这8KB运行不就出错了吗?

               还记得地址无关码吗,没错,这8KB就得是地址无关码,所以它不会出错,它可以在任何物理地址运行。


【总结】

               我们的片内内存只能放8KB程序,超过的部分不能正常运行,所以我们就在前8KB写地址无关码,去初始化DDR, 初始化NAND FLASH,

               然后把完整的程序从NAND FLASH  复制到DDR中,再跳到里面执行。

               为了保证程序正常运行,我们的链接地址要和复制后的物理地址相同,这使得前8KB物理地址不等于链接地址,但由于它是地址无关码,所以程序正常。   

              

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值