IAR 5.11中使用J-Link的一点经验

分享DIY电子ARM嵌入式 by 达达 at 2008-08-26

上周末在icdev的淘宝网店买了一个J-Link,周一早上到手,吃完晚饭便开始试用这东西。在icdev的FTP载了个IAR Embedded Workbench for ARM Evaluation 5.11版,按着icdev给我的说明文档进行设置后,拿出我那尘封已久的LPC2148开发板,按开发板的电路设计写了个闪烁P1.24上的LED的简单程序用来测试J-Link。

结果折腾了一晚上都没有折腾出来个结果,出来写莫名其妙的错误,总之不能调试。

今天中午吃完午饭便又开始折腾,还好遇到群里的热心朋友,和我一起想办法,并提供意见,最后J-Link终于是可以在IAR下以J-Link模式正常Debug了,虽然icdev的文档中推荐使用RDI模式,但是不知何故RDI模式不能在运行时设置断点,在运行时设置断点总是报"设备忙",所以RDI模式还有待研究。

总结下IAR中使用J-Link的经验,希望对他人能有所帮助,不要像我一样绕那么多弯路。 :)

首先,作为一个菜鸟,我忽略了startup.s文件和.icf文件,startup.s用来做一些初始设置,然后执行main函数,没它程序就不会运行了。.icf文件干嘛的我还是不太理解。。。不过没它也是不行的。我一开始建的LED测试程序光写了个.c文件,其它啥都没有,所以不能写入开发板也不能执行。

startup.s和.icf文件是与具体芯片相关的,这两个文件可以在IAR的示例程序目录下找到。以LPC2148为例:

图中lpc2xxx_cstartup.s就是所需的启动程序用的汇编代码,不过不能直接用,需要做点小修改,请继续往下阅读。

上图中的LPC2148_flash.icf, LPC2148_RAM.icf和LPC2148_RAM.mac都是需要的。各有用途,请继续往下阅读。

先把需要的这些个文件都复制到项目里。并把启动代码加入项目中。这时候如果你编译代码应该会在启动代码文件报错,这是因为复制来的这个启动代码中有映射了中断处理函数,而你的程序中可能没有对应的函数,所以编译失败了,以我的LED闪烁程序为例,我没有需要用到中断处理,我就简单的把几个中断处理函数的映射代码注释掉。

至于flash.icf和ram.icf,这两个文件,它们分别是用来在flash和ram上调试程序用的,虽然我不知道这两个文件具体做什么,但是可以猜测它们是用来做内存映射的。如果在ram上调试程序的话,程序不会被写入flash,如果开发板断电再上电,程序就没了。flash上调试当然就相反了。

使用flash.icf还是ram.icf就根据你自己需要来了。IAR所给的例子中提供了两种设置方案。使用flash.icf和使用ram.icf时,项目的设置是不太一样的,如果一不小心没设置好就没办法调试了。

我最先用的是ram.icf,所以先说说这个。在IAR的例子中ram.icf是和那个.mac文件一起用的,ram.icf是在linker配置节设置,选择覆盖默认,然后查找你项目下的ram.icf文件,如下图:

另外那个.mac文件是一个宏文件,具体干嘛我就不知道了,俺比较菜。反正根据IAR示例项目是这么设置的:

然后设备记得选择和开发板一致的:

接着讲下flash.icf的设置方式,这个文件我一开始以为是多余的,是在今天晚上回家后,给开发板上电,开发板的LED不会闪烁,我才注意到.icf有ram和flash之分,于是我猜测ram是指在ram上调试,flash指在flash上调试,经过实验果然如此。设置flash.icf也费了一番周折。和使用ram.icf最大不同在于需要使用Flash Loader下载程序到目标板,否则J-Link会报错:

至于flash.icf设置到哪里去我就不重复截图了。另外使用flash.icf文件时不需要那个ram.mac文件。

另外要注意,以上所有设置都是基于IAR新建项目时默认的Debug配置修改的,如果使用Release配置作为基础进行修改,因为没有生成Debug信息,会导致程序无法调试,所以设置时要看清楚,当前项目的激活配置是什么。

:) 最后祝大家一切顺利,调试愉快。