trace32使用手册 - 图文 下载本文

Trace32软件使用

(亦可见TRACE32-使用.pdf 与 icd_tutorial.pdf)

一、 首先安装软件Trace32。

二、 启动软件,Trace32 ICD ARM USB;

2.1 启动之后的调试界面如下图所示。

Pic1. 调试界面

红圈中的“system down”指示目标板已经供电,如果目标板电源电压低或没有的话,红圈的区域会显示“POWER DOWN” 。TRACE-ICP通过 JTAG 接口的 1 脚检测目标板电压,电压范围应该在 1.8 到 3.3 伏之间。 如Pic1中红色字体所指示的那样, 调试界面分成五个区域, 从上到下依次是主菜单区、快捷按钮区、工作区、行命令输入区、行命令软件区、状态显示区。 主菜单区是各种菜单命令的入口区域。 快捷按钮区是各种常用命令的快捷使用按钮。 用户可以自定义主菜单和快捷按钮。 工作区是各种对话框窗口的显示区域。 行命令输入区是各种命令通过手动输入执行的区域。 行命令软键区是协助用户输入行命令的区域, 它提供所有行命令的软键输入方法。 状态显示区指示当前的调试状态。

2.2 JTAG 连接设置

该设置的作用是告诉调试界面目标板 JTAG 链路的设置情况, 以便能够正确连 接,

这些设置主要包括:

1、 选择要调试的处理器型号。

2、 是否有多个器件串联在同一个 JTAG 链路里,连接顺序如何,每个器件的JTAG IR

寄存器的宽度是多少。 (情况一)

3、 JTAG 时钟使用 TCK 还是 RTCK。TCK 由 TRACE-ICP 提供,一般情况下选用

10MHz。RTCK 是 TRACE-ICP 的 TCK 进入目标 JTAG 链路之后,从目标 JTAG 链路返回的时钟,它与目标处理器的时钟同步。一般情况下,具有睡眠模式的处理器多选用 RTCK 作 JTAG 时钟, 如 ARM926EJ-S。 (情况二) 4、 通过 JTAG 与目标连接时,是否要先复位目标板。JTAG 口上的 SRST 信号产生复

位信号。 (情况三)

5、 通过 JTAG 与目标连接时,是否要停止目标处理器运行。 (情况四)

从主菜单“CPU”中选择“System Settings…” ,打开如下图所示对话框。从“CPU”下拉菜单里选择要调试的处理器。

Pic2. System Settings 对话框

对于前面描述的第一种情况,多个器件串联在同一个 JTAG 链上,用户需要在图二十三所示的对话框中选择“MultiCore” ,打开 MultiCore 对话窗口,如下图所示。

Pic3. MultiCore 对话框

最上方的红框中的部分描述多个器件在一个 JTAG 链上的位置。所谓“JTAG 串联” ,就是一个器件的 TDI 和另一个器件的 TDO 相连,没有连接的 TDI 与 JTAG 口的 TDI 连接,没有连接的 TDO 与 JTAG 口的 TDO连接。图二十四中的红框中的图形形象地描述了这种连接。在图形中, “core”表示被调试的处理器,如 ARM926EJ-S, “IRPOST”表示连接在 JTAG TDI 和“core”的 TDI 之间的器件的 JTAG IR 寄存器长度的和,在“IRPOST”下方的编辑框内要填入这个和的值, “DRPOST”表示连接在 JTAG TDI 和“core”的 TDI 之间的器件的数目,在“DRPOST”下方的编辑框内填入这个数目值,“IRPRE”表示连接在 JTAG TDO 和“core”的 TDO 之间的器件的 JTAG IR寄存器长度的和,在“IRPRE”下方的编辑框内要填入这个和的值, “DRPRE”表示连接在 JTAG TDO 和“core”的 TDO 之间的器件的数目,在“DRPRE”下方的编辑框内填入这个数目值。填入上面四个值,就完成了 JTAG MultCore的设置。

对前面描述的第二种情况,JTAG 时钟的选择,可以通过 System Settings 对话框上的 JtagClock 列表框来实现,如下图所示。

Pic4. JtagClock 列表框

红框中的部分就是JtagClock列表框,通过这个列表框用户可以选择JTAG时钟是TCK 或RTCK,选择TCK的时候,顺便选择它的频率,5MHz或10MHz或25MHz,也可以手动在编辑框中输入频率值,如1MHz。

对前面描述的第三种情况,通过JTAG与目标连接时,是否要先复位目标板,用户可以通过下图中红框中的单选按钮进行选择。

Pic5. 系统复位选择

红框中的“EnReset”单选钮如果在前面打勾(选择),表示在TRACE-ICP 做 JTAG 连接时会做系统复位。

通过前面三种情况,用户完成了在 JTAG 连接动作之前的设置工作。接下来,用户就可以连接目标了。这个连接通过下图中的红框中的“Up”或“Attach”单选钮来完成。

Pic6. JTAG 连接

选择红框中的“Up”单选钮,JTAG 通讯连接之后,目标处理器会停止执行,选择红框中的“Attach”单选钮,JTAG 通讯连接之后,目标处理器处于它在 JTAG 通讯之前的状态,原来是运行的,那么,它现在仍然保持运行状态,这就是我们前面描述的第四种情况,如果用户在选择“Up”或“Attach”单选钮之后,在“Up”前面的小园框中有一个绿色圆点,表明JTAG通讯已经连接成功。如下图所示。

Pic7. UP 连接成功

如果选择“Attach”按钮并且目标处理器正在运行的话,在界面的状态显示区会有一个绿色的“Running”条显示,如下图所示。

Pic8. Attach 连接成功

可以通过点击红圈中的按钮停止程序执行, 以便观察程序当前的处理器执行状态。

三、 运行脚本文件

从主菜单区点击“File->Run Batchfile…”打开脚本文件选择对话框。如下图所视。 Pic9. 脚本文件执行菜单

Pic10. 脚本文件选择对话框

在图三十一所示的对话框中选择要执行的脚本文件,用户可以选择任意目录下的脚本文件。脚本文件的内容主要以调试命令为主。有关脚本文件的编写,请参考软件安装目录的“pdf”目录下的文件“practice_user.pdf”。脚本文件的 一般功能是自动执行 JTAG 设置、目标处理器设备寄存器设置、下载要调试的应用程序(支持直接写入 FLASH)、设

置调试源文件路径。

四、 观察/修改寄存器

从主菜单区点击“CPU->CPU Registers” ,打开内核寄存器窗口,如下图所示。

Pic11. 内核寄存器观察菜单

Pic12. 内核寄存器窗口

从Pic12所示的内核寄存器窗口, 用户能够观察处理器内核寄存器的值。 如果用户想修改某一个寄存器的值, 只要双击寄存器名右边的值, 在行命令输入区就会出现相应寄存器值修改的命令,紧接着输入十六进制的值(如,0x12345678)并回车就可以了。下图是以修改寄存器 R2 的值为例,在行命令输入区出现的命令。

Pic13. 修改内核寄存器

从主菜单区点击“CPU->Peripherals” ,打开设备寄存器窗口,如下图所示。

Pic14. 设备寄存器观察菜单

Pic15. 设备寄存器窗口

如上图所示的设备寄存器窗口在调试不同的处理器时是不同的。 如果用户要修改某个寄存器的值, 双击该寄存器的值, 在行命令输入区就会出现相应的设备寄存器修改命令,在命令后面输入要修改的值回车即可。如下图所示。

Pic16. 设备寄存器修改命令

上图的设备寄存器的值没有输入。

由于设备寄存器映射在处理器的存储器地址空间。所以,也可以用存储器修改命令修改设备寄存器的值,如 Data.Set。

设备寄存器窗口显示的内容是由一个后缀为“.per”的文件定义的。这个文件是文本的,通过文本编辑器可以编辑,因此,用户可以定制自己的设备寄存器窗口内容。用户在行命令输入区输入“Per.Program”和后缀为“.per”的设备文件, 就可以使自己的设备文件有效,设备寄存器窗口就会按这个文件进行显示。

五、 观察/修改存储器

从主菜单区点击“View->Dump…” ,打开存储器观察窗口,如下图所示。

Pic17. 存储器地址输入框

在地址输入框中输入要观察的地址,地址也可以用符号方式输入。输入地址之后点击“OK”按钮,打开存储器显示窗口,如下图所示。

Pic18. 存储器显示窗口

用鼠标双击某一个存储单元的内容,在命令行就会出现存储器数据修改命令提示,用户只要填入要修改的数据回车即可。如下图所示。

Pic19. 存储器修改命令提示

六、 下载程序

使用 data.load 命令实现程序下载的功能,如下图所示。

Pic20. 下载程序

上图中,“elf”指示所下载的程序的文件格式,“/v”指示程序下载完成之后进行校验。

七、 观察符号表

如下图所示,点击“View->Symbols->Browse”打开符号表对话框。 Pic21. 打开符号表对话框

符号表对话框如下图所示。

Pic22. 符号表对话框

在符号表对话框中可以通过单选钮“Symbols”选择要观察函数或是变量等符号。 在符号表对话框中双击变量符号会打开变量观察对话框, 双击函数名会打开程序列表窗口。

八、 打开程序列表窗口

点击“View->List Source”打开程序列表窗口,如下图所示。

Pic23. 打开程序列表窗口

打开后的程序列表窗口可以有下面几种形式。

Pic24. 找不到源文件的程序列表窗口

对于上图所示的情形,需要用 Y.SPATH 命令指定源程序路径。如下图所示。

Pic25. 指定源程序路径(其一)

Pic26. 带源程序的混合显示程序列表窗口(其二)

通过点击程序列表窗口上的“Mode”按钮可以切换混合和源码显示方式。

Pic27. 带源程序的源码程序列表窗口(其三)

如果用户没有通过 data.load 命令加载符号文件或者所加载的符号文件包含的调试信息不足, 用户将会看不到源码, 所得到的程序列表窗口可能如下图所示。

Pic28. 不带调试信息的程序列表窗口(其四)

九、 单步执行程序

单步执行程序有 step和step over两种形式。这两种形式的快捷键分别是F2和F3。Step的功能是单步执行一条机器指令或高级语言的一行,step over与step不同的地方在于它可以单步一条函数调用指令或高级语言函数。在混合显示模式,单步以机器指令为单位,在源码模式下,单步以源码程序行为单位。单步执行程序时可以屏蔽中断,如下图所示。

Pic29. 屏蔽中断

Pic29中红框内的单选钮IMASKASM和IMASKHLL选择之后,单步时就会屏蔽中断。用户也可以通过命令sys.o imaskasm on和sys.o imaskhll on来设置这两个选项。

十、 设置软件断点

设置软件断点可以在命令行输入命令 break.set

/soft 来实现,在命令中的
代表程序地址,可以是程序中的函数名等符号。如下图所示。

Pic30. 用命令设置软件断点

也可以通过在程序列表窗口的程序指令或源码旁边的空白处双击鼠标左键, 直 接在看到的程序上设置软件断点。如下图所示。

Pic31. 在程序列表窗口中设置软件断点

在Pic31中红色圆圈中的标示就是断点标示。另外,用户还可以在程序列表窗口中点击鼠标右键,打开辅助对话框,选择 Breakpoints->Program。如下图所示。

Pic32. 通过鼠标右键设置软件断点

如果在设置软件断点之前执行了 map.bonchip 命令, 并且所设置的软件断点在

所指的地址范围内,那么,通过双击鼠标左键和单击鼠标右键设置软件断点的方法所设置的断点将是 onchip 硬件断点。如果用户在 CPU 不能进行正确写操作的地址上设置软件断点,将会出现下图所示的错误提示。

Pic33. 软件断点错误提示

如果用户要察看所有的断点,可以从主菜单点击 Break->List 打开断点列表。如下图所示。

Pic34. 断点列表

在断点列表上, 用户可以用鼠标左键双击某一断点, 打开该断点所在的程序列表窗口, 用户也可以用鼠标右肩单击某一断点, 激活断点列表窗口的右键辅助功能,对该断点做使能/除能、删除、改变设置等操作。还可以从主菜单选择“Break->Set”打开断点设置对话框,如图五十六。在“address/expression”中输入断点的地址或者符号(点击叹号打开符号表从中选择) ,然后选择“implementation”下的“SOFT” ,最后,点击“set”完成设置。

十一、 设置 Onchip 硬件断点

设置 Onchip 硬件断点有几种方式。

一种是通过在命令行输入命令的方式。命令格式为:

break.set

/onchip
可以是源码符号。 如下图所示。

Pic35. 通过命令行设置 onchip 硬件断点

方法二是通过先执行map.bonchip 表示地址范围,然后再在属于这一范围的程序列表窗口中的指令或源码程序行上双击鼠标左键,来设置onchip硬件断点。

方法三是在程序列表窗口中的指令或源码程序行上单击鼠标右键, 打开右键辅助功能,选择“breakpoints…” ,打开断点设置对话框,从“implementation”下拉选项中选择

“Onchip”,然后,单击“Set”按钮,完成设置。如下图所示。

Pic36. 通过断点设置对话框设置 onchip 断点

一种方法是直接从主菜单中选择“Break->Set”打开断点设置对话框,如Pic36所示。在“address/expression”中输入断点的地址或者符号(点击叹号打开符号表从中选择) ,然后选择“implementation”下的“Onchip” ,最后,点击“set”完成设置。

十二、 设置数据观察断点

数据观察点的作用就是当程序对这个观察点所在的地址或地址范围进行读或写操作时,能够停止程序的执行。设置数据观察断点时, 可以指定数据的内容 (可以是位屏蔽的) 和类型 (字节、半字、字) ,也可以不设定。如果设定了,那么,只有在这些数据内容匹配的时候,程序才会停下来。 设置数据观察断点的命令格式如下:

break.set /readwrite|read|write {data.byte|word|long } 如下图所示。

Pic37. 通过命令行设置数据观察断点

设置完数据观察断点,可以通过点击主菜单“Break->List”打开断点列表观察断点的设置情况,如下图所示。

Pic38. 从断点列表观察数据断点的设置情况

上面的数据断点,用户也可以通过从主菜单点击“Break->Set”打开断点设置对话框,如图五十六所示,在断点设置对话框中设置。用户也可以在程序列表窗口或存储器观察窗口中点击鼠标右键,选择“Breakpoints…”打开断点设置对话框,在其中设置。上述数据断点是 Embedded-ICE 直接提供的功能,数量有限,只能设置一个。用户在断点设置对话框中可以点击“advanced”按钮,打开断点设置高级选项对话框,对断点的附属选项(计数、条件、命令)进行设置。如下图所示。

Pic39. 带高级选项的数据断点的设置

用户在图五十九中的“count”编辑框中输入计数值,在“condition”编辑框中输入条件,在“CMD”编辑框中输入所要执行的命令。输入完成之后,用户点击“set”按钮设置断点。用户从主菜单点击“Break->List”打开断点列表窗口观察所设的断点。如下图所示。

Pic40. 带高级选项的数据断点列表

使用高级选项,会影响程序的性能。

十三、 全速运行程序

在命令行输入“GO”命令,程序从当前 PC 开始实时全速运行。要全速运行程序,用户也可以通过主菜单点击“Run->Go”来实现。或者,用户可以按 F7 来全速运行程序。 程序全速运行时, 在状态显示区会有 “Running”指示。如下图所示。

Pic41. 全速运行状态指示

用户也可以在主菜单或程序列表窗口点击下图所示的红框中的按钮, 也可以实现全速运行程序。

Pic42. 全速运行程序的按钮

十四、 停止运行程序

用户从命令行输入“Break”命令,或者按快捷键 F8,都可以停止运行程序。用户也可以从主菜单下选择“Run->Break”,停止运行程序。用户也可以在主菜单或程序列表窗口单击下图中所示红框中的按钮来停止运行程序。

Pic43. 停止运行程序的按钮

十五、 观察变量

用户通过在命令行输入“Var.Watch”或从主菜单选择“View->Watch”打开变量观察窗口,如下图所示。

Pic44. 变量观察窗口

点击上图中的红框中的“Watch”按钮,打开变量符号列表对话框,如下图所示。

Pic45. 变量符号列表对话框

用户在变量符号列表对话框中用鼠标左键双击某一个变量名,把该变量添加到Pic45所示的变量观察窗口中。添加变量之后的变量观察窗口如下图所示。

Pic46. 添加变量之后的变量观察窗口

在变量观察窗口中的变量名上点击鼠标右键,打开右键辅助功能菜单,从中选择“Format…”,打开变量显示格式设置对话框。如下图所示。

Pic47. 变量显示格式设置对话框

在这个对话框中,用户根据所需要的变量格式进行设置,然后按“Apply”或“Ok”按钮确认。用户也可以在程序列表窗口中用鼠标右键点击变量名,打开右键辅助功能对话框,从中选择“Add to Watch Window”,直接将该变量添加到变量观察窗口中。另外,在程序列表窗口中,用鼠标左键单击变量名时,该变量的值会及时显示出来,如下图所示。

Pic48. 显示变量的程序列表窗口

十六、 观察堆栈

用户在命令行输入“Var.Frame”或者从主菜单选择“View->Stackframe”都可以打开堆栈观察窗口,如下图所示。

Pic49. 堆栈观察窗口

用户也可以在命令行输入“Var.Frame /Locals /Caller”或者从主菜单选择“View->Stackframe with Locals”打开带局部变量的堆栈观察窗口,如下图所示。

Pic50. 带局部变量的堆栈观察窗口。

十七、 在线 Flash 编程

用户可以将应用程序直接下载到目标板的片上或片外 Flash 存储器中。一种方法是通过 JTAG 扫描的方式编程,这种方式编程速度慢,一般程序大小在几十千字节的情况下使用。 另一种方法是通过一小段运行在目标机上的编程算法程序来完成,这种方法比较通用。这两种算法的区别从命令上体现出来。

这些命令包括:

Flash.Reset – Flash 定义复位,之前所作的所作的所有 Flash 定义全部清除。

Flash.Create – 定义目标板上的 Flash 存储器的类型,位置,总线宽度,扇区大小等信息。

Flash.Target – 只有需要在目标板上运行编程算法的情况中使用。当

Flash.Create 命令中的 Flash 类型是 Target 时, 指定需要通过在目标板上运行编程算法。该命令指定编程算法程序、下载到目标板的位置、数据结构的位置、数据区的大小。编程算法程序也可以不用该命令加载,而通过 data.load 命令单独加载。 Flash.Erase – 对所指定的 Flash 进行擦除操作。 Flash.Program – 对所指定的 Flash 进行编程操作。

Pic51. 通过 JTAG 进行 Flash 编程的例子

上图所示的例子是把所有的命令都写到了一个批处理脚本文件中的情况, 该脚本文件先擦除 Flash, 然后再编程。 文件中分号后面的内容是注释。 Data.load命令中的星号会打开一个文件打开对话框, 用户通过该对话框制定要编程的文件。

Pic52. 通过编程算法进行 Flash 编程的例子

十八、 T32使用之常用命令解释

1. 把调试用的.elf文件下载到目标板中

命令:d.load.elf *.elf 跟着直接输入elf或axf文件路径

说明:此命令把.elf文件中的调试符号信息下载到Trace32中,二进制代码下载到目标板中的代码段存储区域。如果代码段对应的存储体是SRAM,那么代码能够真实的下载到SRAM中(最常见的就是EVB板条死)。如果存储体是FLASH,由于FLASH程序的擦写需要特殊的命令序列,所以执行完下载命令后,虽然Trace32没有报错,但实际上代码没有下载进去。这个时候需要用cmm文件把代码下载到FLASH中去。 2. elf文件下载进去后,在调试之前还需要做一些准备工作

a. map.bonchip 0x0—0x3ffff(FLASH的地址范围)

如果程序下载到SRAM中,此命令不用执行,如果是FLASH,一般情况下都需要执行此条命令,否则无法设置断点,目前大多数CPU在ICD调试模式下只支持两个硬件断点。

b. y.spath + 路径(eg: y.spath d:\\source) 支持所加路径的C源码以及汇编代码显示。

3. 以上工作做完后,就可以利用Trace32强大的调试功能来调试程序了(可惜到现在

我们只是用到了其中的一部分)。

a. 查看ARM寄存器。一般使用在调试/查看汇编代码的情况下使用。

b. 查看存储器单元以及存储器映射的寄存器内容。注意:MSM5105的寄存器具有只读和只写属性(SoftWare Interface中有描述),对于只写属性的寄存器,虽然能够看到寄存器的内容,但不可信。

有时调试需要直接对寄存器或者变量进行赋值,可以双击对象,在命令行中加以更改。 c. 设置断点。断点调试应该是我们最常用的调试手段了,具体设置方法可以在代码处直接双击设置或取消设置,或者通过工具条设置:

点击Browse,选择要设置断点的函数。

d. 读出存储器区域的内容,存成文件,以便于和原文件进行比较。比如怀疑代码区内容被更改或者在软件部制作完整的.bin本时,都需要用到此命令。 Data.save.Binary FileName Address //保存二进制文件 e. STEP(F2)/STEP OVER(F3)/GO(F7)

f. 有时侯,Trace32不能正确显示临时变量的值,这个时候可以通过查看汇编代码的方式确定临时变量真实的值。

g. 查看函数的调用关系

有时需要弄清楚某一函数是哪个函数调用的,可以通过在此函数处设置断点,等程序停在此断点后,点击菜单view/Stackframe就能看到。

h. 但有时候采用上述方法无法看到调用关系,这是可以通过R14寄存器(子程序链接寄存器)来实现,eg:程序因为某种异常,跳到了中断向量表处。此功能对于定位程序重启之类的问题还是很有效的。 第一步:设置断点

第二步:查看R14寄存器

能够看到R14寄存器的值是0x1BA9C8,此地址就是调用处代码的地址,具体内容可以点击Indirect List查看:

第三步:查看调用代码

以上是在命令行中输入的一些常用命令,其他的很多功能我还没有用过,相信这些功能对于我们的调试还是很有帮助的。大家调试时可以多试一试,如果有意外的发现,还请和大家一起分享,共同提高我们对调试工具的掌握程度!

十九、 Trace32脚本

? Trace32使用中常见的脚本开关设置解释

sys.o.TURBO off//关闭时CPU会自动检测读取存储器的速度 sys.o.BigEndian off//设置数据存储格式为小端模式

sys.o.ResBreak on//在复位后进入Jtag顺序控制器,再进入调试模式 sys.o.SHOWERROR off//显示错误信息 sys.o.EnReset on//启用复位

sys.o.TRST on//打开测试访问端口,复位 sys.o.CFLUSH on//自动维护软件断点 ? Trace32的脚本基本语法

1、 先来个输出Hello World!实例

a. 新建一个文本文件,改扩展名为.cmm文件如:test.cmm

b. 打开Trace32软件,选择第二个,Edit file,并打开test.cmm文件 c. 在文件中输入print \点击上面的Save保存按钮,或点击Save&Run也行,即运行了第一个Trace32程序。

d. 输出的内容在左下角,可以看到Hello World!字样。 2、 脚本变量申明

a. 本地变量申明:

LOCAL &a &b &c//关健字为LOCAL,变量以“&”开头 ENTRY &a &b &c=&a*&b RETURN &c

b. 全局变量申明:

GLOBAL &State &Level//关健字为GLOBAL,变量以“&”开头 3、Trace32使用的基本控制语句

a. 条件控制最基本的IF-ELSE(注意Trace32关健字不区分大小写,也可以是if else) 如下: IF \ (

PRINT \ )

ELSE IF \ (

PRINT \ )

ELSE (

PRINT \这里不会运行(test)\ )

解释一下,Trace32里面没有then关健字,多行语句请使用括号\括起来。 b. 循环语句while和RePeaT &true=0!=1 &count=1 WHILE &true (

DO mem_test

PRINT \ &count=&count+1 )

ENDDO

-------------

RePeaT []

[WHILE []] or

RePeaT c. GOTO跳转语句

GOTO endloop//关健字为GOTO,endloop为标号,如: endloop:

print \这里为GOTO执行地\ GOTO 102.//102.为行号 4、Trace32使用的其它执行命令

a. 执行其它脚本文件 DO [] 比如有二个文件: a.cmm b.cmm

a.cmm内容为:do b

b.cmm内容为: print \

运行a.cmm文件

b. 调用子函数 GOSUB subr1 0x100 10. \调用子函数,关健字GOSUB, subr1为子函数标号,后面为调用的参数0x100 10. \ subr1://这里是子函数,以变量名加冒号,标号形式。 ENTRY &address &len &string Data.Set &address++(&len-1) &string RETURN

c. ENTER和ENTRY语句

enter &x print \

ENTRY &address

GOSUB func1 &address 1. ENTRY &result

PRINT “Result=” &result ENDDO

func1:

LOCAL &addr &size ENTRY &addr &size Data.Set &addr++&size 0x0 &retval=Data.Byte(&addr) RETURN &retval d. INKEY字符输入 INKEY INKEY &key IF &key==0x0d print \正确的输入\ else

print \错误的字符\

二十、 Trace32调试技巧

1. 调试步骤

连接好 Trace32-ICD 和目标板,注意不要带电插拔 JTAG ,容易损坏 Trace32 或目标板,然后依次打开 Trace32-ICD 和目标板的电源。 开启调试软件 Trace32

设置 CPU 类型,状态等,可以通过命令或菜单,命令如下:

sys.reset

sys.CPU ARM1176JZ ; 这里设置 CPU 类型

sys.up ; 启动调试,如果正常的话,状态为 system.ready; 否则会报错,需要检查 CPU 设置是否正确, TRACE32 和目标板的连接和电源是否正常

如果调试正常启动后,就可以下载编译好的文件(可以是 .elf .axf .binary 等文件)到 RAM 或 FLASH 中调试了

下载编译文件,命令如下:

data.load.elf E:\\source\\test.axf /PATH E:\\source

这里的 /PATH 选项是用来指明源代码的路径,在调试时 Trace32 就可以查找到源代码了。 这里 Trace32 会根据 .elf 文件里包含的目标代码起始地址加载到 RAM 的对应地址上,也可以指定加载到 RAM 的地址,但须和编译时的设置一致,否则程序不能正常运行。

注: Trace32 也可以把编译目标文件烧录到 flash 中进行调试,需要使用 flash 烧录相关命令,这里就不详述了。

然后就可以设置断点进行调试了,如:

break.set 0x0c008000

Trace32 的断点有两种,一种是硬件断点(在 FLASH 中的断点),另一种是软断点(在 RAM 中的断点);硬件断点需要 CPU 的支持,如 ARM7 最多只支持 2 个硬件断点,如果使用了软断点的话,就只能使用一个硬断点了;而软断点没有限制,可以设置很多个。

注:在 Trace32 中,如果要使用硬件断点,需要先设置好 FLASH 内存映射范围,如下命令:

Map.bonchip 0x0000--0xfffff ; 具体范围根据目标板 FLASH 的范围设置

设置好断点就可以正常调试了。 2. 源代码调试

在编译源码的时候,编译成 ( 加 -g 选项 )debug 版本的目标文件(可以是 axf/elf 等格式),用 Trace32 就可以直接进行源代码调试了。 Trace32 几乎支持所有的编译器的编译文件,具体格式参见 Trace32 的帮助。 axf/elf 等编译文件也叫符号文件,即在文件中把源码的符号表(函数 / 变量等)保存下来了,供调试时使用,但里面的符号表只是起定位作用,在调试时还需要有目标源代码,否则只能进行汇编级调试, Trace32

支持把机器码反汇编成汇编语言进行调试,而且不需要目标文件支持, Trace32 可以自动从 FLASH/RAM 中读取机器码,然后反汇编成汇编代码。

通过 data.load 命令把符号表文件 (.elf 等 ) 下载到目标机器上,指定源代码路径,就可以进行代码调试。

data.load.elf E:\\source\\test.axf /PATH E:\\source

3. 死机定位方法

在调试产品时会碰到设备死机的情况,如下在调试过程中出现问题,可以很方便的用 Trace32 来查看问题;但如果是设备在正常运行时(没有接 JTAG 调试)出现问题或死机就比较难定位问题了;这里可以通过 Trace32 的 attach 功能来进行调试,如下:

把出问题的机器和 Trace32-ICD 连接好(连接 JTAG ,测试机器需先预留 JTAG 口),然后开启 Trace32 ,设置好 CPU 类型,使用 sys.attach 命令就可以让 Trace32 和问题机器连接上了,正常连接后, system 的状态就变成了 running 或 up 。

接下来可以就可以直接进行汇编级调试了。

但一般情况下,汇编级调试很难定位问题,需要进行源码级调试,可以按如下操作进行:先把 Trace32-ICD 和一个同问题机器同类型的机器连接好,然后把符号表文件( .elf或.axf文件等)下载(通过 data.load 命令)到好的机器上,然后再把 JTAG 线从好的机器上拔下,连接到问题机器上;然后再用 sys.attach 命令让 Trace32 和文件机器连上,这样就可以进行源码级调试了。

如果不想这么麻烦,也可以这样操作,连接好 Trace32-ICD 和问题机器,打开 Trace32 软件,此时 system 的状态为“ system down ” , 然后通过“ data.load ”命令下载符号表文件 (.elf 等 ) ,由于 system 状态为 down , Trace32 会提示没有符号表文件没有下载成功,不用管它,因为虽然没有下载到问题机器的 RAM 上,但符号表文件已经下载到 Trace32 上了;然后再通过 sys.attach 命令让 Trace32 和问题机器关联上,这样就可以进行源码级调试了

二十一、 其它技巧

当完成前期基本的配置与打开窗口后可以保存设置。