【ARM Trace32(劳特巴赫) 使用介绍 2 -- Trace32 cmm 脚本基本语法及常用命令】
Trace32 CMM概述
CMM(Command Macro Model)是由Lauterbach公司定义的一种脚本语言Q,用于控制它的TRACE32调试器系列。CMM脚本通常用于自动化调试或测试任务,例如加载代码,配置目标硬件,运行测试等。
1.1 Trace32 系统命令SYStem
SYStem(缩写sys)是CMM脚本中的一条命令,它用于控制和查询目标系统的状态。以下是一些常见的sYstem命令用法:
- RESet:复位Debugger,防止残留以前的配置;
- SYStem.CPU
:设置或查询当前的CPU类型。例如:SYStem.CPUCORTEX-M3; - SYStem.Up:对处理器进行复位并进入debug模式,比如在复位向量表处halt住处理器,这条命令执行之后就有可能访问memory和寄存器了,但是有些设备在复位时是不能通过JTAG进行访问的,这个时候就可以用下面一条命令了;
- system.attach:也可以用来连接已经运行的目标芯片,不复位;
- SYStem.Mode:设置或查询系统模式(例如单步模式,运行模式等);
- SYStem.JtagClock:设置或查询JTAG时钟频率;
- SYStem.Down:关闭目标系统;
- SYStem.Mode:设置或查询系统模式(例如单步模式,运行模式等);
- system.cpuaccess enable — 运行时访问cpu。
- SYStem.Option:用于配置各种系统选项,例如:
- SYStem.Option ResBreak OFF:关闭重置断点;
- SYStem.Option.BigEndian[ON|OFF]:大小端控制,Cortex-A/R不使用,Arm11自动检测;
1.1.1 Trace32 SYStem.CONFIG
该命令用于配置目标系统的各种参数。具体的配置选项因目标系统的不同而不同。其中一些常见的配置参数包括:
- SYStem.CONFIGDCache:设置或查询数据缓存状态;
- SYStem.CONFIGMMU:设置或查询存储器管理单元状态;
- SYStem.CONFIG MMU ON:命令用于开启目标系统的存储器管理单元;
1.1.1.1 SYStem.CONFIG DAP
- SYstem.CONFIG DAP:用于配置DebugAccessPort(DAP)。DAP是ARM Cortex系列处理器中的一个组件,它提供了一个通过JTAG 或SWD接口访问处理器内部和处理器外围设备的机制。用于选择DAP的工作模式(JTAG或SWD)以及配置其他DAP相关的参数。
- SYStem.CONFIG DAP JTAG:设置DAP为JTAG模式,使用JTAG接口就可以访问TestAccessPort controller(TAP),TAP中有一 个状态机,这个状态机根据JTAG的控制信号可以对TAP中的指令寄存器和数据寄存器进行访问,JTAG接口被5跟信号线控制:
- nTRST(reset)
- TCK(clock)
- TMS(state machine control)
- TDI(data input)
- TDO(data output)
- SYStem.CONFIG DAP JTAG:设置DAP为JTAG模式,使用JTAG接口就可以访问TestAccessPort controller(TAP),TAP中有一 个状态机,这个状态机根据JTAG的控制信号可以对TAP中的指令寄存器和数据寄存器进行访问,JTAG接口被5跟信号线控制:
JTAG接口可以通过菊花链(daisy-chain)的方式控制多个TAPs,如果要访问链中的某一个TAP,就需要给链中的其它TAPs发送BYPASSpattern,因此debugger 需要知道链中TAP的具体位置,TAP的位置可以通过下面4个命令来定义:
- DRPOST
:定义TAPs的个数,每个TAP占用DRPOST的一个bit,默认位0; - DRPRE
:同上; - IRPOST
:所有 TAPs 中指令寄存器的位数,TAR与TDI之间; - IRPRE
:所有 TAPs 中指令寄存器的位数,TAP与 TDO之间;
如果不确定上面4个寄存器的配置可以通过SYStem.DETECT.DaisyChain命令来获取(目前很少使用菊花链的方式)。
-
SYStem. CONFIG DAPIRPOST 4;
-
SYStem.CONFIG DAP SWD:设置DAP为SWD模式;
-
SYStem.CONFIG DAP Clock
:设置DAP的时钟频率。 -
SYstem.CONFIG.COREDEBUG.Base
:如果使用Cortex-A 或者 Cortex-R core,需要指定debug 寄存器块的基地址。
在Arm soc-400系统中使用SYStem.CONFIG命令可以为memorybusses配置0-255个端口号,如下:
AHBAPn.Port <port>
APBAPn.Port <port>
AXIAPn.Port <port>
在Arm soc-600使用的是基地址而不是端口号了,如下:
SYStem.CONFIG.APBAP1.Base DP:0x1000000 ; first APB AP: index 1
SYStem.CONFIG.APBAP2.Base DP:0x2000000 ; second APB AP: index 2
SYStem.CONFIG.AXIAP.Base DP:0x3000000 ; first AXI AP: index 1 (implied)
Data.dump APB1:0x80000000 ; use access class of first APB AP
Data.dump APB2:0x90000000 ; use access class of second APB AP
Data.dump AXI:0x30000000 ; use access class of first AXI AP
SYStem.CONFIG参数太多,后面会有专门章节介绍。
1.1.2 SYStem.MemAccess
该命令用于配置访问目标系统内存的方式。通常情况下,可以通过JTAG接口直接访问目标系统的内存,但在某些情况下(比如目标系统处于低功耗模式或者内存被锁定),可能需要通过其他口途径(比如通过CPU或者特定的硬件接口)来访问内存,
语法:
SYStem.MemAccess mode 选项如下表:
mode | description |
---|---|
AHB/AXI/APB/...(SoC-600) | 根据具体的实现,SOC600有DAP,但不用于访问run-time memory |
DAP(SoC-400) | 通过AHB/AXI进行非侵入式的run-time memory访问 |
Enable | 激活memory访问 |
Denied | 禁止memory访问,当cpu在执行程序的时候 |
StopAndGo | 暂时halt cpu,然后去进行memory访问 |
NEXUS | 通过Nexus 接口来访问memory,为MAC7xxx处理器设计 |
1.1.3 SYStem.Mode
控制或改变系统运行模式的命令。
- SYStem.Mode Down:禁用调试器,CPU的状态不会改变;
- SYstem.Mode Nodebug:同down,禁用调试器,CPU的状态不会改变;
- SYstem.m.preprare:命令通常与SYstem.m.system命令一起使用;
- SYstem.m.system:负责实际的内存初始化过程,而sYstem.m.prepare则在这个过程开始之前被调用,用于准备必要的硬件配置;
- SYStem.Mode Go:通过复位线复位目标,初始化调试端口(JTAG、SWD、cJTAG),并开始进程执行。对于重置,重置线必须连接到调试连接器;
- SYstem.Mode Attach:不会发生重置,CPU状态(正在运行或停止)不会更改。调试端口(JTAG,SWD,cJTAG)将被初始化。 执行此命令后,例如,可以使用Break命令停止用户进程;
- SYStem.Mode StandBy:通过复位线使目标保持复位状态,并等待检测到电源。对于重置,重置线必须连接到调试连接器。一旦检测到电源,调试器就会恢复尽可能多的调试寄存器(例如片上断点、矢量捕获事件、控制),并从复位中释放CPU以启动进程执行。检测到CPU断电时,调试器会自动切换回待机模式。这允许调试电源周期,因为调试寄存器将在上电时恢复。注意:通常只能在CPU运行时设置片上断点和矢量捕获事件。要设置软件断点,必须停止CPU。
- SYstem.Mode Up:通过复位线复位目标,初始化调试端口(JTAG、SWD、cJTAG),停止CPU,并进入调试模式,相关寄存器被恢复为默认值。对于重置,重置线必须连接到调试连接器。所有寄存器的当前状态都是从CPU读取的。
- SYstem.Mode Prepare:reset目标处理器,可以通过重置信号(resetline)或者CPU中特殊的reset寄存器来实现。之后,将提供对 CoreSight DAP接口的直接访问。对于reset,reset line必须连接到调试器。
调试器将初始化一些debug 端口(JTAG,SWD,cJTAG)以及CoreSight DAP接口,但是并不连接到CPU。这种Mode可以用于 一些不需要debug CPU或者绕过CPU的场景,调试器直接通过内存总线(memory bus),比如AXI,AHB或者APB等,直接通过CoreSight DAP的内存访问端口,比如:
- 调试器绕过CPU,直接访问物理内存。如果改映射存在,内存应该在被访问前,被初始化;
- 调试器访问外设,例如,在调试模式下,停止CPU之前配置寄存器。可能需要先对外设进行计时和供电,然后才能访问它们;
- 第三方软件或一些特殊调试器使用TRACE32 API通过TRACE32调试器硬件访问调试端口和DAP
1.1.3.1 TRST-Resets the JTAG TAP controller and the CPU internal debug logic
下图为Trace32 工具为ARM debug设计的 JTAG pin 脚图:
其中,TRST和SRST信号是可选的。
Test Reset信号用于JTAG Test Access Port(TAP)的异步重置。它将 reset TAP的状态机,以及绝大部分ARM系列的debug相关寄存 器。从调试器的视角,TRST信号从调试器输出至目标板。它是低电平有效。
1.1.3.2 SRST- Resets the CPU core and peripherals
System Reset,低电平有效,用于reset 目标系统。这个信号同样也可以用于调试器检测目标处理器是否处于reset状态。该信号可以是输入或者输出。
1.2 Trace32数据访问
访问类型(Access Class)被Trace32的PowerView用于指定访问内存、外设的寄存器、可寻址的core资源、协处理寄存器以及Trace32的虚拟内存等。
在Trace32中,寻址包括两部分:访问类型+地址,比如:
Data.Dump type:0x1234567
其中type为访问类型,0x0123456为访问的地址,二者之间用冒号:连接。访问类型可以是:
访问类型可以是:
-
程序内存类型(program memory class)
-
数据内存类型(data memory class)
1.2.1程序内存类型 Program Memory Classes
通常使用字母P(Program)来表示程序内存类型(可省略),比如以下命令:
List P:0x4568
List 0x4568
P可以省略,上述两个命令都是在程序地址为0x4568的地方,打开源代码窗口。
除了P类型之外,还有R,T和V等程序内存类型,这些类型是处理器架构用来指定不同指令集的编码格式:
程序内存类型 | 架构 |
---|---|
R | 针对ARM架构,表示ARM指令集编码 |
T | 针对ARM架构,表示THUMB指令集编码 |
V | 针对POWER架构,表示VLE指令集编码 |
可用的程序内存类型取决于当前所使用的处理器架构
1.2.2 数据内存类型 Data Memory Classes
通常使用字母D(Data)来表示程序内存类型(可省略),比如以下命令:
Data.dump D:0x6770
Data.dump 0x6770
D可以省略,所以上述两个命令都是同一个操作。
此外,对于一些特殊场景,还可以使用其他的字母来表示内存类型,比如x表示针对MMDSP架构,使用x总线来访问数据内存。比如其中修饰内存地址的SD就代表“Supervisor Data”。
如果访问类型被忽略,Trace32将会使用默认的访问类型。比如直接对内存地址0x4008000进行Data.dump,则可以发现默认使用了ZSD的访问类型进行修饰,关于ZSD代表何种类型,将在下文中解释。
1.2.3处理器访问类型Access Classes for Core Resources
以下是一些处理器资源常用的缓存访问类型:
缓存访问类型 | 解释 |
---|---|
IC | Instruction Cache指令缓存 |
DC | Data Cache数据缓存 |
L2 | Level 2 Cache二级缓存 |
NC | No Cache(access with caching inhibited)限制缓存的访问 |
比如下面这些指令:
Data. dump DC: 0x6770
显示地址0x6770处的16进制数据转存,DC表面数据从Data cache上获得的。
Data. dump NC: 0x6770
NC表示不经过缓存,数据是从物理内存 physical memory上读取的。
1.2.4 访问类型属性 Access Class Attributes
访问类型属性 | 解释 |
---|---|
E | 运行时访问,优先采用非侵入性访问,如果不支持,就是侵入性访问 |
A | 物理地址的访问,绕过MMU(MMU可以将虚拟地址和物理地址进行转换) |
S | Supervisor 内存,特权访问 |
U | 用户内存,非特权访问 |
Z | 安全访问(比如ARM的TrustZone) |
N | 非安全访问 |
比如以下命令:
Data.dump A:0x29876
A同上,DC表示 Data Cache,表示dump 物理地址为0x29876上的数据,数据的来源为Data Cache
1.2.5访问类型扩展
如果用户忽略指定访问类型,Trace32将根据经验进行填充,填充的规则基于:
- 当前CPU的上下文context(架构特有的)
- 使用的窗口类型(比如Data.dump是显示数据内存,List.Mix窗口是显示代码内存)
- 所加载应用的符号信息(比如代码和数据的结合)
- 使用不同的指令集的段segments
- 特殊的调试设置(比如SYstem.Option.*)
比如通过CPU访问,假设CPU处于非安全的supervisor模式,执行32bits代码。Trace32会根据当前处理器上下文自动将A扩展成ANSD或者AZSD,将Z扩展成ZSD。
Data.SET命令是一种常用的设置目标系统内存值的命令。DP(Data Pointer)是此命令中的一个参数类型,指的是一个地址pointe).
Data.SET命令的一般格式为Data.SET
指定了数据的类型,可以是DP(地址/指针),DD(双字,即4字节整数),DF(双精度浮点数)等。 - <address> 指定了要设置的内存地址。
是写入的数据值。
举个例子,如果你想要将一个地址值(假设为0x12345678)写入到内存地址0x40000000,你可以这样写:
Data.SET DP 0x40000000 0x12345678
这行命令将使得内存地址0x40000000的值被设置为0x12345678。
1.3 Trace32其它常用项
1.3.1 CMM脚本注释方法
关于CMM脚本的注释,以;或者/开头的行将被视为注释,例如:
; This is a comment
// This is also a comment SYStem.Up
1.3.2 CMM脚本信息打印
PRINT命令用于在调试控制台上打印信息。它可以用于打印字符串,也可以用于打印表达式的结果。例如:
PRINT "Hello, world!"
会在控制台上打印出"Hello,world!”,PRINT Var.VALUE会打印变量Var的值。
1.3.3 CMM脚本控制逻辑
IF和ENDDO用于控制脚本的流程。IF后面跟一个条件表达式,如果条件表达式的结果为真(非零)则执行紧接着的代码块,否则跳过这个代码块。ENDDO标记了IF代码块的结束。例如:
IF Var.VALUE == 1
PRINT "Var is 1"
ENDDO
这段代码的含义是,如果变量var的值等于1,那么在控制台上打印“Var is 1”。