Cortex-M23和Cortex-M33处理器调试组件详解
1. 处理器安全状态更改与调试寄存器
DSCSR允许调试器更改处理器的安全状态,但此操作需谨慎执行。因为若更改后安全状态与程序地址的安全属性不匹配,将触发故障异常。若未实现TrustZone安全扩展,DSCSR寄存器不可用。
除这些调试寄存器外,处理器核心还有一些用于多核调试支持的调试特性:
-
外部调试请求信号EDBGRQ
:处理器提供外部调试请求信号,使Cortex - M处理器能通过外部事件(如多处理器系统中其他处理器的调试状态)进入调试模式。此特性对调试多处理器系统非常有用,在简单微控制器中,该信号可能被拉低。
-
调试重启接口
:处理器提供硬件握手信号接口,允许使用芯片上的其他硬件使处理器恢复运行。此特性常用于多处理器系统中的同步调试重启,在单处理器系统中,握手接口通常不使用。
这些特性在Cortex - M23和Cortex - M33处理器中均可用。
2. 断点单元
Cortex - M23和Cortex - M33处理器中的断点单元允许在不手动在程序代码中添加断点指令的情况下,将断点设置到特定程序地址,无需修改程序代码。不过,可设置的硬件断点数量有限:
- Cortex - M23处理器最多支持四个硬件断点比较器。
- Cortex - M33处理器最多支持八个硬件断点比较器。
断点功能较易理解。调试时,可在程序地址设置一个或多个断点。若执行到断点地址的程序代码,将触发断点调试事件,使程序执行停止(用于停止模式调试)或触发调试监视器异常(若使用调试监视器)。此时,可检查寄存器内容、内存和外设状态,并执行调试操作(如单步执行)。
由于历史原因,断点单元称为闪存补丁和断点(FPB)单元。在Cortex - M3和Cortex - M4处理器中,断点比较器还可用于重映射传输以修补ROM映像,但由于重映射过程与TrustZone的复杂性,Armv8 - M不支持此特性。
断点单元的关键寄存器如下表所示:
| 地址 (NS别名) | 名称 | 类型 | 复位值 |
| — | — | — | — |
| 0xE0002000 (0xE0022000) | 闪存补丁控制寄存器 (FP_CTRL) | R/W | 0x00000000 |
| 0xE0002004 (0xE0022004) | 保留 — FPB程序员模型早期版本中的FP_REMAP寄存器,Armv8 - M中未使用 | – | – |
| 0xE0002008 + n
4 (0xE0022008 + n
4) | 闪存补丁比较器寄存器 (FP_COMPn) | R/W | – |
| 0xE0002FBC (0xE0022FBC) | FPB设备架构寄存器 (FP_DEVARCH),用于支持CoreSight调试组件的自动发现 | RO | 0x47701A03 (Cortex - M33)/0x0 (Cortex - M23) |
| 0xE0002FCC (0xE0022FCC) | FPB设备类型寄存器 (FP_DEVTYPE) | RO | 0x00000000 |
| 0xE0002FD0 — 0xE0002FFC (0xE0022FD0 — 0xE0022FFC) | 闪存补丁外设和组件ID寄存器,用于支持CoreSight调试组件的自动发现 | RO |
默认情况下,断点单元禁用。要启用断点单元,调试工具需设置闪存补丁控制寄存器(FP_CTRL)中的ENABLE位。断点比较器寄存器从地址0xE0002008(FP_COMP0)开始,后续地址依次为0xE000200C(FP_COMP1)、0xE0002010(FP_COMP2)等。要配置硬件断点,调试工具需对这些断点比较器寄存器之一进行编程。
与Cortex - M0/M0 + /M1/M3/M4处理器中的断点单元不同,使用FPB修订版1架构可在任何可执行区域设置断点,而以前的设计中,断点比较器仅在CODE区域(前512MB内存)工作。
FP_CTRL寄存器的详细信息如下表:
| 位 | 名称 | 类型 | 复位值 | 描述 |
| — | — | — | — | — |
| 31:28 | REV | RO | 0001 | FPB架构修订版,Cortex - M23和Cortex - M33处理器中始终为1 |
| 27:15 | Reserved | – | – | 保留 |
| 14:12 | NUM_CODE [6:4] | RO | – | NUM_CODE是断点单元中实现的代码比较器数量,此位字段(14至12位,3位宽)仅提供NUM_CODE的6至4位,由于Cortex - M23和Cortex - M33的代码比较器少于16个,此位始终为0 |
| 11:8 | NUM_LIT | RO | 0 | 实现的文字比较器数量,当前Armv8 - M处理器中始终为0 |
| 7:4 | NUM_CODE [3:0] | RO | 实现的代码比较器数量,Cortex - M23处理器中为0 - 4,Cortex - M33处理器中为0、4或8,未实现调试特性时为0 |
| 3:2 | Reserved | – | – | 保留 |
| 1 | Key | WO | – | 写使能键,要写入FP_CTRL寄存器,此位必须设置为1,否则写入将被忽略 |
| 0 | ENABLE | R/W | 0 | 启用,设置为1时,断点单元启用 |
FP_COMPn寄存器的详细信息如下表:
| 位 | 名称 | 类型 | 复位值 | 描述 |
| — | — | — | — | — |
| 31:1 | BPADDR | R/W | – | 断点地址[31:1] |
| 0 | BE | R/W | 0 | 断点使能,设置为1时,断点比较器启用 |
以下是配置硬件断点的操作步骤:
1. 确保调试工具已连接到目标处理器。
2. 读取FP_CTRL寄存器,确认当前断点单元状态。
3. 将FP_CTRL寄存器的Key位设置为1,ENABLE位设置为1,启用断点单元。
4. 根据需要设置的断点地址,选择合适的FP_COMPn寄存器。
5. 将断点地址写入所选FP_COMPn寄存器的BPADDR位,将BE位设置为1,启用该断点比较器。
3. 数据观察点和跟踪单元(DWT)
DWT包含一系列功能:
-
DWT比较器
:可用于数据观察点事件生成(用于停止或调试监视器异常)、ETM触发(若实现ETM)、数据跟踪生成(仅适用于Armv8 - M主线,Cortex - M23处理器不可用)。
-
性能分析计数器
:仅适用于Armv8 - M主线,可用于性能分析跟踪。
-
32位周期计数器
:仅适用于Armv8 - M主线,可用于程序执行时间测量、生成用于跟踪同步和程序计数器采样跟踪的周期性控制。
-
PC采样寄存器
:用于对执行代码进行粗粒度性能分析。使用此特性时,调试器通过调试连接定期采样PC值(注意:在Armv8 - M主线处理器中,PC采样也可通过跟踪进行)。
DWT比较器的数量可配置,Cortex - M23和Cortex - M33处理器均最多支持四个硬件DWT比较器。
访问DWT寄存器前,必须将DEMCR中的TRCENA位设置为1以启用DWT。若使用DWT中的跟踪特性,还需:
- 将ITM跟踪控制寄存器(ITM_TCR)中的TXENA位(位3)设置为1。
- 初始化TPIU以启用跟踪输出。
DWT包含的关键寄存器如下表所示:
| 地址 (NS别名) | 名称 | 类型 |
| — | — | — |
| 0xE0001000 (0xE0021000) | DWT控制寄存器 (DWT_CTRL) | R/W |
| 0xE0001004 (0xE0021004) | DWT周期计数寄存器 (DWT_CYCCNT)(Cortex - M23中不可用) | R/W |
| 0xE0001008 (0xE0021008) | DWT CPI计数寄存器 (DWT_CPICNT)(用于性能分析跟踪,Cortex - M23中不可用) | R/W |
| 0xE000100C (0xE002100C) | DWT异常开销计数寄存器 (DWT_EXCCNT)(用于性能分析跟踪,Cortex - M23中不可用) | R/W |
| 0xE0001010 (0xE0021010) | DWT睡眠计数寄存器 (DWT_SLEEPCNT)(用于性能分析跟踪,Cortex - M23中不可用) | R/W |
| 0xE0001018 (0xE0021018) | DWT折叠指令计数寄存器 (DWT_FOLDCNT)(用于性能分析跟踪,Cortex - M23中不可用) | R/W |
| 0xE000101C (0xE002101C) | DWT程序计数器采样寄存器 | R/W |
| 0xE0001020 + 16
n (0xE0021020 + 16
n) | DWT比较器寄存器n (DWT_COMP[n]) | R/W |
| 0xE0001028 + 16
n (0xE0021028 + 16
n) | DWT比较器功能寄存器n (DWT_FUNCTION[n]) | R/W |
| 0xE0001FBC (0xE0021FBC) | DWT设备架构寄存器 (FP_DEVARCH),用于支持CoreSight调试组件识别 | RO |
| 0xE0001FCC (0xE0021FCC) | DWT设备类型寄存器 (FP_DEVTYPE) | RO |
| 0xE0001FD0 – 0xE0001FFC (0xE0021FD0 – 0xE0021FFC) | DWT外设和组件ID寄存器,用于支持CoreSight调试组件识别 | RO |
DWT控制寄存器包含许多功能:
- 位字段,允许软件/调试器确定硬件资源的可用性。
- 各种启用控制位字段。
DWT控制寄存器的位字段详细信息如下表:
| 位 | 名称 | 类型 | 复位值 | 描述 |
| — | — | — | — | — |
| 31:28 | NUMCOMP | RO | – | 实现的DWT比较器数量 |
| 27 | NOTRCPKT | RO | – | 无跟踪数据包,Cortex - M23中始终为1,表示不支持跟踪 |
| 26 | NOEXTTRIG | RO | – | 无外部触发器,保留(读为零) |
| 25 | NOCYCCNT | RO | – | 无周期计数寄存器,Cortex - M23中始终为1,表示未实现周期计数寄存器 |
| 24 | NOPRFCNT | RO | – | 无性能分析计数器,Cortex - M23中始终为1,表示未实现性能分析计数器 |
| 23 | CYCDISS | R/W | 0 | 周期计数安全禁用,若设置为1,可防止周期计数器在安全状态下递增,Cortex - M23处理器中此位始终为零,因为未实现周期计数器 |
| 22 | CYCEVTENA | R/W | 0 | 周期事件启用,若设置为1,可在POSTCNT下溢时启用事件计数器数据包生成,POSTCNT是一个4位计数器,若CYCCNT计数器的抽头位溢出(抽头位由DWT_CTRL的位9 CYCTAP控制),则递减,Cortex - M23处理器中此位始终为零,因为未实现周期计数器 |
| 21 | FOLDEVTENA | R/W | 0 | 启用DWT_FOLDCNT计数器,设置为1时生效,Cortex - M23处理器中此位始终为零,因为未实现FOLDCNT |
| 20 | LSUEVTENDA | R/W | 0 | 启用DWT_LSUCNT计数器,设置为1时生效(LSU = 加载存储单元,启用时,LSUCNT在每次因内存访问导致的流水线停顿周期递增),Cortex - M23处理器中此位始终为零,因为未实现LSUCNT |
| 19 | SLEEPEVTENA | R/W | 0 | 启用DWT_SLEEPCNT计数器,设置为1时生效(启用时,SLEEPCNT在每个睡眠周期递增),Cortex - M23处理器中此位始终为零,因为未实现SLEEPCNT |
| 18 | EXCEVTENA | R/W | 0 | 启用DWT_EXCCNT计数器,设置为1时生效(启用时,EXCCNT在每次中断进入/退出开销周期递增),Cortex - M23处理器中此位始终为零,因为未实现EXCCNT |
| 17 | CPIEVTENA | R/W | 0 | 启用DWT_CPICNT计数器,设置为1时生效(启用时,CPICNT在执行指令所需的额外周期(不计算第一个周期)递增,不包括DWT_LSUCNT记录的周期),Cortex - M23处理器中此位始终为零,因为未实现CPICNT |
| 16 | EXCTRCENA | R/W | 0 | 启用异常事件跟踪,Cortex - M23处理器中此位始终为零,因为未实现性能分析跟踪 |
| 15:13 | Reserved | – | – | 保留 |
| 12 | PCSAMPLENA | R/W | 0 | 启用PC采样跟踪,设置为1时,当所选抽头位(由POSTCNT选择)值改变时,采样PC值并输出到跟踪,Cortex - M23处理器中此位始终为零,因为未实现FOLDCNT |
| 11:10 | SYNCTAP | R/W | 0 | 同步抽头,定义同步数据包的速率:00 - 同步数据包禁用;01 - 同步数据包在CYCCNT的位24抽头;10 - 同步数据包在CYCCNT的位26抽头;11 - 同步数据包在CYCCNT的位28抽头,Cortex - M23处理器中此位始终为零,因为未实现CYCCNT |
| 9 | CYCTAP | R/W | 0 | POSTCNT计数器的周期计数抽头:0 - POSTCNT在CYCCNT的位6抽头;1 - POSTCNT在CYCCNT的位10抽头,POSTCNT是递减计数器,当抽头位(由CYCTAP选择)值改变时递减,Cortex - M23处理器中此位始终为零,因为未实现CYCCNT |
| 8:5 | POSTINIT | R/W | – | POSTCNT计数器的初始值,Cortex - M23处理器中此位始终为零,因为未实现POSTCNT |
| 4:1 | POSTPRESET | R/W | – | POSTCNT预设值,POSTCNT计数器的重载值,Cortex - M23处理器中此位始终为零,因为未实现POSTCNT |
| 0 | CYCCNTENA | R/W | 0 | CYCCNT启用,设置为1时,启用CYCCNT递增 |
DWT周期计数寄存器(DWT_CYCCNT)仅在Armv8 - M主线中可用,用于测量处理器的执行周期、控制周期性PC采样跟踪数据包(此特性取决于DWT_CTRL.PCSAMPLENA和DWT_CTRL.CYCTAP的设置)、控制周期性跟踪同步数据包(此特性取决于DWT_CTRL.SYNCTAP的设置)、控制周期性周期计数跟踪数据包(此特性由DWT_CTRL.CYCEVTENA位控制)。
DWT周期计数寄存器的详细信息如下表:
| 位 | 名称 | 类型 | 复位值 | 描述 |
| — | — | — | — | — |
| 31:0 | CYCCNT | RW | – | 周期计数器,当DWT_CTRL.CYCCNTENA为1且DEMCR.TRCENA为1时递增,溢出时回绕到零 |
当实现TrustZone时,将DWT_CTRL.CYCDISS设置为1可防止CYCCNT在安全状态下递增,且DWT_CTRL.CYCDISS在非安全世界不可访问。
在Armv8 - M主线中,DWT包含多个性能分析计数器,用于统计不同类型活动使用的周期数(如睡眠、内存访问和中断处理开销)。这些计数器如下表所示:
| 寄存器名称 | 描述 |
| — | — |
| DWT CPI计数寄存器 (DWT_CPICNT) | 统计执行多周期指令和指令提取中的停顿周期所需的额外周期,不包括指令周期的第一个周期和由LSUCNT记录的延迟周期,计数器禁用且DWT_CTRL.CPIEVTENA写入1时初始化为零 |
| DWT异常开销计数寄存器 (DWT_EXCCNT) | 统计异常处理所花费的总周期,计数器禁用且DWT_CTRL.EXCEVTENA写入1时初始化为零 |
| DWT睡眠计数寄存器 (DWT_SLEEPCNT) | 统计处理器的总睡眠周期,计数器禁用且DWT_CTRL.SLEEPEVTENA写入1时初始化为零 |
| DWT LSU计数寄存器 (DWT_LSUCNT) | 统计执行加载或存储指令所需的额外周期(不计算加载和存储执行的第一个时钟周期),计数器禁用且DWT_CTRL.LSUEVTENA写入1时初始化为零 |
| DWT折叠指令计数寄存器 (DWT_FOLDCNT) | 统计执行的额外指令(如双发射),计数器禁用且DWT_CTRL.FOLDEVTENA写入1时初始化为零 |
这些性能分析计数器为8位,操作时易溢出。因此,应与跟踪连接一起使用,以便每次计数器溢出时,生成相应的跟踪数据包并由调试主机记录。这样,调试主机在性能分析操作停止时,可通过将“跟踪数据包数量 * 256”加到这些计数器的值上来计算总计数。例如,调试会话中,调试主机收到6个睡眠事件计数器数据包,会话结束时,SLEEPCNT计数器值为9,则该会话中处理器进入睡眠模式的时钟周期数为1545(即6 * 256 + 9 = 1545)。
通过结合总周期计数(可通过读取DWT_CYCCNT或通过跟踪(由DWT_CTRL.CYCEVTENA启用)),可按以下方式测量一段时间内执行的总指令数:
总执行指令数 = 总周期计数 - CPICNT - EXCCNT - SLEEPCNT - LSUCNT + FOLDCNT
通过关联程序跟踪信息(使用ETM指令跟踪或PC采样跟踪),可识别一些性能问题。例如,DWT跟踪可能显示代码执行期间的一些有趣方面。
虽然EXCCNT数据包提供异常开销信息,但不提供发生了哪些异常的详细信息。要获取此信息,可通过设置DWT_CTRL.EXCTRCENA启用异常跟踪,这将详细显示发生了哪个异常,若为跟踪启用时间戳,还可显示异常处理程序的启动和结束时间。
当实现TrustZone且禁用安全跟踪(非侵入式调试)时,性能分析计数器在安全软件活动期间不会递增。此外,处理器停止时,性能分析计数器也将停止。
还可通过调试连接进行PC采样来执行一些基本的性能分析。为此,可通过DWT程序计数器采样寄存器定期读取PC值,无需跟踪连接。Cortex - M23和Cortex - M33处理器均支持此功能。
当DWT PC采样寄存器的读取值为0xFFFFFFFF时,意味着以下条件之一为真:
- 处理器已停止。
- 实现了TrustZone,处理器在安全状态下运行,且调试认证设置不允许安全调试。
- 调试认证设置不允许调试。
- DWT已禁用(DEMCR.TRCENA设置为0)。
- 最近执行指令的地址不可用(如复位后立即)。
由于调试连接速度限制,通过调试连接进行PC采样的采样率通常较低。因此,若可用,通过跟踪进行PC采样是更好的选择,ETM指令跟踪能提供更多性能分析信息。
DWT的数据观察点特性由DWT_COMP[n]和DWT_FUNCTION[n]寄存器处理,其中“n”的值在Cortex - M23和Cortex - M33处理器中为0 - 3(注意:两个处理器最多有四个DWT比较器,尽管架构上可能更多)。
DWT_COMP[n]中的值定义取决于DWT_FUNCTION[n]中定义的功能。DWT_FUNCTION[n]的位字段如下表所示:
| 位 | 名称 | 类型 | 复位值 | 描述 |
| — | — | — | — | — |
| 31:27 | ID | RO | – | 识别比较器“n”的MATCH功能,见下表 |
| 26:25 | Reserved | – | – | 保留 |
| 24 | MATCHED | RO | – | 比较器匹配状态,读取时清零 |
| 23:12 | Reserved | – | – | 保留 |
| 11:10 | DATAVSIZE | R/W | – | 数据值大小,数据值和数据地址比较器监视的数据大小:00 = 字节,01 = 半字,10 = 字。注意:用作指令地址或指令地址限制比较器时,DATAVSIZE必须设置为10 (0x2);若此DWT比较器用于与另一个DWT比较器配对进行数据地址范围检查,DATAVSIZE应设置为00 |
| 9:6 | Reserved | – | – | 保留 |
| 5:4 | ACTION | R/W | – | 匹配时的动作:00 = 仅触发(用于触发数据包生成/ETM触发);01 = 生成调试事件(用于停止或调试监视器);10 = 生成数据跟踪匹配数据包或数据跟踪数据值数据包;11 = 生成数据跟踪数据地址数据包,或数据跟踪PC值数据包,或同时生成数据跟踪PC值数据包和数据跟踪数据值数据包 |
| 3:0 | MATCH | R/W | – | 匹配类型,见下表 |
DWT_FUNCTION[n].MATCH的可用匹配类型如下表所示:
| MATCH [3:0] | 描述 |
| — | — |
| 0000 | 禁用 |
| 0001 | 周期计数器匹配:将DWT_COMP[n]的值与DWT_CYCCNT的值进行比较(Armv8 - M基线不可用) |
| 0010 | 指令地址:将DWT_COMP[n]的值与指令地址进行比较 |
| 0011 | 指令地址限制:当程序执行地址在较低指令地址限制(由比较器[n - 1]指示)和较高指令地址限制(由比较器[n]指示)之间时,触发匹配事件,两个地址均包含在内。此特性需要一对DWT比较器,要使两个比较器配对使用,比较器[n]的MATCH位字段应设置为0011,比较器[n - 1]的MATCH位字段应设置为0010(指令地址)或0000(禁用) |
| 0100 | 数据地址:当未被数据地址限制比较器链接时,将DWT_COMP[n]的值与数据地址进行比较,用于正常数据观察点,DATAVSIZE应设置为监视数据的大小 |
| 0101 | 数据地址,与0100类似,但仅监视写访问 |
| 0110 | 数据地址,与0100类似,但仅监视读访问 |
| 0111 | 数据地址限制:当数据访问地址在较低数据地址限制(由比较器[n - 1]指示)和较高数据地址限制(由比较器[n]指示)之间时,触发匹配事件,两个地址均包含在内。此特性需要一对DWT比较器,要使两个比较器配对使用,比较器[n]的MATCH位字段应设置为0111,比较器[n - 1]的MATCH位字段应设置为0100/0101/0110(数据地址)、1100/1101/1110(带数据值的数据地址)或0000(禁用) |
| 1000 | 数据值:将DWT_COMP[n]的值与数据值进行比较(仅适用于Armv8 - M主线) |
| 1001 | 数据值,与1000类似,但仅监视写访问 |
| 1010 | 数据值,与1000类似,但仅监视读访问 |
| 1011 | 链接数据值:当数据地址与比较器[n - 1]中的值匹配且数据值与比较器[n]中的值匹配时,触发匹配事件。比较器[n - 1]必须设置为0100/0101/0110(数据地址)、1100/1101/1110(带数据值的数据地址)或0000(禁用)。比较器[n - 1]和[n]作为一对使用,可定义地址和数据值条件进行匹配 |
| 1100 | 带值的数据地址:与数据地址(0100)类似,不同之处在于跟踪数据值(仅前4个比较器可用) |
| 1101 | 仅写带值的数据地址:与仅写数据地址(0101)类似,不同之处在于跟踪数据值(仅前四个比较器可用) |
| 1110 | 仅读带值的数据地址:与仅读数据地址(0110)类似,不同之处在于跟踪数据值(仅前四个比较器可用) |
调试工具可通过读取DWT_FUNCTION[n]的ID位字段确定可用的DWT比较器特性。DWT_FUNCTION[n].ID与可用特性的映射如下表所示(注意:00000的值保留):
| 可用特性 | DWT_FUNCTION[n].ID的二进制值 |
| — | — |
| | 01000 | 01001 | 01010 | 01011 | 11000 | 11010 | 11100 | 11110 |
| 数据地址 | Y | Y | Y | Y | Y | Y | Y | Y |
| 带值的数据地址(Cortex - M23处理器不可用) | Y | Y | Y | Y | Y | Y | Y | Y |
| 数据地址限制 | Y | Y | Y | Y | | | | |
| 数据值 | Y | Y | | | | | | |
| 链接数据值 | Y | Y | | | | | | |
| 指令地址 | Y | Y | Y | Y | | | | |
| 指令地址限制 | Y | Y | | | | | | |
| 周期计数器(Cortex - M23处理器不可用) | Y | Y | | | | | | |
当实现周期计数器(DWT_CYCCNT)时,DWT比较器#0必须支持周期计数器比较功能。使用DWT比较器,处理器运行时可跟踪选定的数据变量。通过将DWT_FUNCTION.MATCH设置为1100/1101/1110(带值的数据地址)可实现此功能。例如,使用Keil® MDK的逻辑分析仪特性时,选择性数据跟踪特性可可视化数据值变化。
综上所述,Cortex - M23和Cortex - M33处理器的调试组件提供了丰富的功能,可帮助开发者更高效地进行调试和性能分析。通过合理使用这些组件,能更好地理解程序的执行过程,优化代码性能。
4. 调试组件操作流程总结
4.1 断点单元操作流程
-
启用断点单元
:
- 确保调试工具已连接到目标处理器。
- 读取FP_CTRL寄存器,确认当前断点单元状态。
- 将FP_CTRL寄存器的Key位设置为1,ENABLE位设置为1,启用断点单元。
-
配置硬件断点
:
- 根据需要设置的断点地址,选择合适的FP_COMPn寄存器。
- 将断点地址写入所选FP_COMPn寄存器的BPADDR位,将BE位设置为1,启用该断点比较器。
4.2 DWT操作流程
4.2.1 启用DWT
- 将DEMCR中的TRCENA位设置为1以启用DWT。
-
若使用DWT中的跟踪特性:
- 将ITM跟踪控制寄存器(ITM_TCR)中的TXENA位(位3)设置为1。
- 初始化TPIU以启用跟踪输出。
4.2.2 使用DWT进行性能分析
-
周期计数相关
:
- 根据需求设置DWT_CTRL寄存器中的相关位,如CYCCNTENA、CYCEVTENA、SYNCTAP、CYCTAP等。
- 若实现TrustZone,可根据需要设置CYCDISS位。
- 通过读取DWT_CYCCNT寄存器获取周期计数。
-
性能分析计数器使用
:
- 根据需要设置DWT_CTRL中对应计数器的使能位,如CPIEVTENA、EXCEVTENA、SLEEPEVTENA、LSUEVTENDA、FOLDEVTENA等。
- 当计数器溢出时,会生成相应跟踪数据包,调试主机记录数据包。
- 性能分析操作停止时,计算总计数,如总睡眠周期数 = 跟踪数据包数量 * 256 + SLEEPCNT计数器值。
- 计算总执行指令数:总执行指令数 = 总周期计数 - CPICNT - EXCCNT - SLEEPCNT - LSUCNT + FOLDCNT。
4.2.3 使用DWT数据观察点特性
-
配置DWT_COMP[n]和DWT_FUNCTION[n]寄存器
:
- 根据需求选择合适的n值(0 - 3)。
- 根据所需匹配类型设置DWT_FUNCTION[n]的MATCH位。
- 根据MATCH类型设置DWT_COMP[n]的值。
- 根据需要设置DWT_FUNCTION[n]的DATAVSIZE和ACTION位。
4.3 操作流程总结表格
| 调试组件 | 操作步骤 | 关键寄存器及位设置 |
|---|---|---|
| 断点单元 | 启用断点单元、配置硬件断点 | FP_CTRL(Key = 1, ENABLE = 1)、FP_COMPn(BPADDR、BE = 1) |
| DWT | 启用DWT、使用性能分析功能、使用数据观察点特性 | DEMCR(TRCENA = 1)、ITM_TCR(TXENA = 1)、DWT_CTRL(CYCCNTENA等)、DWT_CYCCNT、DWT_COMP[n]、DWT_FUNCTION[n] |
5. 调试组件使用中的注意事项
5.1 安全状态更改
- 使用DSCSR更改处理器安全状态时需谨慎,确保更改后安全状态与程序地址的安全属性匹配,否则会触发故障异常。
5.2 断点设置
- 不同处理器型号(Cortex - M23和Cortex - M33)支持的硬件断点比较器数量不同,需根据实际情况设置。
- 断点单元默认禁用,使用前需正确设置FP_CTRL寄存器的相关位。
5.3 DWT使用
- 访问DWT寄存器前,必须先启用DWT(设置DEMCR.TRCENA = 1),使用跟踪特性时还需额外设置。
- Cortex - M23处理器部分功能(如周期计数器、性能分析计数器等)未实现,使用时需注意相关寄存器位的状态。
- DWT性能分析计数器为8位,易溢出,需结合跟踪连接使用以准确统计。
- 当DWT PC采样寄存器读取值为0xFFFFFFFF时,需根据不同条件进行判断。
6. 调试组件功能对比
6.1 断点单元功能对比
| 处理器型号 | 支持的硬件断点比较器数量 | 重映射传输功能 | 可设置断点区域 |
|---|---|---|---|
| Cortex - M23 | 最多4个 | 不支持 | 任何可执行区域 |
| Cortex - M33 | 最多8个 | 不支持 | 任何可执行区域 |
| Cortex - M3/M4 | - | 支持 | CODE区域(前512MB内存) |
6.2 DWT功能对比
| 处理器型号 | 周期计数器 | 性能分析计数器 | 数据跟踪生成 |
|---|---|---|---|
| Cortex - M23 | 未实现 | 未实现 | 不可用 |
| Cortex - M33(Armv8 - M主线) | 可用 | 可用 | 可用 |
7. 总结与展望
Cortex - M23和Cortex - M33处理器的调试组件为开发者提供了强大的调试和性能分析能力。断点单元允许在不修改程序代码的情况下设置断点,方便调试程序执行流程;DWT则提供了丰富的功能,如数据观察点、性能分析计数器和周期计数器等,可帮助开发者深入了解程序的性能瓶颈和执行情况。
在未来的开发中,随着处理器性能的不断提升和应用场景的日益复杂,调试组件的功能可能会进一步增强。例如,可能会增加更多的硬件断点比较器,提高DWT比较器的数量和功能,以满足更复杂的调试需求。同时,调试工具也可能会更加智能化,提供更直观的界面和更高效的调试方法,帮助开发者更快地定位和解决问题。
开发者在使用这些调试组件时,应充分了解其功能和操作方法,结合实际需求合理配置,以提高开发效率和程序性能。
graph LR
classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px
classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px
A([开始]):::startend --> B(选择调试组件):::process
B --> C{断点单元?}:::process
C -->|是| D(启用断点单元):::process
D --> E(配置硬件断点):::process
C -->|否| F{DWT?}:::process
F -->|是| G(启用DWT):::process
G --> H{使用性能分析功能?}:::process
H -->|是| I(设置相关寄存器):::process
I --> J(获取周期计数和性能分析数据):::process
H -->|否| K{使用数据观察点特性?}:::process
K -->|是| L(配置DWT_COMP和DWT_FUNCTION寄存器):::process
K -->|否| M(结束):::startend
J --> M
E --> M
L --> M
以上流程图展示了选择调试组件(断点单元或DWT)后,根据不同功能需求进行相应操作的流程,帮助开发者更清晰地了解调试组件的使用步骤。
超级会员免费看
77

被折叠的 条评论
为什么被折叠?



