能否在调试器中设置一个记号,当内存空间被改写时触或标记该记号?
使用 keil仿真调试stm32f070时,遇到了一个问题,程序在内存空间中写入了无法识别的内容地址是0x20001FFC,这个写入内容不是我想要的,也不知是如何写进去的。能否在调试器中设置一个记号,当内存空间被改写时触或标记该记号?或者记录该事件? 通过调试器设置硬件断点,当程序执行到该断点时,程序会暂停执行 单片机模拟EEPROM可以用于存储设备的固件程序
插入特殊的指令来实现断点,但这种方式可能会占用一定的程序内存,且不是所有位置都适合设置软件断点
将要监视的内存区域对应的变量添加到调试器的监视窗口中。这样,在程序运行过程中,可以实时观察到这些变量的值的变化
有些调试器允许直接监视特定的内存区域。可以设置需要监视的内存起始地址和长度,当内存中的值发生变化时,调试器会发出提示或标记出来。
在程序运行过程中,定期(可以是每隔一段时间或在某些关键操作后)再次读取内存空间的内容,并与初始状态进行对比
在 Keil MDK 中调试 STM32F070 时,若发现 内存地址 0x20001FFC 被意外改写,可以通过设置内存写入断点(硬件断点)
连接调试器(如 ST-Link/J-Link),启动调试会话(点击 Debug 按钮)。添加内存访问断点:在 Memory Window 中输入地址 0x20001FFC。Access Type: 选择 Write(监控写入操作)。Size: 根据数据类型选择(如 Word 表示 4 字节)。点击 OK 保存。这样就可以
一般可以用断点的方式,比如说当程序向 0x20001FFC 写入数据时,CPU 会自动暂停,并跳转到触发该写入的代码位置
检查Call Stack窗口和反汇编视图,定位改写来源
使用 Event Recorder 记录内存写入事件,适用场景:需记录写入事件,但不想暂停程序。需启用 CMSIS-EventRecorder 组件(需额外代码插入)
在 Keil 中安装 CMSIS-EventRecorder 软件包(通过 Pack Installer)。在代码中初始化 Event Recorder
使用 Data Watchpoint and Trace (DWT)适用场景:需硬件级监控,无断点数量限制(但需芯片支持)。STM32F070 需支持DWT模块(Cortex-M0 通常不支持,仅限 M3/M4/M7)
我觉得可以通过 DWT 触发中断或结合 Event Recorder 记录事件
手动检查内存改写来源,若无法使用高级调试功能
0x20001FFC 接近 RAM 末尾(STM32F070 的 RAM 通常为 0x20000000~0x20001FFF),可能是栈溢出导致。检查启动文件(startup_stm32f070.s) 中的栈大小(Stack_Size),适当增大
页:
[1]