我正在使用 SWD 探针在 MAX32660 中写入内存位置,同时运行以下程序。
while (true)
{
DEBUG("x=%d", *(int volatile*)0x20017000);
Tick_Delay_US(1000000);
}
正在工作;程序显示探头写入的值:
92503131 main.c:81 x=125300000
93503118 main.c:81 x=125400000
94503104 main.c:81 x=125600000
95503090 main.c:81 x=125700000
96503077 main.c:81 x=125900000
97503063 main.c:81 x=126100000
98503050 main.c:81 x=126200000
99503036 main.c:81 x=126400000
不幸的是,GDB(通过 pyocd 服务器)似乎只能在每次程序停止后从内存中读取一次值:
(gdb) print *(int volatile*)0x20017000
$1 = 178700000
(gdb) print *(int volatile*)0x20017000
$2 = 178700000
(gdb) print *(int volatile*)0x20017000
$3 = 178700000
(gdb) print *(int volatile*)0x20017000
$4 = 178700000
(gdb) print *(int volatile*)0x20017000
$5 = 178700000
(gdb) print *(int volatile*)0x20017000
$6 = 178700000
(gdb) print *(int volatile*)0x20017000
$7 = 178700000
(gdb) cont
Continuing.
^C
Program received signal SIGINT, Interrupt.
0x000003aa in Tick_Reached (target=<optimized out>) at ../../max/Tick.h:60
60 {while (!Tick_Reached(target));}
(gdb) print *(int volatile*)0x20017000
$8 = 180800000
(gdb) print *(int volatile*)0x20017000
$9 = 180800000
(gdb) print *(int volatile*)0x20017000
$10 = 180800000
(gdb) print *(int volatile*)0x20017000
$11 = 180800000
我查看了探测日志,发现 GDB 仅在我第一次请求时才读取该值(通过 MEM-AP 的 TAR/DRW 寄存器)。
这是出乎意料的并且不是很有用。程序的运行与内存缓存有什么关系? (另外,即使它们相关,我也不明白这一点。我以为它可能是在程序停止时尝试对内存进行快照。但事实并非如此。它正在按需读取值......但只有在您第一次要求它)。
除了继续执行程序之外,还有什么办法可以强制GDB再次从内存中读取值吗?
我在
pyocd
中打开了 DEBUG 日志记录,并看到以下与 GDB 获取新值相关的消息:
DEBUG:Probe:WRITE TAR (AP0.04) <- 0xe000edf0
DEBUG:Probe:READ DRW (AP0.0c), now=False, uid=rd75
DEBUG:Probe: rd75 = 0x01010001
DEBUG:pyocd.cache.memory:core is running; invalidating cache
DEBUG:Probe:WRITE TAR (AP0.04) <- 0x20017000
DEBUG:Probe:READ DRW (AP0.0c), now=True, uid=rd76
DEBUG:Probe: rd76 = 0x049791b4
DEBUG:Probe:FLUSH
pyocd.cache.memory
似乎在说它正在使缓存失效因为核心正在运行。这当然是一个有缺陷的启发式。
我通过在
pyocd.cache.memory
中添加对 self._reset_cache()
的无条件调用来禁用 memory.MemoryCache._check_cache()
。现在 GDB 正在按预期工作:
(gdb) print *(int*)0x20017000
$1 = 207094350
(gdb) print *(int*)0x20017000
$2 = 207323100
(gdb) print *(int*)0x20017000
$3 = 207425550
(gdb) print *(int*)0x20017000
$4 = 207484200
(gdb) print *(int*)0x20017000
$5 = 207542850
(gdb) print *(int*)0x20017000
$6 = 207581550
我将提出一个关于关闭缓存的最佳方法的单独问题。