主要缩写
缩写 | 全名 | 译名 |
---|---|---|
ITM | Instrumentation Trace Macrocell | :采用非阻塞寄存器访问,具有固定的低入侵费用,可添加到实时操作系统中(RTOS)、应用程序或异常处理程序。必要时,产品代码可保留寄存器访问指令,避免探针效应。 |
DWT | Debug Watchpoint and Trace | :这为性能监控程序计数器采样和嵌入式跟踪触发控制提供了观察点支持 |
FPB | Flash Patch and Breakpoint | - 该单元可以重新映射ROM部分,通常是闪存,到RAM并且可以在ROM在中间的代码上设置断点。该单元可用于调试,需要产品ROM提供代码或数据补丁的字段更新应用程序 |
ETM | Embedded Trace Macrocell | :提供指令跟踪 |
TPIU | Trace Port Interface Unit | :为ITM、DWT、ETM 提供外部接口 |
DCB | Debug Control Block | |
SCB | System Control Block | |
SCS | System Control Space | |
DHCSR | Debug Halting Control and Status Register | |
DEMCR |
第一节 简介
调试支持是 ARM 系统结构的关键要素。 ARMv6-M 调试是可选的,只能在实现调试扩展时使用。 调试扩展提供的功能是 ARMv7-M 配置文件中可用功能的子集。 调试扩展仅限于使用断点、观察点或向量捕获配置和停止处理器的入侵调试,以及通过调试访问端口 (DAP: Debug Access Port) 访问的可选非侵入式 PC 采样功能。
Debug 调试通过DAP访问。DAP允许处理器 running
运行、halted
停止或 held in reset
访问调试资源进行复位。halted 当它停止时,它就在那里Debug状态。
除系统控制块外(SCB:System Control Block)、调试控制块(DCB:Debug Control Block)和SCS除其他调试控制外,其他调试相关资源在Private固定内分配4KB地址区域。ARMv6-M系统地址映射的外围总线(PPB)区域资源包括:
DWT
: Debug Watchpoint and Trace(调试观察点和跟踪)。这为观察点提供了支持。不支持跟踪(Trace)。BPU
: Breakpoint Unit(断点单元)。这提供了断点支持。BPU
是ARMv7-M中可用的FPB
:Flash Patch and Breakpoint(Flash补丁和断点)块的子集。- ROM表。为确定所支持的调试基础设施,提供条目表。
这些资源和SCS通过调试寄存器DAP接口访问。调试资源的地址范围,如表1所示:
1.1 arm 调试支持
1.1.1 ARMv7-M 调试支持
关于ARMv7-M任何实现架构:
- ROM表项的位置[0]表示实现是否包含相应的单见 ARMv7-M ROM 表2 。
- 如果一个单元被实现,调试寄存器可能会给出关于该单元实现特性的附加信息
- 如果 ROMDWT[0] 和 ROMITM[0] 均为0,表示实现既不包括 DWT 不包括单位 ITM 单元,则DEMCR.TRCENA 是 UNK / SBZP。
ARM建议ARMv7-M调试在以下级别之一实现:
- 只支持最低级别 DebugMonitor 异常。
- 需要基本水平DAP和一些停机(Halting)调试支持。
- 综合级别包括上述全功能 ITM, DWT 和 FPB 支持。
ARMv7-M最低调试级别只支持处理器访问,没有DAP,并且DebugMonitor异常:
- BKPT 指令。注意: 若软件被禁止 DebugMonitor 异常,升级为 HardFault 异常。
- 监控步进
- 监控来自 的条目
ARM将以下配置定义为调试支持的基本级别:
- 支持DAP和停调试。
- 没有ITM支持。注意: 当 ITM 当特征被禁用或不存在时,写入 ITM 不能引起刺激端口 BusFault 异常。这确保了应用程序代码的特性是透明的,请参见 。
- FPB不支持重映射,支持两个断点。
- DWT支持一个观察点,没有跟踪支持,没有循环计数器,没有实现外部匹配信号,。
- 调试监控支持最低级别的调试功能,包括列出的 FPB 和 DWT 事件。
综合调试支持:
- 支持 DebugMonitor 异常和停机调试。
- 实现 ITM 单位,至少支持 8 注册刺激端口。
- 实现 DWT 支持单位实施:
- 至少一个观察点。
- 所有 DWT 跟踪特性。
- 周期计数器。
- 分析计数器。 若实现包含ETM,DWT必须支持单位,否则,该信令是否由执行期定义。
- 实现 FPB 至少支持两个断点。
1.1.2 ARMv6-M 支持3> 软件使用 DAP 启用 ARMv6-M 调试的典型事件序列是:
- 启用 DAP 调试端口控制寄存器中调试逻辑的上电位。
- 为字(word)访问配置适当的 DAP 内存访问端口控制寄存器。
- 通过将
DHCSR.VC_DEBUGEN
位设置为 1 来配置系统以停止调试。 DHCSR 为调试停止控制和状态寄存器。 立即停止目标: (1) 将 DHCSR…C_HALT 位设置为 1。 (2) 回读 DHCSR.S_HALT 位,确认目标已停止,因此处于 Debug 状态。
- 要使用观察点功能,请将 DEMCR.DWTENA 位设置为 1。DEMCR为调试异常和监视控制寄存器 。 有关 DAP 的更多信息,请参阅 ARM 调试接口 v5 架构规范。
Unprivileged accesses to the PPB generate a HardFault error, and the PPB access is not permitted.
The Debug Control Block (DCB)
vector表包含重置时堆栈指针的初始化值,以及所有异常处理程序的入口点地址。异常号定义在表B1-3中,同时也定义了vector表中表项的顺序,如表B1-4所示。
ARMv6-M定义了两种复位级别,见B1-218页支持的异常概述: •上电复位 •Local复位。 通常,在ARMv6-M实现中: 通电复位适用于处理器和调试组件 本地重置只适用于处理器,而不适用于调试组件。
DHCSR.VC_DEBUGEN
位设置为 1 来配置系统以停止调试。 DHCSR 为调试停止控制和状态寄存器。 立即停止目标: (1) 将 DHCSR…C_HALT 位设置为 1。 (2) 回读 DHCSR.S_HALT 位,确认目标已停止,因此处于 Debug 状态。1.2 DAP(Debug Access Port 调试访问端口)
调试访问端口(DAP)是 ARM调试接口(ADIv5)架构规范的一个实现,提供对ARMv7-M实现的调试特性的访问。
有关DAP的更多信息,请参阅《ARM Debug Interface v5 Architecture Specification》。
警告:通过DAP访问可以在软件执行时更改系统控制和配置字段,特别是SCB中的寄存器。例如,访问可以修改用于动态更新的资源。如果应用程序和调试器都更新了s,这可能会产生不良的副作用。
1.2.1 适用于调试寄存器访问的一般规则
私有外围总线PPB (Private Peripheral Bus) 地址范围为0xE0000000到0xE0100000,支持以下通用规则:
- 该区域被定义为强有序记忆,参见第A3-83.84页 Strongly-ordered memory on page A3-83、内存访问限制Memory access restrictions。
- 寄存器总是被小端访问,不管处理器的端状态如何。
- 调试寄存器只能以字访问的方式访问。字节和半字访问是不可预测的。
- 保留寄存器或位字段的值为 UNK/SBZP。
除非另有说明,否则对PPB的无特权访问将导致BusFault错误。异常主要包括:
- 软件可以在配置控制寄存器中设置一个位为1来启用非特权访问 (软件触发中断寄存器)。
- 对 ITM 的非特权访问行为。要了解更多信息,请参阅 ITM操作。
1.2.2 ROM Table
一个ARMv7-M系统包括一个ROM表,它表明所实现的调试组件,以及这些组件在内存映射中的位置。有关ROM表项的格式,请参阅ARM调试接口v5体系结构规范。 对于ARMv7-M ROM表,所有的地址偏移都是反的。0x00000000入口 是 Table标记 末尾. ROM表格式如表3所示。
- 访问不会导致内存不存在异常。
- 共享资源是由本地处理器管理还是由不同的资源管理是由实现定义的。
调试器可以使用 DAP 接口来查询系统的内存访问端口(MEM-APs)。内存访问端口中的基本寄存器提供ROM表的地址,或者ROM表层次结构中一系列ROM表的第一个。然后可以使用内存访问端口来获取ROM表项。 有关更多信息,请参阅ARM调试接口v5架构规范 《ARM Debug Interface v5 Architecture Specification》
CIDx:值是为ROM表完全定义的,并且与CoreSight兼容 PIDx:值应该符合CoreSight或RAZ。 参考 第Appendix D1:ARMv7-M CoreSight Infrastructure IDs.
1.3 Debug Features
1.4 Debug and Reset
ARMv7-M定义了两个级别的复位,如第B1-519页支持的异常概述中所述:
- 上电复位
- 局部复位
1.4.1 Entering Debug state on leaving reset state
为了迫使处理器在重启结束后立即进入 Debug 状态,调试器将 设置为1,以启用停机调试,并设置设置为 1 以在 Reset 异常上启用向量捕获。当处理器完成重置时,它将 设置为1,并进入 Debug 状态。 更多信息请参见 调试停止控制和状态寄存器 DHCSR页C1-696和调试异常和 监控寄存器DEMCR在C1-702页
Debug Halting Control and Status Register, DHCSR
Debug Exception and Monitor Control Register, DEMCR
Application Interrupt and Reset Control Register, AIRCR
-
SYSRESETREQ, bit[2] :系统重置请求:
- 0不请求重置。
- 1请求重置。 写入1到这个位断言一个信号到外部系统请求本地重置。 本地或上电复位将该位清除为0。
-
VECTCLRACTIVE, bit [1]
- 将1写入此位将清除所有固定和可配置异常的活动状态信息。包括将IPSR清除为零(see The IPSR on page B1-13)。
- 如果处理器在调试状态中没有停止(halted),那么在这个位上写一个1的效果是无法预测的。
- 该位只写。
-
VECTRESET, bit[0]
- 将1写入该位会导致本地系统复位,更多信息请参见B1-555页的复位管理。该位自动清零。(self-clears)
- 如果处理器在 Debug 状态中没有停止,那么在这个位上写一个1的效果是不可预测的。
- 当处理器在 Debug 状态下停止时,如果对寄存器的写入同时向两个寄存器 和写入1 ,行为是不可预测的。
- 该位只写。
主流 IDE Debug 选项
** note: CMSIS_DAP = 2.1.0 **
MDK Keil v5.37
MDK 复位方式选择:
- HW Reset
- SysResetReq
- VectReset
MDK连接方式选择:
- with Pre-Reset
- under Reset
- without Stop IAR 复位方式选择
- Disable (no reset)
- Software
- Hardware
- System
- Connect during reseet (default)
/* Defines all characteristics of a device family. */ typedef struct target_family_descriptor { uint16_t family_id; /*!< 用于从定义或
自定义的目标族中选择或识别目标族. Use to select or identify target family from defined target family or custom ones */ reset_type_t default_reset_type; /*!< 目标族可以从硬件复位和软件复位中选择预定义的复位. Target family can select predefined reset from kHardwareReset and kSoftwareReset */ uint32_t soft_reset_type; /*!< 族可以重写软件重置类型为 VECTRESET 或 SYSRESETREQ. Families can override software reset type to VECTRESET or SYSRESETREQ */ void (*target_before_init_debug)(void); /*!< 在调试初始化之前目标依赖函数. Target dependant function before debug initialization */ void (*prerun_target_config)(void); /*!< 目标特定的初始化. Target specific initialization */ uint8_t (*target_unlock_sequence)(void); /*!< 解锁进入锁定状态的目标. Unlock targets that can enter lock state */ uint8_t (*security_bits_set)(uint32_t addr, uint8_t *data, uint32_t size); /*!< 检查可编程 flash 区域的安全位. Check security bits in the programmable flash region */ uint8_t (*target_set_state)(target_state_t state); /*!< 族可以自定义目标调试状态. Families can customize target debug states */ void (*swd_set_target_reset)(uint8_t asserted); /*!< 族可以自定义如何发送重置目标. Families can customize how to send reset to the target */ uint8_t (*validate_bin_nvic)(const uint8_t *buf); /*!< 通过拖放验证 bin 文件是否为 flash. Validate a bin file to be flash by drag and drop */ uint8_t (*validate_hexfile)(const uint8_t *buf); /*!< 通过拖放验证 hex 文件是否为 flash. Validate a hex file to be flash by drag and drop */ uint32_t apsel; /*!< APSEL for the family */ } target_family_descriptor_t;