【问题标题】:Breakpoint instruction inside ARM v6 compiler startup codeARM v6 编译器启动代码中的断点指令
【发布时间】: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 所说的半主机相关。

标签: stm32 keil armclang


【解决方案1】:

cmets 总结: 断点指令BKPT 是半主机功能的一部分,它应该与调试器配合使用。启用 Microlib 会禁用半主机;见herehere

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多