之前我预告过这篇文章,这段时间以来,我工作一直比较忙,而且在装修我的小破窝,生活的压力让我把业余的时间都贡献给奥山战场了,我的小牧师,杀人很慢,被杀倒是挺速度的,呵呵;想当年上学的时候,我也是副本RL,逃课带MC;现在工作了就只能沦为战场混荣誉的了……平时没有太多时间,职业不开UT跟混收麦子;周末开UT打各种麦子和各种国家队。
在开始前另外提一件事情,我之前说想找个便宜的PowerPC调试解决方案,现在其实我也算找到了——还是Macraigor的OCDRemote,用起来和OpenOCD差不多,具体用法和支持的器件请看Macraigor的官网http://www.macraigor.com/。不过,“0f 84 f0 fc ff ff”->“0f 85 f0 fc ff ff”;我所提供的信息来自互联网,仅可以用于个人学习和研究,对于产生的后果,我不负任何责任;如果你喜欢这个软件,请联系Macraigor的销售,购买他们的调试硬件。但OCDRemote + Wiggler目前并不支持e300、e500内核,我要用的MPC8313还是调试不了……
首先明确一下,为什么我要抛开IAR、ADS、Keil这样的IDE选择GNU阵营的东西——这并不是因为GNU是自由软件,而是因为在一个CPU刚上手的时候,往往还是需要别人的代码来参考的,u-boot里面的样例很多,但是移植到IDE环境下开发却很困难。
之前这篇文章里http://xianzilu.spaces.live.com/blog/cns!4201FDC93932DDAF!485.entry,我介绍过J-Link是一个非常不错的ARM调试工具,它的软件包里带有GDB Server。J-Link在JTAG频率为8MHz时,ARM926EJ-S可以达到300~400kB/s的下载速度。Eclipse是一个免费的JAVA开发调试IDE,因为它很受欢迎,所以Eclipse也增加了对C/C++开发的支持;过去是需要下载Eclipse,然后再下载C/C++开发插件CDT,现在官网已经有直接打包好的Eclipse + CDT下载了,地址是http://www.eclipse.org/downloads/,无论你在Windows还是在Linux下使用Eclipse,都需要安装Java Runtime Environment。但我们进行的是交叉开发,CDT里头自带的Debug Configuration无法完成这种开发,需要安装一个插件。具体步骤:首先确认你的操作系统可以上网(实际的、虚拟机里的都一样);然后在Eclipse的菜单里选择Help->Software Updates;选择Available Software选项卡,点Add Site按钮;输入地址http://www.zylin.com/zylincdt,列表里就多了一项;刷新之后点上面的Install按钮安装。
ZylinCDT用起来很方便,只需要在Debug Configuration里面配置Commands选项卡,填入Initiate Commands和Run Commands;其他和Eclipse自己的Debug Configuration差不多。事实上,ZylinCDT就是用这些填入的内容取代了正常的GDB初始化命令,给出我的Initiate Commands给大家参考(Run Commands为空):
target remote 192.168.5.133:2331
# Disable watchdog
monitor memU32 0xfffffd44 = 0x00008000
# PD6 - EBI0_NCS4, PD11 - EBI0_NCS2, PD15 - EBIO_CS3/NANDCS, PD16~PD31 - EBI0_D16~EBI0_D31
monitor memU32 0xfffff844 = 0xffff8840
monitor memU32 0xfffff864 = 0xffff8840
monitor memU32 0xfffff870 = 0xffff8840
monitor memU32 0xfffff804 = 0xffff8840
# Configure the EBI0 Slave Slot Cycle to 64
monitor memU32 0xffffec50 = 0x00000040
# Initialize the matrix, VDDIOMSEL = 1 -> Memories are 3.3V powered
monitor memU32 0xffffed20 = 0x0001000a
# Configure SDRAM Configuration Register
monitor memU32 0xffffe208 = 0x85227259
monitor sleep 10
# Perform Command - Precharge All
monitor memU32 0xffffe200 = 0x00000002
monitor memU32 0x20000000 = 0x00000000
monitor sleep 20
# Perform Command - Refresh for 8 times
monitor memU32 0xffffe200 = 0x00000004
monitor memU32 0x20000004 = 0x00000001
monitor memU32 0xffffe200 = 0x00000004
monitor memU32 0x20000008 = 0x00000002
monitor memU32 0xffffe200 = 0x00000004
monitor memU32 0x2000000c = 0x00000003
monitor memU32 0xffffe200 = 0x00000004
monitor memU32 0x20000010 = 0x00000004
monitor memU32 0xffffe200 = 0x00000004
monitor memU32 0x20000014 = 0x00000005
monitor memU32 0xffffe200 = 0x00000004
monitor memU32 0x20000018 = 0x00000006
monitor memU32 0xffffe200 = 0x00000004
monitor memU32 0x2000001c = 0x00000007
monitor memU32 0xffffe200 = 0x00000004
monitor memU32 0x20000020 = 0x00000008
# Perform Command - Load Mode Register
monitor memU32 0xffffe200 = 0x00000003
monitor memU32 0x20000024 = 0xcafedede
# Set Refresh Timer
monitor memU32 0xffffe204 = 0x000002bc
# Perform Command - Set Normal mode
monitor memU32 0xffffe200 = 0x00000000
monitor memU32 0x20000000 = 0x00000000
file /home/lxz/share/u-boot-1.3.4/u-boot
load
我调试的目标CPU是AT91SAM9263,通过以上的初始化命令,可以实现PLL、SDRAM的初始化,并将u-boot带码加载到内存中。J-Link的monitor命令可以看J-Link安装之后的文档J-Link GDB server user guide的3.4节Supported remote commands。
今天说的这些事情没有什么难度,用Eclipse + J-Link调试的关键就是要用ZylinCDT这样的插件,关于ZylinCDT的信息可以看它的官网http://www.zylin.com/,解释的比我说的详细多了。Eclipse的教学文档网络上也多得很,Eclipse本身界面就很友好,不用什么教学,自己摸索一会儿也就会了。我就总结下:Eclipse可以自动创建Makefile,虽然使用的是GCC工具链,却有像ADS、Codewarrior这样IDE环境的便利;对于U-boot、Linux内核这样的有现成Makefile的程序,Eclipse能将它们导入,一样能调试。但是,和Source Insight强大的自动完成功能相比,Eclipse逊色太多了。我的开发解决方案是:Linux虚拟机下的SMB共享代码 + Windows下的Source Insight编辑 + Linux虚拟机下的arm-linux-gcc编译 + Windows下的J-Link GDB Server + Linux虚拟机下的Eclipse CDT & ZylinCDT;呵呵,好绕啊;但如果代码不复杂,就直接用Eclipse编辑也挺好。
(ee_site)