关于UBOOT 和 仿真器的使用

[复制链接]
7224|20
 楼主| 免提 发表于 2009-3-17 10:35 | 显示全部楼层 |阅读模式
本文以学习的角度讨论如何利用华恒ARM11仿真器来针对U-Boot做嵌入式开发,俺是一个小菜鸟在公司的大牛经理的带领下使用华恒S3C6410开发板做项目,呵呵,项目内容保密。(BTW:据说这块开发板用的是IPhone的芯片,真TMD贵,要1W大洋)<br />我用的这款ARM11仿真器是开发板附送的,据说是目前国内唯一一款完全支持ARM11处理器的仿真器,大牛经理让俺弄U-Boot,刚接触工作,比较紧张也有些小兴奋。这个项目我做了2个星期,几乎天天加班到10点,感谢大牛经理的帮助,他不光技术niubility,人也很nice。同时感谢华恒的售后陈工,他也给了我不少帮助。<br />U-Boot作为内核的引导程序,起源于PPC-Boot,广泛用于嵌入式。目前已经支持很多CPU和开发板,具体可以参见其README。网上也有很多资料可以参考。这里我只把我如何配置使用仿真器来源码级调试的经验和大家分享一下,随着项目进度,后继陆续会写一些针对其他方面的心得,作为我成长路上的记录,同时希望大家共同提高。<br />
阿南 发表于 2009-3-17 13:10 | 显示全部楼层

哈哈,楼主只写了个前言,还没到正文!等待中...

  
 楼主| 免提 发表于 2009-3-17 15:53 | 显示全部楼层

如何用仿真器调试U-Boot————2

做嵌入式开发,尤其是底层开发如果有一个比较好用的仿真器真的可以事半功倍。以前记得我还是穷学生的时候都是点灯**+print,对于仿真器以前只听其名未见其人。<br />以下是详细的烧写过程,摘录自仿真器手册,备份下来以便以后随时参考。<br />1&nbsp;裸板:指没有烧写BootLoader代码的S3C6410开发板<br />2&nbsp;步骤:<br />2.1&nbsp;为AXD添加HHTech.DLL,使其支持华恒科技Code&nbsp;Hammer仿真器<br />2.2&nbsp;加入启动脚本:脚本路径为“D:HHICEinit.txt”请不要改变该路径!!<br />(注:只有在裸板烧写的时候需要加入启动脚本来初始化开发板。如果开发板上已经烧写BootLoader时,BootLoader会自动进行初始化工作,此时请勿添加!)<br />2.3&nbsp;此时开发板上没有烧写BootLoader所以串口无任何打印信息<br />2.4&nbsp;重新启动AXD,此时AXD会自动加载初始化脚本,等待其完成(如果遇到无法自动停止的情况,请手动暂定一次)<br />2.5&nbsp;此时仿真器已经可以正常使用,我们将预编译好的RAM版BootLoader下载到0x50002000内存位置处(请不要改变此位置)<br />2.6&nbsp;可以看到此时在0x50002000处,已经有我们下载的代码了<br /><br />
db10 发表于 2009-3-17 18:42 | 显示全部楼层

是仿真 还是想说烧程序?呵呵

  
mohanwei 发表于 2009-3-17 18:55 | 显示全部楼层

调试OS性质的应用项目,printf是不二法门……

为何?<br />原创开发不是应用开发者能承担的;<br />对于应用而言所谓开发不过是“移植”,涉及修改的只是部分特定代码;<br />IDE工具智能化程度还太低,基本只能根据用户的需求逐步添加代码实现用户想要得到的东西(君不见Keil到现在还搞不定多级struct……);能调试os的也不是没有,但是那价格不是一般应用开发的公司可以接受的。<br />……
 楼主| 免提 发表于 2009-3-18 08:49 | 显示全部楼层

呵呵,总要一步一步来嘛

  
 楼主| 免提 发表于 2009-3-18 10:05 | 显示全部楼层

制作RAM版的U-Boot

2.7&nbsp;将PC指针改到0x50002000处运行,如果运行发现串口仍然没有输出,请重复上述&nbsp;下载步骤。<br />2.8&nbsp;这一次我们看到,串口有输出,并且RAM版的BootLoader已经正常运行。<br />(此时,我们可以通过TFTP下载NAND版BootLoader进行烧写,具体请参见S3C6410开发板手册。我们也可以直接用仿真器将NAND版BootLoader下载到内存进行烧写。见下面的操作)<br />2.9&nbsp;先暂停AXD,并下载NAND版BootLoader(请注意下载位置0x50008000)<br />2.10&nbsp;下载完毕后继续运行AXD。<br />2.11&nbsp;切换到串口,进行烧写即可。(烧写命令见录像操作)<br />nand&nbsp;erase&nbsp;0&nbsp;40000<br />nand&nbsp;write&nbsp;50008000&nbsp;0&nbsp;40000<br />2.12&nbsp;OK,现在已经将NAND版BootLoader烧写到HHS3C6410开发板,关闭AXD,重启开发板即可。<br />
 楼主| 免提 发表于 2009-3-18 10:06 | 显示全部楼层

如何用仿真器调试U-Boot————3

我们开发的时候是把不太成熟的U-Boot下载到内存中运行调试,而不是直接烧写到板子上。刚开始我就是范了这样的错误,即浪费精力耽误时间,同时也容易损伤Flash。幸好我们经理及时的传授这个经验给我,替我节约不少时间,谢谢他。<br />我们可以通过修改以下文件将U-Boot改为RAM版,在内存中运行。<br />
db10 发表于 2009-3-18 12:42 | 显示全部楼层

我指羡慕你们公司有钱

&nbsp;有机会买6410的板子。。。。
 楼主| 免提 发表于 2009-3-19 08:48 | 显示全部楼层

如何用仿真器调试U-Boot————4

我们开发的时候是把不太成熟的U-Boot下载到内存中运行调试,而不是直接烧写到板子上。刚开始我就是范了这样的错误,即浪费精力耽误时间,同时也容易损伤Flash。幸好我们经理及时的传授这个经验给我,替我节约不少时间,谢谢他。<br />我们可以通过修改以下文件将U-Boot改为RAM版,在内存中运行。<br />1、改内存基地址;<br />文件:/HHARM6410/s3c-u-boot-1.1.6/board/samsung/smdk6410/config.mk<br />ifndef&nbsp;TEXT_BASE<br />#默认是Flash版本的<br />#TEXT_BASE&nbsp;=&nbsp;0xc7e00000<br />#改为0x50002000,则我们需要通过仿真器下载到内存的地址要和这里一致!!<br />TEXT_BASE&nbsp;=&nbsp;0x50002000<br />endif<br /><br />2、注释掉mmu:&nbsp;CONFIG_ENABLE_MMU:<br />文件:/HHARM6410/s3c-u-boot-1.1.6/include/configs/smdk6410.h<br />//#define&nbsp;CONFIG_ENABLE_MMU<br />
 楼主| 免提 发表于 2009-3-19 08:50 | 显示全部楼层

6410芯片价格算是狠便宜的

等着吧,相信不用多久开发板就会降价的。<br />毕竟还是要出产品嘛!
 楼主| 免提 发表于 2009-3-19 11:31 | 显示全部楼层

如何用仿真器调试U-Boot————5

华恒的这个仿真器可以直接绑定ADS1.2,只要安装个DLL文件即可。ADS使用起来真的很方便,各种寄存器包括CP15都能直接操作,同时能够查看修改内存。使用截图如下:<br /><br />至于ADS就不做说明了,直接看帮助文档好了。
 楼主| 免提 发表于 2009-3-19 11:59 | 显示全部楼层

不会传图片

不知道咋整的,图片上传不了,稍后补上
lelee007 发表于 2009-3-19 16:04 | 显示全部楼层

LZ很兴奋吧

6410都玩上了,还有仿真器
icecut 发表于 2009-3-19 16:57 | 显示全部楼层

我觉得你仅仅是下载到内存中运行啊

这个还不算调试啊.<br /><br />任何一个仿真器都能做到.<br /><br />调试bootloader真的很容易.现在d的j----l**k都能搞定.很便宜.<br /><br />如果最多能调试到load&nbsp;linux....&nbsp;然后进入操作系统空间就开始变麻烦,<br />然后打开mmu据说....<br /><br />不相信HH的能力.<br />当然,更不相信**
古道热肠 发表于 2009-3-19 17:24 | 显示全部楼层

好同志,多发言,多写心得

有一点较为认同,调试程序可放在内存中运行,较为方便.
 楼主| 免提 发表于 2009-3-20 08:36 | 显示全部楼层

结合源码(重点推荐)

完全安装后ADS自带的文档很全。我这里重点说说如何结合源码调试!<br />我们知道只有使用ADS自带的编译工具,将代码编译成AXF文件才能让ADS显示源码,这种AXF文件包含了调试必须的各种信息,也就是symbol,这种方式人人的都会我们也忽略&nbsp;:)。<br />而华恒的开发板提供的是开源GCC开发包和源码,在Linux下面编译成ELF格式的文件是无法保留ADS认识的symbol的。但万事没有不可能。这里就要充分利用GCC的整个工具链了。<br />(待续)
qingfengyishi 发表于 2009-3-20 13:33 | 显示全部楼层

楼主说的只是用AXD调试汇编代码吧?

楼主说的只是用AXD调试汇编代码吧?如何单步调试C源代码?否则BOOTLOADER调试的时候很费劲!!!有些情况下甚至只能点灯来调试
l0p0c 发表于 2009-3-21 09:39 | 显示全部楼层

我弄嵌入式1年了,也想做做嵌入式的项目。

只是现在在单片机的公司,感觉手脚被绑的。
 楼主| 免提 发表于 2009-3-23 08:52 | 显示全部楼层

继续

我们可以看到,ADS中显示的代码地址和u-boot.dis文件显示的一样。都是0x50002000,这里对应的是_start函数,也就是U-Boot的入口函数,这个函数可以从u-boot.map文件中找到,见第二个窗口中的第一个黄色,位置cpu/s3c64xx/start.S。这样我们就可以定位到其源码了&nbsp;:)<br />PS:<br />1&nbsp;如果U-Boot的Makefile中默认是不生成u-boot.dis文件,我们需要手动添加。在Makefile文件的“all:”标签下面加入$(obj)u-boot.dis。或者,通过命令make&nbsp;u-boot.dis来生成。<br />2&nbsp;u-boot.dis其实就是u-boot.bin的汇编输出,“/usr/local/arm/3.3.2/bin/arm-linux-objdump&nbsp;-d&nbsp;u-boot&nbsp;&gt&nbsp;u-boot.dis”因此其中函数名称会多一个下划线。如:_start其实对于函数start,这个请大家注意。<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

39

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部