cortex-m3 的 debug 分析

以 Cortex-M3权威指南.pdf 和  arm_cortexm3_processor_trm_100165_0201_00_en.pdf 为参考资料,分析

cortex-m3 中的 debug 概念

debug 分类
	侵入式调试
		halt // jtag attach 上去的模式
		debug 异常处理函数 模式 // DebugMon_Handler
	非侵入调试 (又叫trace) // SWO & TRACECLK/TRACEDATA[3:0]
		


arm_cortexm3_processor_trm_100165_0201_00_en.pdf 的7 8 9 10 11 章节 
Cortex-M3权威指南.pdf 的 15 16 章节
  • CM3_TRM P12
    cortex-m3 的 debug 分析_第1张图片
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的数据观察点匹配 
					// DWT 负责数据trace,会产生trace信息到 ATB , 然后 ATB funnel 得到 ATB 上的所有信息,传送给TPIU, 通过 TPIU 的 pin脚 输出到芯片外
					// 然后上位机可解析这些数据,https://blog.csdn.net/K_O_Carnivist/article/details/50322069
				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的数据观察点匹配 // https://blog.csdn.net/K_O_Carnivist/article/details/80547121
			FPB的指令断点匹配  
			外部调试请求(EDBGEQ)
			在调试器监视器使能的条件下,执行了BKPT指令
			
		
	下一步操作
		软件:操作DEMCR(可控TRCENA(控制跟踪系统使能)VC(控制某个异常时进入debug monitor exception))
		软件:读DFSR判断发生了哪种调试事件
		软件:set VECTRESET 重启处理器内核(不重启debug)
		软件:set C_MASKINTS 屏蔽中断
	如何退出
		异常返回操作
  • CM3中的断点实现
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 // 调试信息,printf
		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
		指令比较器
		字面值比较器 // TODO
数据观察点
	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) 控制

你可能感兴趣的:(debug)