十六、 观察堆栈
用户在命令行输入“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就能看到。