【发布时间】:2020-06-11 06:27:27
【问题描述】:
我正在使用 ARM 编译器 V6(“新”armclang 编译器)在 Keil MDK 5.28 上为 STM32 开发一个新项目。这是我第一次使用 armclang。
我的重置处理程序正在调用__main 符号。正如预期的那样,这是执行 Keil C 库的一些启动代码,然后调用我的 main 函数(稍后,我将删除对启动代码的调用,但现在我想了解这个问题)。
问题如下:在一个 C 库函数 (_sys_open) 中有一条 BKPT 指令。我没有设置这个断点,它也没有出现在断点列表中。我无法删除它(显然试图重建一切)。因此,如果不中断此位置,我将无法启动调试会话。
我还尝试取消选中“Run to Main”选项。
你知道这个 BKPT 指令是从哪里来的以及如何去掉它吗?
【问题讨论】:
-
如果已开启,请尝试关闭半托管。我目前正在使用 armclang(从 armv5 编译器移植)。它的背部疼痛。
-
断点 (
BKPT) 可能是某些错误处理程序的一部分。找出对应的 C 源代码行,看看哪里出了问题。无论如何,打电话给_sys_open是可疑的...... -
不确定这是否适用于 µVision/Clang,但如果使用 GNU 工具链,您可以通过
addr2line -e YourProgram.elf 0x8000A68找到BKPT的源位置,前提是 ELF 文件包含调试信息。 -
根据地图文件说明在此函数中。查看屏幕截图。
-
是的,但不是该函数中的 where。里面可能有
if (some error condition) __asm__ volatile ("BKPT");之类的东西。你需要找到那个条件......但是,由于BKPT似乎是无条件的,它实际上可能与 Rik 所说的半主机相关。