【原创】Jlink在ADS下的配置说明及常见问题解决办法
Jlink在ADS下的配置说明及常见问题解决办法Zhaoxj
参考文档:
*1、TQ2440开发板使用手册V3.2_20121203.pdf
2、JLINK ADS 2440.pdf
注:1、本说明是针对S3C2440而写的。其他的配置基本一样,就是型号要改。我会在文章中说明,反正出现的问题都差不多。
2、针对裸板开发及笔记本的J-Link与开发板的连接及配置的一些问题进行总结跟解决。裸机下开发软件用的是ARM Developer Suite v1.2(ADS)。
3、重点在于JLink 的配置问题上,把我遇到的问题说明,欢迎补充!
最近搞了好几天的J-Link调试,找开发板的技术也没解决。在网上找了好多人家的经验。把自己一步一步的问题都解决了。其实还是卡在了最后一步上,网上也搜不到这样的问题,估计也是偶然性的问题,最后算是凭着运气搞定了吧。无比欣喜。我想对S3C2440用ADS开发及J-Link调试下的一些注意点做一下总结,也希望对看到的人有所帮助。欢迎分享!
一、编译源代码、生成bin
软件:ADS1.2 很简单,没什么要注意的。最后破解一下就可以。装完后在开始菜单下有一个ARM Developer Suite v1.2目录,打开,我们用的是里面的第一AXD Debugger(AXD)跟第二个CodeWarrior for ARM Developer Suite(IDE),IDE就是源代码编译生成bin的。
1、 IDE相关配置
a、新建工程,选可执行镜像。再新建或直接添加代码。代码的管理也很简单。
*b、建好的工程下有一个***.mcp(mcp是工程名,以后直接打开它即可,也可以直接拖拽)的窗口,点击DebugRel Setting(我们这里默认的是DebugRel,生成的bin文件也在那里面)
在弹出的设置对话框里做如下设置:
1、 Target->Target Setting要改Post-Linker(ARM fromELF)
2、Language Setting 里都改成ARM920T,其他型号的内核也做相应的改动。,默认是ARM7内核。
*3、Linker->ARM Linker在output选项卡中RO base改成0x30000000,Option选项卡中Image entry point改成0x30000000,Layout选项卡中Object/Symbol(2440init.0),Section(Init),Listing(List.txt)
点OK,配置好了!
c、接着点图标边上手写字的按钮,代表编译文件。如果没有错误则编译通过,生成bin文件。
注:*对于含中文路径的.mcp文件不能直接打开。
*对于提示路径错误的尝试点project->remove object code,再重新编译。
*想重新编译生成bin可以直接把工程目录下的.axf和.bin删掉。
二、 用JLink直接下载bin
a、安装SEGGERE,打开J-FLASH ARM,并配置(参考《TQ2440开发板使用手册V3.2》中“S3C2440裸机程序的开发步骤”一节)
b、连接好JLink并给开发板上电,JFlash软件中点击Target->Connect,再点击Open打开bin文件,点击Target->Program.
c、关掉开发板电源,断开Jlink与开发板的连接,并启动开发板。
注:下载到nand和nor中都可以,建议nor中,nand有位反转的问题。
(也有人说nor速度慢之类的。具体下载到nand跟nor有点不懂,有什么代码拷贝的问题,还有SDRAM什么的,下次有时间再查一下)
*三、用JLink配合AXD单步调试及运行
注:我自己碰到了打不开AXD的问题,用管理员身份运行ADS1.2就行了。
点击ADS配置按钮旁边的Debug(有个小虫子的图标),启动AXD。
在TQ的教程中把SEGGER安装配置好。然后把JLinkRDI.dll在options->configTarget设置中添加,点击config或双击,在CPU选项中把Allow …前面钩去掉,Little跟选择no reset。
这样才算正常。
然后是最关键的一步
添加2440init.txt文件
Setmem 0x53000000 0x00000000 32
Setmem 0x4A000008 0xFFFFFFFF 32
Setmem 0x4A00001C 0x000007FF 32
Setmem 0x53000000 0x00000000 32
Setmem 0x56000050 0x000055AA 32
Setmem 0x4C000014 0x00000007 32
Setmem 0x4C000000 0x00FFFFFF 32
Setmem 0x4C000004 0x00061012 32
Setmem 0x4C000008 0x00040042 32
Setmem 0x48000000 0x22111120 32
Setmem 0x48000004 0x00002F50 32
Setmem 0x48000008 0x00000700 32
Setmem 0x4800000C 0x00000700 32
Setmem 0x48000010 0x00000700 32
Setmem 0x48000014 0x00000700 32
Setmem 0x48000018 0x0007FFFC 32
Setmem 0x4800001C 0x00018005 32
Setmem 0x48000020 0x00018005 32
Setmem 0x48000024 0x008E0459 32
Setmem 0x48000028 0x00000032 32
Setmem 0x4800002C 0x00000030 32
Setmem 0x48000030 0x00000030 32
在Option->configure interface下的session file下点browse选择文件。
Option->processer我是没改,看到有说把semihosting钩去掉的,还有说点一下clear all的。暂时先不管。
注:我遇到的最关键的两个问题是:
1、CPU型号修改的问题
在options->configTarget中双击或config ARMUL把variant中设置为ARM920T,与ADS中一致。
2、无法运行的问题
就是搞了好几天的问题,最后根据提示在options->configTarget中ADD了一个JLinkARM.dll然后弹出了下面的对话框就OK了!
3、注意添加文件中文路径的问题!
其他常见问题(摘自网友,供参考,感谢!):
1、问题描述:用AXD+jlink调试程序时(开发板为mini2440),每调试一步发现发现相应寄存器的值没有半点改变。(前提已经添加了jlinkRDI.all文件,configuration为默认配置)
(在网上百度了查了一下,说默认配置就可以了,还有很多别的配置方法都说可行,但菜鸟我试过都不可以(可能仅对于我的情况),后面偶然找到飞凌FL2440给的文档中给的配置方法,试了一下果真可以了)
解决方法:1.添加jlinkRDI.all文件后,点击configure按钮。
2.选择CPU项,Allow sturction set simulation这里把勾去掉,同时选择小端模式(little endian),再到Reset strategy的选项里选择 No reset项,确定,重启即可
配置贴图如下:
2、总算找到原因了:
首先,打开4.02d 的jlink gdb server,最好设置通讯方式是Big endian(不知道为什么选little endian在调试时候比较容易跑飞-_-)
然后,断掉板子的电源,打开AXD(如果卡死在开启界面,就用任务管理器结束AXD的进程后重新启动吧,再启动后一般能行的)
这步是关键,进入AXD,由于没有没有检测到multi-ice会报错,这里不用理会它,在报错的界面,连接方式一定要选择NOHALT(或者进入 option -> configure interface 一定要NOHALT),不然会卡死在这里不停地loading target,或者在load镜像的时候会不停loading image。
板子重新上电,然后再按一下复位键,让板子在uboot的状态。 重新configure target, 选multi-ice 就是我们的jlink 4.02的rdi之后加载镜像就可以调试了^-^。
3、完整的解决办法。
第一. 使用 ADS 的 CodeWarrior 编译。使用 CodeWarrior 编译首先要新建工程,然后新建 C 后者汇编文件,添加文件要工程,然后要编译的问题了,
单独对 C 和汇编源文件进行编译,然后再使用 make 连接成一个可执行文件,不编译直接 make 会出现一些文件找不到,变量没定义的问题。
第二.可执行文件也就是 BIN 文件,这里说的是裸机程序,
下载到 Nand Flash 中的前 4k 中,(关于为什么是到 NandFlansh ,注意文件大小要小于 4k ,这里不多说,可以上网搜索网上比较多),
注意 2440 板启动是从 NorFlash 启动。注意这样下载的裸机程序因为没有操作系统所以需要一段汇编的启动代码去初始化堆栈,寄存器,中断向量表, C 语言环境等等
具体我也不是很清楚,需要的话网上很多分析启动代码的。启动代码编译后和 C 源文件一起连接成一个可执行文件,下载到板之里执行。
第三. CodeWarrior 设置,这里是最重要的步骤,打开 CodeWarrior ,选择 Edit 菜单,打开 DebugRel Settings ,
第一个 Target Settings –> Post-linker 选择 ARM fromELF ,
第二个设置 Language Settings->ARM Assembler(ARM 汇编器 ) 选择对应的 ARM 板型号, mini2440 对应 ARM920T ,
相应的设置好 C 编译器,如果要用到 C++ 同样要设置好。第三个设置的地方 Linker->ARM Linker 这个比较关键,
开始我一直没设置好的地方就是这里,因为手册上还是看别人的设置都没有说到,我一个人弄了好几天。
好了说重点,
ARM Linker 中选择 Output 在 RO Base 下选择地址 0x30000000 不同的 ARM 板可能不同,手册上应该会给出,
这个地址就是 SDRAM 的开始地址。然后选择 Options 选项在 Image entry point 中输入 0x30000000 ,
继续选择 Layout 选项,在 Object/Symbol 中输入你的初始化目标文件,
2440init.o 在旁边的 Section 中输入 Init ,最好 Listings 选项,这个应该可以不用,不过我没试验,先填一下落,
在 Listings->Image map 前打上勾, List file 中填一个 txt 文件,如 list.txt, 到这里这个大选择就弄好了,
继续下面的, ARM fromELF 中 Output format 中选择输出文件格式,选择 Plain binary 可执行的二进制文件,
注意下面 Output file name 要自己写一个 .bin 文件,如 led.bin 。如果这里不写文件名将找不到 bin 文件。现在 CodeWarrior 就设置好了。
第四. 第四如果要调试的会,还要初始化 SDRAM ,初始化 SARAM 的代码如下
Setmem 0x53000000 0x00000000 32
Setmem 0x4A000008 0xFFFFFFFF 32
Setmem 0x4A00001C 0x000007FF 32
Setmem 0x53000000 0x00000000 32
Setmem 0x56000050 0x000055AA 32
Setmem 0x4C000014 0x00000007 32
Setmem 0x4C000000 0x00FFFFFF 32
Setmem 0x4C000004 0x00061012 32
Setmem 0x4C000008 0x00040042 32
Setmem 0x48000000 0x22111120 32
Setmem 0x48000004 0x00002F50 32
Setmem 0x48000008 0x00000700 32
Setmem 0x4800000C 0x00000700 32
Setmem 0x48000010 0x00000700 32
Setmem 0x48000014 0x00000700 32
Setmem 0x48000018 0x0007FFFC 32
Setmem 0x4800001C 0x00018005 32
Setmem 0x48000020 0x00018005 32
Setmem 0x48000024 0x008E0459 32
Setmem 0x48000028 0x00000032 32
Setmem 0x4800002C 0x00000030 32
Setmem 0x48000030 0x00000030 32
把上面的代码粘贴带记事本中,并把名字重命名为一个 .iniz 的配置文件放在调试文件 .axf 同目录下。启动 CodeWarrior 并编译链接后按调试后,按 Alt + L 快捷键弹出 AXD 命令窗口,输入 ob ( obey ) name.ini 执行,这个你可以不这样只有你调试文件前执行了初始化文件 name.ini 。执行后选择 file 下的重新装载当前文件,就可以调试了。
遇到的问题
1. Failed initailizing heap region 。使用超级终端和 DNW 下载程序后( led.c )超级终端显示初始化堆栈失败,
解决办法,上面的第三步没有设置好,设置好第三步就没有问题了。
2. Processor ARM79_0 raised an exception.Cause: The processor was reset 。
这个问题需要设置 SEGGER J-link RDI V4.081 Status 中的 Congfiguration 中的 CPU 选项选择第一个不在重启 NO reset ,不过好像把问题 3 解决后这个问题也没有了。
先解决问题三。
3. Processor ARM79_0 raised an exception.Cause: Undefined instruction 。这个问题非常恼火,困扰我好久
解决办法上面步骤第四步。
4. 'c:/documents and settings/****/default-1-2-0-0.ses' could not be loaded 。这个问题是关于ADS 文件最好不要带中文路径。
重新加载动态链接文件就是那个。Dll 的文件,一般使用前你都会加载的。下面地址有详细介绍。
http://hi.baidu.com/jialaolian629/blog/item/12d0981102756429dd5401eb.html
4、今天添加文件的时候突然弹出“ at least one file could not be added to the selected targets ”一时我还以为是工程建错了后来上网搜了一下,发现是因为工程里已经添加了文件,重复添加文件错误。当然还可能是其他原因,但一般是因为文件重复添加到一个工程。
“Processor ARM920T raised an exception.Cause:The processor was reset”,这是“debug”后经常出现的问题。
解决方法:在AXD的命令行模式下(命令行模式:Alt+L),输入 obey d://ARM2410.txt(路径),回车,执行GO,再执行STOP,退出AXD,重进入AXD即可进入正常的调试状态了。
该文件信息:
初始化文件:ARM2410.txt
功能:加载调试文件前自动初始化系统时钟及SDRAM控制器等等
使用方法:
先将ARM2410.txt复制到ADS安装目录的bin目录下;
在ADS中单击“Debug”按钮启动AXD调试环境,先不要运行程序;
在AXD中打开“Options”-->“Configure Interface”菜单,在弹出的Configure Interface窗口
中选择“Session file options”页,选中“Run Configuration Script”项,然后单击“Browse...”命
令按钮去选择(ADS安装目录bin目录下的)ARM2410.txt文件,确定退出AXD即可。
5、如何禁止软件中断时的提示?
这需要在AXD中关闭“半主”调试。在AXD中打开“Options”-->“Configure Processor...”菜单,在
弹出的窗口中将“Semihosting”项的选择去掉即可。
注:实验中,由于EasyJtag不能使用,故使用**AG仿真器来仿真,其配置方法如下:
安装H-JTAG V0.2;
先运行H-Jtag server,然后打开AXD仿真环境,Options----Config Target选择H-Jtag安装目录下的H-Jtag.dll;
File----Load Image,然后就可以在线仿真调试了。
1)JLINK在AXD中调试的配置
使用ADS1.2的时候进入AXD调试环境回出现“ the session file could not be loaded”
解决方案:1:将工程文件放在不包含中文路径的目录下。
2:设置AXD->confing Interface 中general中的save and load default session前面的选项去掉。
一:在AXD->options ->configure interface 中的session file 中载入初始化文件,具体内如如下:
Setmem 0x53000000 0x00000000 32
Setmem 0x4A000008 0xFFFFFFFF 32
Setmem 0x4A00001C 0x000007FF 32
Setmem 0x53000000 0x00000000 32
Setmem 0x56000050 0x000055AA 32
Setmem 0x4C000014 0x00000007 32
Setmem 0x4C000000 0x00FFFFFF 32
Setmem 0x4C000004 0x00061012 32
Setmem 0x4C000008 0x00040042 32
Setmem 0x48000000 0x22111120 32
Setmem 0x48000004 0x00002F50 32
Setmem 0x48000008 0x00000700 32
Setmem 0x4800000C 0x00000700 32
Setmem 0x48000010 0x00000700 32
Setmem 0x48000014 0x00000700 32
Setmem 0x48000018 0x0007FFFC 32
Setmem 0x4800001C 0x00018005 32
Setmem 0x48000020 0x00018005 32
Setmem 0x48000024 0x008E0459 32
Setmem 0x48000028 0x00000032 32
Setmem 0x4800002C 0x00000030 32
Setmem 0x48000030 0x00000030 32
二:在AXD --〉options -〉configurate processor 把semihosting上的选项去掉 点击clear all.
三:第一次使用ADS时需要在AXD中配置J-LINK,在AXD>OPTION>CONFIGURE TARGET里选择J-LING的安装目录下的JLinkRDI.dll,然后点击CONFIGURE配置,将芯片的复位时间选为2000ms即可正常调试.
#########################################################################
配置J-Link为mini2440烧写bootloader
用J-Link其实不配置也能烧,只不过速度超慢
因为啥,因为不是在板子的内存里运行的。
初学者可能不会配置J-Flash,可以参考我的配置文件(慎用,烧BIOS容易出问题)。
【DownUrl】 J-Link烧写mini2440 BIOS配置文件
-----------------------------------------------------------------------------------------------------------------
自己配置的话,基本配置如下,主要是要参考光盘里带的init script,自己填入初始化选项中。
配置的主要过程如下:
菜单:[Options]-->[option settings]
1. Gneral : Connectioin to J-link --> USB : Device 0
2. Target Interface : 保持默认设置,不用动
3. CPU :
Core --> Auto, Little endian
Use target RAM(faster)-->Addr:40000000 64KB(主要是这个,不用的话就太慢了)
初始化序列(Init sequence)按下面的填,也是从H-Jtag的script扒出来的,我简单做了下注释。
##-------Action-----Value0------Value1
Setmem 32-Bit 0x53000000 0x00000000 ; pWTCON , 看门狗定时器控制寄存器
Setmem 32-Bit 0x4A000008 0xFFFFFFFF ; INTMSK , 中断屏蔽寄存器
Setmem 32-Bit 0x4A00001C 0x000007FF ; INTSUBMSK , 针对INTMAK具体化的一个中断请求屏蔽寄存器
Setmem 32-Bit 0x53000000 0x00000000 ; pWTCON , 看门狗定时器控制寄存器
Setmem 32-Bit 0x56000050 0x000055AA ; rGPFCON , Port F control
Setmem 32-Bit 0x4C000014 0x00000007 ; CLKDIVN , CPU时钟分频控制寄存器
Setmem 32-Bit 0x4C000000 0x00FFFFFF ; LOCKTIME , 锁时计数寄存器
Setmem 32-Bit 0x4C000004 0x00061012 ; MPLLCON , MPLL寄存器
Setmem 32-Bit 0x4C000008 0x00040042 ; UPLLCON , UPLL寄存器
Setmem 32-Bit 0x48000000 0x22111120 ; Bus width & wait status
Setmem 32-Bit 0x48000004 0x00002F50 ; Boot ROM control
Setmem 32-Bit 0x48000008 0x00000700 ; BANK1 control
Setmem 32-Bit 0x4800000C 0x00000700 ; BANK2 control
Setmem 32-Bit 0x48000010 0x00000700 ; BANK3 control
Setmem 32-Bit 0x48000014 0x00000700 ; BANK4 control
Setmem 32-Bit 0x48000018 0x0007FFFC ; BANK5 control
Setmem 32-Bit 0x4800001C 0x00018005 ; BANK6 control
Setmem 32-Bit 0x48000020 0x00018005 ; BANK7 control
Setmem 32-Bit 0x48000024 0x008E0459 ; DRAM/SDRAM refresh
Setmem 32-Bit 0x48000028 0x00000032 ; Flexible Bank Size
Setmem 32-Bit 0x4800002C 0x00000030 ; Mode register set for SDRAM
Setmem 32-Bit 0x48000030 0x00000030 ; Mode register set for SDRAM
4. Flash
取消"Automatically detect flash memory",然后"Select Flash Device"。
mini2440的Flash型号是:SST39VF1601,选中之后不要改写任何数值。
5. Production
Erase, Program and Verify enable.
6、Jlink提示问题:
买了个J-LINK仿真器,拿到手就写了个最经典的程序:跑马灯。不幸的是不能全速运行,只要全速运行,就提示:“Processor ARM79_0 raised an exception.Cause: The processor was reset”
系统老是自己复位,原以为是ICE那里设置不对,折腾了半天。突然想到watchdog,看了一下数据手册,在默认情况下watchdog是允许的。。。。把watchog禁止了就可以了。
可以这样关闭watchdog:
ldr r0,=0x53000000
mov r1,#0x0
str r1,[r0]
或者是在jlink RDI中,有一个cpu的选项签,这个选项签中的下拉菜单中,选择noreset。就不会提示这个了。
关于对semihosting的理解
semihosting是在调试器里使用,一旦程序semihosting是在调试器里使用,一旦程序使用semihosting,则代码(库函数)直接产生软件中断,调用主机上的函数,用于对主机的操作。例如:程序中可以使用printf()函数,当执行该函数时,代码产生软件中断,调试器捕捉到该特定中断后,调用主机上的函数执行,最后在调试软件的界面中显示该函数的结果。换句话说,semihosting提供了与主机的交互功能,方便调试。直接烧到板子里是用不了的,因为没法与主机通信了。
Semihosting,顾名思义,就是"半主控",意思就是说,运行在target board上的程序利用主机上的facilities的一种程序调试方式,主要是debug目标板时,利用主机的输入输出设备,例如在AxD的console上打印相应的调试信息或者用主机的键盘输入相应字符作为target上的程序的输入。
C/C++ code默认是可以使用console的,例如,如果只包含C/C++的程序采用ARMulater模拟,就可以直接使用console作为程序的输出设备;如果程序包含有汇编代码,要使用主机设备的话,必须采用semihosting SWI方式。Semihosing SWI(以下简称SHS),必须有相应的debug agent的支持,才能截获SHS,并向software debugger(AxD)请求相应的服务,如打印字符或者接受字符输入,这样的agents包括:
1)ARMulater
2)debug monitor(Angel)
3)MultiICE
由于调试裸板或者没有Angel可以供目标板使用的时候,主要还是要借助仿真器进行调试,所以第三种方式最为常用,下面主要就这种方式进行介绍。当然,UART也是一种最常用的调试接口,但是,使用Semihosting,可以独立地调试各个硬件模块的逻辑功能,确保各段代码正确后再进行集成,相应地省去了每次都要配置UART和另开一个hyperterminal观察调试信息。所以,我在开发的时候倾向于使用semihosting来调试相关的代码,这些代码使用C或者C++编写,也就是说和硬件配置关系不大。
7、ARM ADS中的AXD 调试经验集锦 发布时间:2007-07-05 11:01:23
1、如何设置AXD连接的Target。
在菜单的Configure Target…选项中可以设置。一般选择MutiIce或者ARMUL两种。
ARMUL是一种ARM的模拟器。一般的算法或者一些无需和硬件中断等设备打交道的程序都可以通过这个进行调试。使用上非常简单。
我们一般上板子进行调试都是通过MutiICE来进行。在刚刚安装了系统的时候,菜单中没有MutiICE,需要我们手动添加:
点击ADD按钮,然后在弹出的文件浏览中,选择“C:\Program Files\ARM\Multi-ICE\Muti-ICE.dll”(默认安装的话)。然后点击“确定”。这样就把MutiICE的调试接口安装上了。
2、如何保存当前的调试现场。
我们在调试过程中,经常需要在不同的地方设置断点、设置Watchpoint或者打开很多source文件。但是,一旦我们关闭了AXD,所有的工 作都白费了。
当我们再次打开AXD后,我们得到的仍然是没有任何断点、只打开一个entry文件的调试环境。这里介绍一种方法可以自动保存上一次的调试现 场(寄存器的数据都是保存的)。
Options->General tab. 这里确认Save and load default sessions 选项 是选中的。然后打开Session File,确保Rselect Target和Reload images 选项是选中的。
在设置保存后,我们在关闭AXD后,再次启动,就会自动加载上次的image,恢复寄存器了。
如果需要保存多个现场,那么就在设置保存后,在File菜单中选择Save Session来进行保存。
不过注意,保存的路径中不能 有空格和特殊字符。最好保存在ClearCase上。
在需要恢复现场的时候,只需要Load Session就一切OK。你以前辛辛苦苦设置的断点、 Watchpoint全都回来了。
3、不能设置断点,怎么办?
不能设置断点时,我仅知有几种解决方案,这里列举一下:
A:清空CPU的Vector Catch 。
在Options->Configure Process..中清除。
B:Run一下,马上暂停。
这种方式对要求不高的断点(诸如设置在APP层中的断点)比较合适。方便。
C:清除以前的断点。
一般发生在Flash调试的情况。首先清除以前的断点,然后才能设置新的断点。
D:命令行 spp vector_catch 0
其实和A相同。如果写在开机script中,那么就可以自动排除开机无法设置断点问题。
E:启动AXD的时候使用—debug这个参数,这样就可以添加一个自动断点在Main()上。
4、如何不reload image就可以重新从头开始调试。
很多时候我们需要让代码重头跑起来复现一个bug。但是,一般来说,都是reload一下。如果image比较小还可以忍受,但是想660那种16M左右的巨型image,这种代价就未免太大。这里介绍几种我所知道的方法,可以从头开始调试:
A:设置Current寄存器。
点击 打开process register->current 组。设置pc为0 , cpsr为 svc模式下。关闭Thumb模式。这时F5即可运行下去。
B:运行脚本
这种方式速度更快,也方便。上上之选。
setpc 0
sreg cpsr 0xd3
5、如何无条件跳转?
一般这种事情最好是在同一个函数中,某条语句无条件跳到另一条语句上时使用。最好不要跨函数使用(否则有堆栈错误,很难查的)
把光标定在需要跳转到的代码上,右键菜单execute->Set Next Statement .
6、AXD有没有什么辅助工具?
有的。IDA pro ,非常好的axf解析工具。可以统计axf文件中的函数、全局变量、调用关系等。
界面非常友好,代码界面可以清楚看出函数引用关系、变量初始话、变量引用、修改的统计。
可以说,IDA Pro是汇编级的Source insight 。大家可以在网络上下载它的最新版安装使用。
7、如何调试需要加载到Flash上的代码
以下是我的经验:
1、在有jTag调试口的板子上Download一个版本。
2、选择 File->load debug symbols 。然后选择CodeWarrior上Release版生成的那个AXF。
3、现在就可以调试Flash上的程序了。和Debug完全一样。不过注意,在这种情况下,一般只能设置2个断点。
8、使用fromelf命令
fromelf命令可以对我们生成的axf文件进行进一步操作的命令。
诸如:
从axf文件中抽出二进制代码:fromelf –bin –output a.bin a.axf
从axf文件中抽出二进制代码:fromelf –m32 –output a.s32 a.axf
9、 FAQ
Q: 生成的ram方式的redboot映像文件,应该使用什么工具调试编译的ram方式的redboot。
用ADS调试工具只能加载.axf格式的文件
A: 用ADS还可以加载bin文件(File->Load Memory From Memory...),可以使用ADS命令行或脚本初始化SDRAM
load bin文件时需要指定载入地址,对于s3c44b0x通常为0x0c040000,即在相应的ldi文件中指定的
SECTION_rom_vectors (ram, 0x0c040000, LMA_EQ_VMA)
将BIN程序Load后,将PC指针修改为0X0C040000即可
8、天嵌公司的ADS常见错误文档
1. 遇到动不动就有*.o文件找不到的情况,而且通常都是开始的时候可以正常LINK,而经过若干次重新LINK后却找不到(即使只是在代码中加一个无关紧要得空格),新建个工程,将目前的.C和.H文件原封不动加进去,再LINK就没有出现这种情况,所以估计可能ADS本身LINK的问题不知道你所说的是不是也是这样的问题。2. AXD出现.ses找不到错误:工程目录不可以是中文,修改为英文,重新编译,若还不行,AXD-options-configure target-双击ARMUL-OK-OK,file-load image-找到相应.axf文件。即可。此法每次重复。根治:通过比较c:\documents and settings\****\default-1-2-0-0.ses调试前后的变化,发现问题就出在这里,该文件是一个初始配置文件,调试目标文件之后,该文件就带上了调试目标文件的路径等多余信息,所以,AXD无法识别,自然就出现了'c:\documents and settings\****\default-1-2-0-0.ses' could not be loaded的提示。我们只要在配置完成之后,把该文件的属性该为 只读,那么就不会在调试的过程中被修改了,以后也就不会出错了。注意文件的引导路径(找准Startup.s的路径),default-1-2-0-0.ses反复删几次细心比较下就明白了。
3. ADS1.2在LINK时找不到Os_cpu_a.o:复制工程到硬盘后,必须去除工程所有文件夹及文件的只读属性.如果项目移动到另外一个文件夹后,在重新编译之前,要选择菜单project --> remove object code ... ,在弹出的对话框中按"ALL Tagerts"来删除原来编译生成的*.o文件,才能编译成功.
ADS1.2编译时,出现找不到一个不存在目录下的目标文件(*.o)
编译一个COPY到硬盘上的一个工程,出现以下的fatal error message:
Error: (Fatal)L6002: Could not open file f:\工作备份\20061204\hc_DTMF3\DVS-ATM_data\RelInFLASH\ObjectCode\Startuo.o.
“f:\工作备份”这个目录我根本没有,“hc_DTMF3\DVS-ATM_data”这个目录是源代码的目录,但是我是解压到桌面上的,为什么为出现什么“f:\工作备份”呢,还通不过编译?
分析原因:以前在其他计算机上编译时造成的。
解决措施:复制ADS工程到硬盘后,必须去除工程所有文件夹及文件的只读属性.如果项目移动到另外一个文件夹后,在重新编译之前,要选择菜单project --> remove object code ... ,在弹出的对话框中按"ALL Tagerts"来删除原来编译生成的*.o文件,才能编译成功.
1 Patttern *(RW) only matches removed unused sections.
出现这个这个警告的情况我遇到过两种,一种是定义的全局变量在引用时拼写发生了错误,改过来就解决了。另外一种情况没有知道程序发生了什么错误,这个时候可以在Edit/DebugIn××× Settings..., ARM linker Options下的Remove unused section下的几个段中取消remove就可以了,当前这个警告是说RW,所以把Read Write的勾去掉就可以,其他两种情况同理了。:)
2 有时候会出现打不开某个文件的情况
Project/Remove Object Code ,如果还不行,退出,工程不要放在中文目录下,换一个目录,再Project/Remove Object Code ,问题就OK了。
3 程序执行时发生取数据终止
在uCos_II环境下,运行zlg的gui,发生取数据终止,后来发现是gui任务的堆栈太小,原来64,改为1024,问题解决
4:刚学习使用ADS软件,在CODE WARRIOR FOR ARM使用的过程中,发现有些*.MCP文件无法通过双击打开。原来是该软件对中文路径不太支持,但是我们还是可以通过拖拽,和通过CODE WARRIOR FOR ARM的菜单 FILE--OPEN--这两种方式打开。
5. 果你在WIN7 X64下安装ADS就会有,
Warning : L6301W:Could not find file C:\Program Files .
Error : L6218 : Undefined symbol .......
好像库都找不到了。
问题就出在Program Files (x86)那个括号上。ADS是1997年的产品,对本地化支持不好。
这种情况只会出现在WIN7 X64的系统下,x32下没有Program Files (x86)的目录,不会有这样的问题。
所以ADS的所有访问的路径,不能有文中或特殊符号。
解决方法:你把ADS安装在C根目录下就可以。比如:C:\ARM\ADSv1_2。
还有运行ADS时需要以管理员身份启动。