基于uboot的2410调试平台的实现

基于uboot的2410调试平台的实现,第1张

 

  关于这个东东,开始的时候,笔者是因为木有钱买仿真机,而且被一遍一遍的烧写nand flash折腾的很烦躁,因为nand flash的烧写速度并不像下载到SRAM或者SDRAM里边那么快。而且相当nand的寿命有限,烧写有风险,每次都是heart hard-beaTIng下完成的,生怕nand挂了或者CPU挂了,sigh......生亦何哀,死亦何苦。有痛如斯,夫复何求?!无奈当时对于ARM的MMU还不是很熟悉,而且当时是一边上班一边业余折腾,遇到问题了就有点躁。痛定思痛,长痛不如短痛!咬着牙花了一晚上把MMU看了两遍,结果发现有好几种配置方式,让人抓狂哇!哈哈,想想当时真的很傻很天真,就因为有多种配置方式,段式,页式,页式还分个粗细,就不知道到底该用哪个更合适,后来想到linux下用哪个方式咱就用哪个方式,然后抱着这个想法去看linux内核代码,结果不了了之--没看明白,HOHO~~~~~~~~不过后来是在一个关于ARM MMU的例程中找到了定心丸,就用段式映射,这个最简单!当时还不知道看SAMSUNG的代码,很多代码都是网上杂七杂八搜罗过来的。原理弄明白,方案定下来之后,事情就好办多了,一步一步实施就是了,无非是代码出问题了再调试。

  原理其实是这样的,首先移植一个可以用的uboot,至少要包含tftp和go命令,然后将其烧到nand flash里边,每次系统上电的时候能顺利运行uboot;然后我们将编译链接好的目标代码通过uboot下载到SDRAM里边,再从uboot里边go到我们自己的程序去运行。

  实施过程中遇到的几个问题如下:

  1、代码的存储位置和运行位置的问题

  2、中断向量表的位置问题

  3、中断入口配置

  第一个问题中关于两个位置的问题,这应该是连接器要处理的,这个问题不是这里的阐述重点,有兴趣的可以参考《arm学习报告》系列文档,里边基本讲的非常详细,而且不像GNU Ld那么长篇大论。虽然这个问题不是咱的重点,但是多少对咱是有影响的,不然.............讲讲到底怎么影响咱的是正事,废话就不扯了,嘿嘿,因为,废话已经扯了很多了,GAGA~~~~~~~~~。因为从原理上来看,我们自己编写的程序用这种方式来调试的话,就不可能再放到0地址开始,让系统自动加载了,因此存储地址和运行地址都不能直接用默认的0了,这个地址需要我们在链接脚本里边亲自指定一下。为了节省大家时间,笔者在尼度给俩例子吧,一个是源代码里边的链接脚本文件,一个是链接脚本的书写规则。

  SECTIONS {

  .text

  0x30004000

  :

  {

  head.o

  clock.o

  init.o

  led.o

  serial.o

  TImer0.o

  mmu.o

  interrupt.o

  main.o

  }

  }

  这个是链接脚本,其中的 0x30004000地址前面的text是指如下内容全是文本段。关于文本段如果您不想看别的资料,就简单的理解成是代码段吧。实际也是代码的运行地址,更确切的说是运行地址的开始,就是我们目标代码的入口地址。链接以后,程序在执行时的一些相对跳转中,这个地址就是个基地址了。如果在把程序从别的介质加载到运行内存(SDRAM)时,地址发生了错误,有些程序就无法正常执行,这就是位置相关和位置无关代码的区别。

  

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/dianzi/2713874.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-08-17
下一篇 2022-08-17

发表评论

登录后才能评论

评论列表(0条)

保存