一开始是学stm32的,一直用MDK下载调试程序,非常方便。后来转学嵌入式Linux,在Linux下进行u-boot和Linux内核的移植,一直没有用到硬件调试功能,都是通过打印串口信息或者led来调试,大部分情况下能够奏效,这也是因为u-boot和linux内核本身的代码质量非常高,很难出现非常规的错误吧。但是后来在JZ2440上进行裸机程序验证,进行实时内核编写时,由于有非常多的汇编代码,使得程序开始复杂起来,使用串口调试非常麻烦,led调试又说明不了太多问题,这就使得我在学习嵌入式Linux大半年之后,在搁下硬件调试不管大半年之后,不得不再来面对这个问题。
以前之所以回避这个问题,是因为确实很麻烦,涉及到的东西感觉好多。首先,我能用于硬件调试的工具只有jlink,之前一直只是用来烧写u-boot到nor flash。也曾想在MDK上用jlink来调试s3c2440的,但是对MDK使用的链接器,调试器不熟悉,s3c2440的内存分布又不像stm32那样是固定的,需要自己写一些脚本或者链接文件来控制代码的链接和下载,我一直使用的是GNU的一系列工具,所以只能望而却步。
要想在windows下进行裸机程序的开发,首先要一套编译器。ADS,MDK不用多说,想用这两个程序的也不会来看这个帖子。windows 下GNU的ARM编译器有很多,google百度都能找到,下载了之后把bin目录放到环境变量里,就能在DOS窗口下直接调用了,比如"arm-none-eabi-gcc -v",此时还不够,必须要安装Windows下模仿Linux的一套工具,最明显的就是make,比较好的选择是MinGW。搞定了这两部分,就能开始进行裸机程序的开发了。但是这样的开发仅限于编译出bin文件,然后可以通过u-boot下载到SDRAM中运行,或者用JLINK来下载到SDRAM中运行。通过u-boot来下载通常还需要网络连接或者usb线,如果需要串口调试,还需要usb转串口工具。我是用u-boot的,每次编译好了程序,都需要重启一次开发板,然后用dnw把bin文件下载到SDRAM,运行。这是一个痛苦的过程,但是相比于最最开始的时候,我每次都用jflash将程序下到nor
flash运行,这已经算是很先进的方式了。随时认识慢慢提高,知识慢慢增多,这种方式也已经满足不了我对速度和精度的要求了,我现在是想要达到不依赖IDE就能一键编译下载运行调试的状态,所以我最终还是要来解决调试这个问题。
我很早以前就再jlink的安装目录里发现了一堆我用不到的软件(我只用到了jflash)。没事的时候我一个一个打开来看,发现jlink.exe能直接连上我的开发板,还能显示我开发板的信息,我再Doc目录下找到了jlink的文档,看到了一些命令,我拿来用了用,发现居然可以直接读写s3c2440的寄存器,当时觉得好不可思议(当时的认识太浅,到处都是科技黑箱,我只在黑箱之间行走,先学到把黑箱连起来完成一些功能,再来细细研究黑箱)。在这一堆软件里,我还发现了一个软件,jlink
gdbserver.exe,同样的,我在Doc目录里找到了他的文档,大略看了目录,看了一些感兴趣的章节,就发现了GDB这个名词,在Linux中见过,但是当时没用过。看完了之后,也没什么感想,什么都不懂。直到前几天,我在Linux上写应用程序的时候,感觉仅凭分析很难找到全部的错误,就试着用了一下GDB,没想到一上手就感觉很好用。昨天又调试s3c2440的裸机程序,在bootloader那段程序里一直会莫名其妙的卡住,不知道程序去了哪里,虽然进行细致分析还是可以排查出问题的,不过在写了很长时间程序之后,我已经没有心情和力气来慢慢脑力调试了,所以我放下了它,相信了那句话,工欲善其事必先利其器。于是开始了对硬件调试解决方案的又一次冲锋,想一想,这恐怕是第三四次了,以前都是匆匆看了下,感觉很麻烦,就没再看,因为那个时候整体工作还能进行,现在是几乎进行不了了。
百度上一搜,很快就知道了大概是要需要GDB,GDBserver。我一下就反应出了jlink gdbserver,就是因为上面说的那一次偶然的发现,于是我又看了一下jlink gdbserver的文档,上面介绍了怎么用GDB连接GDBserver以及可用的命令,我从安装的ARM GNU编译器目录里找到了arm-none-eabi-gdb.exe,启动之后,试着用了target remote :2331这个命令,一下就连接上了,心情开始小激动,然后又monitor
reg r1,读出了寄存器,非常好。可是接下来就把我难住了:我会使用GDB在电脑上调试C程序,但是我不知道怎么调试嵌入式程序,我要怎么将程序下载到开发板呢,要经历一个怎样的顺序,我才能到达最期待的那个地方,就是可以使用各种命令来实现停止,单步调试,查看变量等操作。
首先要解决的问题就是怎么下载程序到开发板,我在网上搜了很多帖子,基本没有涉及这个话题的,只有为数不多几篇提到了load这个命令,我试着用了一下,没想到程序一下就下载进去了,是下载到0地址的,但是我的程序最终要要在SDRAM里边运行,所以我必须要将它下载到SDRAM里边,load又没有地址参数,我开始愁了,后来我想,那这个地址肯定只能在程序里指定,程序涉及到地址的地方又是在链接脚本里指定,于是我在链接脚本里试着用AT命令指定了一个地址,测试了一下,完美成功。于是我解决了下载问题。下载之后,怎么开始运行,从哪里开始运行,不能像普通GDB调试那样用r命令。很自然地,我使用命令调整pc值,调整cpu模式,根据网上的几个例子,使用c命令开始运行,程序就跑起来了,打断点,单步运行,一切ok!这个问题终于解决了,我的QQ号527332470,有问题的朋友可以跟我交流,