以 Cortex-M3权威指南.pdf 和 arm_cortexm3_processor_trm_100165_0201_00_en.pdf 为参考资料,分析
cortex-m3 中的 debug 概念
debug 分类
侵入式调试
halt
debug 异常处理函数 模式
非侵入调试 (又叫trace)
arm_cortexm3_processor_trm_100165_0201_00_en.pdf 的7 8 9 10 11 章节
Cortex-M3权威指南.pdf 的 15 16 章节
- CM3_TRM P12
SW/JTAG 会流pin脚出来一般用于接 jlink/ulink/openjtag 等调试器
PPB 一般是将 调试组件 的控制信号引出来, 一般会留pin脚出来???
Trace Port interface 一般会留 pin脚出来 , SWO 或 TRACECLK/TRACEDATA[3:0]
halt模式
进入原因
在 调试器 置位 了DHCSR的C_DEBUGEN的前提下,并做了以下(其中的一种事情)
软件置位 DHCSR.C_HALT
调试事件
DWT的数据观察点匹配
FPB的指令断点匹配
VC事件
外部调试请求(EDBGEQ)
执行了BKPT指令
下一步操作
硬件:可由上电复位和系统复位来复位处理器
调试器:读DFSR判断发生了哪种调试事件
调试器:set VECTRESET 重启处理器内核(不重启debug)
调试器:set C_MASKINTS 屏蔽中断
调试器:set C_SNAPSTALL 强制终止被stall的总线传送
如何退出
清除 C_HALT
debug monitor exception模式
进入原因
在 DHCSR的C_DEBUGEN 为 0 的前提 下,并做了以下(其中的一种事情)
手工置位 MON_REQ
调试事件
DWT的数据观察点匹配
FPB的指令断点匹配
外部调试请求(EDBGEQ)
在调试器监视器使能的条件下,执行了BKPT指令
下一步操作
软件:操作DEMCR(可控TRCENA(控制跟踪系统使能)和VC(控制某个异常时进入debug monitor exception))
软件:读DFSR判断发生了哪种调试事件
软件:set VECTRESET 重启处理器内核(不重启debug)
软件:set C_MASKINTS 屏蔽中断
如何退出
异常返回操作
BPKT #im8
1. 程序中本来就有这个指令的调用
2. 调试器改写flash中的指令为该指令
基于FPB地址比较器的断点
DCRSR
DCRDR
问题
halt 模式和 debug monitor exception模式 都属于 侵入式调试
非侵入式调试 如何进入,不用进入,直接跑代码,数据通过pin脚同时输出
调试组件的内存映射
独立于系统的存储器映射
还是单独的地址空间
P231 的 "调试监视器模式下对调试事件的响应"
trace 数据输出源
DWT
4个比较器,(每个比较器包括三个寄存器COMP,MASK,FUNCTION)
1. FUNCTION 可写入 1-n , 用于表示比较匹配了之后做某事
2. COMP,MASK用于写入比较的内容(32bit常量) (含义可为数据地址,pc值,cycle值)
ITM
1. printf
2. DWT的数据跟踪数据数据经过 ITM输出 ,需置位ITM.DWTEM
3. 时间戳
ETM
1. 输出pc的轨迹
2. 开始输出的时机可由DWT控制
trace 数据interface
TPIU
输出口有两种,可选择
1. SWO (1bit,1根线),带宽低
2. CLK & data[3:0] (4bit,5根线),带宽高
断点
FPB
指令比较器
字面值比较器
数据观察点
DWT
DP与调试组件间的接口
AP:AHB-AP
有哪些调试组件
ROM table
1. ROM表地址是固定的,在手册中有写,CM3的是 0xE00F_F000
2. 表中的第一个表项 是X , ((X&0xFFFFFFFC)+0xE00FF000)&0xFFFFFFFF 是 NVIC的偏移值,X[1]如果是1,代表NVIC存储.X[0]如果是1,表示第二个表项有其他组件的信息
虽然知道 有多少个组件,这些组件分别在哪个位置
但是不知道 第一个组件是什么组件,第二个组件是什么组件
需要根据 组件的地址,去地址中查找 base+0xFE0 开始的8个寄存器(每个寄存器中的内容为一个字节),去判断该组件是什么组件
base+0xFE0 : PID0
base+0xFE4 : PID1
base+0xFE8 : PID2
base+0xFEC : PID3
base+0xFF0 : CID0
base+0xFF4 : CID1
base+0xFF8 : CID2
base+0xFFC : CID3
被调试主机一般不控 调试组件,但是可控
而是让 调试器(调试主机)(通过jtag/swd) 控制