我遇到了一个问题,我的 IDE 正在控制我。
我有一个简单的项目,我通过 ITM (SWO) 从 mcu 追溯,基本上发生的事情是当我启动 STlink 调试器时,它连接到设备闪存程序,然后 IDE 忽略所有断点。我手动停止它以发现我从重置处理程序转到默认处理程序,我将所有处理程序别名为它,除了硬故障。
于是奇怪的事情开始发生。我检查了我的代码...没有犯罪。在所有..检查内存,一切都在它应该在的地方。检查向量表的内存......再次堆栈指针首先是,然后是复位处理程序的地址(拇指模式)。一切都很好。我再次启动调试器,它运行起来就像一个魅力。
所以我决定再次重新启动调试器而不更改代码中的任何内容,我最终陷入了硬故障......然后我再次启动它,没有硬故障,但我在默认处理程序中。它随机出现故障或运行。我花了 2-3 个小时检查每一位和指令,看看可能出了什么问题。但看起来它随机选择去哪里 - 硬故障,正常运行或决定它想要一个默认处理程序。
0x20010000 堆栈指针 - 地址是合法的,检查它。
0x080001D5 指向 0x080001D4 处的重置处理程序。
0x080001C9 默认handler地址,下一个是hardfault。
现在更奇怪的东西......我将调试器切换到OPENOCD并......
xPSR: 0x61000000 pc: 0x20000084 msp: 0x20010000
它显然会努力从 RAM 启动,不知道为什么或发生了什么我的重置处理程序清楚地告诉它寻找其他东西。然后在调试器重新启动几次后,它运行正常。
更新:
我现在 100% 确定这是 IDE 的时髦行为。我在独立的 openOCD 客户端中逐步完成了整个程序,它运行起来就像一个魅力。没有硬故障或其他意外跳转到处理程序。