小语种网站怎么做,推广渠道包括哪些,百度用户服务中心人工24小时电话,打开app下载请阅读【嵌入式开发学习必备专栏】 文章目录 Debug system registers中断控制状态寄存器#xff08;ICSR#xff09;Debug Halting Control and Status Register, DHCSR Debug 寄存器DCRSR与DCRDRCPU 寄存器读操作CPU 寄存器写操作CPU 寄存器选择CPU 寄存器读写示例 调试故障…请阅读【嵌入式开发学习必备专栏】 文章目录 Debug system registers中断控制状态寄存器ICSRDebug Halting Control and Status Register, DHCSR Debug 寄存器DCRSR与DCRDRCPU 寄存器读操作CPU 寄存器写操作CPU 寄存器选择CPU 寄存器读写示例 调试故障状态寄存器DFSR Debug system registers
在ARMv7架构中调试功能通过一系列的系统控制块System Control Block, SCB寄存器来提供。这些寄存器不仅帮助开发者诊断程序运行中的错误还提供了硬件故障的详细信息。以下是SCB中与调试相关的重要寄存器和标志位的介绍
中断控制状态寄存器ICSR
ICSR 寄存器可在应用程序中用于
设置和清除系统异常的挂起状态其中包括 SysTick、PendSV 和 NMI。通过读取 VECTACTIVE 可以确定当前执行的异常/中断编号。
另外调试器还可利用该寄存器确定中断状态。VECTACTIVE 域和 IPSR 相同。
中断控制和状态寄存器SCB-ICSR0xE000ED04 debug 寄存器小结
Debug Halting Control and Status Register, DHCSR C_DEBUGEN: Enables debug. 启用调试。这只能由 AHB-AP 修改而不是由软件修改。它在软件进行写入时将被忽略软件不能设置或清除它。当写入 C_HALT 来暂停CPU时内核必须向它写入 1。当外部debugger将该bit配置从0修改为1时 必须同时将 域 C_MASKINTSbit[3]置0。 C_Halt: Halts the core. 暂停 cpu。当CPU停止时该位自动设置。例如断点。此位在CPU reset 时清除。该位只能在 C_DEBUGEN 为 1 时写入否则将被忽略。 当设置该位为 1 时且 C_DEBUGEN 置位时将会将cpu halt住当CPU 处于 debug state时将该bit写0将会退出 debug state。 C_STEP, bit[2]单步调试使能bit。 C_MASKINTS, bit[3]当debug 模式使能后也即C_DEBUGEN 配置为1后外部 debugger 可以通过配置该bit来屏蔽ysTick 和 外部其它中断。 C_SNAPSTALL, bit[5]设置此位为1允许调试器请求不精确地进入调试状态。C_SNAPSTALL 提供了一种机制通过它调试器可以请求处理器进入调试状态而不需要等待具体的断点触发。这对于那些需要在特定条件下暂停处理器执行但又不依赖于精确断点位置的调试场景特别有用。
当处理器执行加载load或存储store指令时可能会遇到“阻塞”stalled的情况。这种情况通常发生于数据无法立即从内存中被访问时例如因为缓存未命中cache miss、访问外设或者内存争用等原因。阻塞的加载或存储指令需要等待相关数据可用后才能完成其操作。下面详细介绍这一过程及其影响。可以通过配置C_SNAPSTALL 让 阻塞的 load 或者store强制结束。 S_REGRDY: 调试内核寄存器选择器寄存器上的寄存器读/写可用。 为1表示最后一次传输完成。 S_HALT 当 S_HALT 为高时表示处于调试状态 S_SLEEP 表示内核正在休眠.WFI、WFE 或 SLEEP-ON-EXIT, 必须使用 C_HALT 来获得控制权或等待中断唤醒。 S_LOCKUP: 如果内核正在运行未停止并且存在锁定条件则读取为 1。 S_RETIRE_ST: I表示自上次读取后指令已完成。 这是一个在读取时清除的粘性位。 这确定核心是否在加载/存储或获取时停止。 S_RESET_ST 表示自从上次读取该位以来内核已被复位或正在被复位。 这是一个在读取时清除的粘性位。 因此读取两次并得到 1 然后 0 意味着它在过去被重置。 读取两次并获得 1 意味着它现在正在重置仍然保持在重置状态。
Debug 寄存器DCRSR与DCRDR
与调试功能有关的还有NVIC中另外两个寄存器。它们分别是调试内核寄存器选择者寄存器DCRSR以及调试内核寄存器数据寄存器DCRDR。调试器需要通过这两个寄存器来访问处理器的寄存器并且只有在处理器停机时才能使用这里的寄存器传送功能。
DCRSR DCRDR
CPU 寄存器读操作
使用DCRSR和DCRDR这两个寄存器来读取内核的寄存器的内容则必须按如下的顺序做
确定处理器已停机往DCRSR写数据来选择读CPU的哪个寄存器其中bit[16]要为0表示这是要读数据查询直到DHCSR.S_REGRDY1读取DCRDR以获取寄存器的内容
CPU 寄存器写操作
寄存器写操作的顺序与上面的类似
确定处理器已停机往DCRDR中写数据往DCRSR写数据来选择准备写CPU的哪个寄存器其中bit[16]要为1表示这是要写数据查询直到DHCSR.S_REGRDY1 NOTE: 使用DCRSR和DCRDR来访问寄存器只适用于停机模式。 CPU 寄存器选择
DCRSR bit[16] 用标志是读操作还是写操作
0 Read1 Write
DCRSR bits[6:0] 用于选择要操作哪个寄存器
0b0000000-0b0001100选择寄存器R0-R120b0001101选择寄存器 SP0b0001110选择寄存器 LR0b0001111DebugReturnAddress0b0010000xPSR0b0010001Main stack pointer, MSP0b0010010 Process stack pointer, PSP.0b0010100 Bits[31:24] CONTROL. Bits[23:16] FAULTMASK.Bits[15:8] BASEPRI.Bits[7:0] PRIMASK. 0b0100001Floating-point Status and Control Register, FPSCR.
CPU 寄存器读写示例
写操作
#define REGW_FLAG BIT(16)
#define S_REGRDY BIT(16)int cpu_reg_write(uint32_t reg, uint32_t val)
{uint32_t data, try 5;mcu_write(DCRDR, val);mcu_write(DCRSR, REGW_FLGA | reg);mcu_read(DHCSR, data);while ((data S_REGRDY) 0x0 try) {log_warn(wait for transfer complete\n);try--;}if (!try) {log_err(write gpu mcu reg failed\n);return -1;}return 0;
}读操作
uint32_t cpu_reg_read(uint32_t reg, uint32_t *pdata)
{uint32_t data, try 5;mcu_write(DCRSR, reg);mcu_read(DHCSR, data);while ((data S_REGRDY) 0x0 try) {log_warn(wait for transfer complete\n);try--;}if (!try) {log_err(write gpu mcu reg failed\n);return -1;}mcu_read(DCRDR, pdata);return 0;
}调试故障状态寄存器DFSR
DFSRDebug Fault Status Register是SCB的一部分提供了与调试相关的故障信息。它指示了最后一次调试事件的原因例如硬件断点触发或访问违例。DFSR寄存器包括以下几个关键字段
HALTED当处理器因调试请求而停止时该位被设置。 C_HALT 和 C_STEP 请求都会触发该位置位。BKPT当执行到PFB中硬件断点时或者软件断点指令BKPT指令时该位被设置。DWTTRAP当数据观察点和追踪Data Watchpoint and Trace, DWT单元检测到匹配事件时该位被设置。VCATCH当向量捕捉事件发生时该位被设置。EXTERNAL当由于外部调试请求而停止时该位被设置。
DFSR为开发者提供了关于程序为何停止的直接线索是调试过程中不可或缺的资源。