华芯微特开发论坛

 找回密码
 立即注册
搜索
热搜: SWM341 资料
查看: 1306|回复: 2

SWM341 DWT 硬件观察点监控内存读写。。

[复制链接]

14

主题

61

帖子

789

积分

超级版主

Rank: 8Rank: 8

积分
789
发表于 2024-1-22 14:54:06 | 显示全部楼层 |阅读模式
本帖最后由 XIVN1987 于 2024-1-22 15:04 编辑

使用 SWM341 的 DWT 硬件观察点功能,可以监测指定地址的读写操作,当发生对指定地址的读写操作时,触发 DebugMonitor 中断,,然后通过 J-Link 读取出当前栈内容,,分析异常栈帧,,可以解析出发生指定地址读写的程序位置,,甚至分析出程序是如何从 main() 函数一层层调用执行到该地址的。

例如,在 main() 函数起始处添加如下四行代码
  1.     CoreDebug->DEMCR = CoreDebug_DEMCR_TRCENA_Msk |
  2.                        CoreDebug_DEMCR_MON_EN_Msk;

  3.     DWT->COMP0 = (uint32_t)&UART0->DATA;
  4.     DWT->FUNCTION0 = (2 << DWT_FUNCTION_DATAVSIZE_Pos) |
  5.                      (1 << DWT_FUNCTION_ACTION_Pos) |
  6.                      (5 << DWT_FUNCTION_MATCH_Pos);
  7.    
  8.     NVIC_EnableIRQ(DebugMonitor_IRQn);
复制代码

这样就对 UART0->DATA 设定了一个硬件观察点,不管程序任何地方只要对 UART0->DATA 执行写操作,,就会立即触发 DebugMonitor 中断,,程序就会跳转到 DebugMon_Handler() 函数执行

在 SerialInit() 中添加语句 UART0->DATA = 'C'; 进行演示,编译下载程序后、板子重新上电(或按复位按键重新执行),会发现程序不再正常执行,通过 J-Link Commander 执行 Halt 命令显示如下:
JLink_Cmdr DebugMon.jpg

IPSR = 12,可知当前程序在 DebugMon_Handler() 中执行,因为默认的 DebugMon_Handler() 是个死循环,一旦进入程序就会一直在此函数中执行

另外,通过 SP 的值,还可以知道异常栈帧在内存 0x20003FD8 处,通过 mem32 读出栈内容,就可以解析出发生指定地址读写的位置和callstack

不过手动解析异常栈帧比较麻烦,,可以使用 DAPCmdr 自动根据反汇编文件解析异常栈帧,,解析出发生指定地址读写的位置和callstack
DAPCmdr DebugMon.jpg

如上图所示,,使用 path dll 命令设置 JLink DLL 文件路径,使用 path dis 命令设置 SWM341 正在执行的程序的反汇编文件,,然后回车连接 SWM341,执行 halt 命令即可打印内核寄存器的内容,,如果 IPSR 的值为 3 或 12,即发生了 HardFault 或 DebugMonitor 异常,,DAPCmdr 会自动打印出栈顶 64 个字的内容,,并根据反汇编文件解析 Call Stack。

根据上图中的 Call Stack 可知,在 SerialInit() 的 0x2AE 地址处执行了对 UART0->DATA 的写操作,,SerialInit() 是在 main() 的 0x1F0 地址处调用的。。解析结果与实际代码一致。。
回复

使用道具 举报

14

主题

61

帖子

789

积分

超级版主

Rank: 8Rank: 8

积分
789
 楼主| 发表于 2024-1-22 15:11:03 | 显示全部楼层

Keil 下生成反汇编文件:
  1. fromelf --text -a -c -o "$L@L.asm" "#L"
复制代码

Keil_disassembling.jpg

回复

使用道具 举报

14

主题

61

帖子

789

积分

超级版主

Rank: 8Rank: 8

积分
789
 楼主| 发表于 2024-1-22 15:24:28 | 显示全部楼层


DAPCmdr 下载地址:https://gitee.com/XIVN1987/DAPCmdr

仓库中有 DAPCmdr 的源码和使用说明。。

如果没有 Python 执行环境,,可以在链接页面右侧的“发行版”处下载打包好的 exe 免安装可执行文件。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|华芯微特开发论坛

GMT+8, 2025-1-10 06:43 , Processed in 0.034923 second(s), 21 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表