文章目录
- 背景
- 1.1 Trace 启动
- 1.1.1 Trace32 系统相关设置
- 1.2 Trace 常用命令
- 1.2.2 加在bin文件
- 1.2.3 寄存器常用命令
- 1.2.4 内存(寄存器)数据修改
- 1.3 变量相关命令
背景
Veloce是一款基于FPGA的高速仿真器,可用于验证芯片设计和软件开发, 它和 Trace32 都可以用于仿真联调。具体使用方法需要根据应用场景和需求进行设置和调试。一般来说,可以在Veloce中加载Trace32调试器,并通过Trace32对仿真过程进行监控和调试。同时,也可以在Trace32中加载Veloce仿真器,并通过Veloce对芯片设计和软件开发进行验证和测试。
1.1 Trace 启动
在芯片开发前期阶段(pre silicon) 也需要使用Trace32 来debug一些问题,这个时候通常是veloce与Trace32 simulation进行联合调试,其中 trace32的使用可以参考下面内容:
-
需要在veloce中保证cpu已经上电,并开始执行程序之后才可以启动trace32,如下:
-
Veloce 执行成功后,保持 cpu running 状态,然后执行命令
busb /veloce//xxx/tm32marm -c t32_xxx_jtag.t32
来启动 trace32, 打开trace32 后其界面如 图-1
- 在 trace32启动后,把启动的配置写成 cmm 格式的脚本,这样打开 trace32 软件后点击 File --> Run Script 打开你的启动脚本,如下图1-2 所示:
- 在配置脚本执行完成后,可以看到此时trace32 还不能使用,这个时候需要先进行 attach 操作,如下图 1-4:
- 在attach完成之后可以看到此时已经处于running 状态了, 如图 1-5
- 在执行trace32的命令时需要先将cpu stop住,如下图 1-6
1.1.1 Trace32 系统相关设置
可以在cmm脚本中进行系统的一些配置,如下简单列出一些:
system.cpu cortex-m7
– 设置CPU型号;system.memaccess nexus
– 运行时访问内存;system.cpuaccess enable
– 运行时访问cpu;system.reset
– 复位目标芯片;system.up
– 连接目标芯片(目标芯片会复位重启);system.down
– 断开目标芯片;system.attach
– 连接已经运行的目标芯片,不复位,常用于死机调试。
1.2 Trace 常用命令
1.2.2 加在bin文件
(1) 加载binary文件命令,把指定文件加载到指定地址,比如我们抓取到的故障现场的快照 ramdump。除了起始地址外,还可以加上一个range参数,作为加载范围。加载时会以binary的大小和range之间选小值作为限制。
data.load.binary DDRCS0_0.BIN 0x80000000
(2) 加载elf文件命令,把指定的elf文件加载到目标设备或者仿真设备的0x1488800000地址上去。elf文件在编译时会把源文件的路径加入到elf文件中,我们后面加上/nocode代表没有对应的sourcecode,trace32就不会去对应目录去查找源文件了。当然我们也可以通过/path来指定sourcecode目录。比如:
data.load.elf ../../vmlinux 0x1488800000 /nocode
(3) 加载elf文件到指定地址,并且指定了和该 elf 对应的 source code目录。
data.load.elf ../../vmlinux 0x1488800000 /path /home/xie/linux-4.4/
1.2.3 寄存器常用命令
(1)打印 D0
寄存器中的值。
PRINT Register(D0)
(2) 设置寄存器的值。这条的含义是设置 Non-secure bit
为1
。
Register.Set NS 1
如 设置CPSR寄存器为0x3C5
:Register.Set CPSR 0x3C5
, r.s
是 register.set
的缩写。
(3) 查看常用寄存器的值: Register.view
1.2.4 内存(寄存器)数据修改
data.set e:0xFFFC132C 0x0100
per.set e:0xFFFC132C 0x0100 //寄存器实际上也是映射到内存地址的
注意运行时修改需要加 e 参数
1.3 变量相关命令
Trace32 观察变量有多种方式,注意 e 参数 表示允许运行时读取内存:
-
方法一:
var.watch %e var1
… varn 观察,e 为 cpu 运行期间允许读取 -
方法二:
var.view %e var1
… varn 观察,e 为 cpu 运行期间允许读取 -
方法三:
data.dump e:(var1)
观察,e为cpu运行期间允许读取
此方法不算很友好,因为观察的是内存地址里的数据
推荐阅读:
https://blog.csdn.net/u010875635/article/details/84875567