在我的 CM3 裸机 C 应用程序中,我有一个启动脚本,它在内存中目标区域的代码和数据部分上运行 CRC。我注意到有时代码检查会失败,有时不会,这取决于我是否设置了任何断点。好吧,我已经从因果关系中确定编译后的额外断点破坏了代码部分的 CRC,显然是因为这些断点是我的 IDE 后来添加的。
我想在这里检查以下提议是否可行:在 CRC 函数中,捕获我代码中在运行时设置的所有额外断点,并禁用它们,以便指令返回到编译时的状态,然后运行CRC校验功能,然后在该功能结束时重新启用它们。
有办法吗?我想如果没有,那么我将不得不在任何调试过程中跳过 CRC 检查。
提前致谢!
有办法吗?
没有——但根本不需要。它们在那里是因为你在调试软件中设置了太多断点。
Cortex-m3 可以有 2 个(简化的实现)到 6 个硬件指令比较器。如果获取指令的地址与编程的地址匹配,则为内核提供 bkpt 指令。
一些调试探针软件(例如 J-Link)提供软件断点。软件断点就是编程到闪存中的
bkpt
指令。它改变了原来的FLASH 内容。如果您尝试使用超过硬件断点的数量,则会放置它们。
要防止这种行为,只需禁用调试软件中的软件断点,或者使用的断点不要超过硬件断点(即 2 或 6,具体取决于您的硬件版本 [我知道它是 M3])
如果您使用 J-Link 调试器,您可以使用 Web 界面来禁用硬件断点(在这张图片上它们是启用的):