编辑:这是我无法调试的代码的最小工作示例。我找到了编译问题的解决方案。
编译问题的解决方案:添加 .syntax 统一,它停止抱怨 it 块。
不过,仍然不确定这些标志
我在使用 ARM 程序集时遇到了一些麻烦。我有一个 STM32F769NI 探索板(它有一个 Cortex M7)。
我有一个让 LED 闪烁的程序,如果我用 ST Utility thingy 闪烁它,它工作正常,我也可以用相同的应用程序运行它。
但是,我在编译时遇到了一些麻烦。一旦我介绍了与条件指令相关的任何内容(cmp、it blocks 和 BL{cond}),事情就会向南发展,但我也不知道编译汇编代码实际上需要哪些参数。目前,我正在使用
gcc -mthumb -mcpu=cortex-m7 -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -ffast-math -c -g
我没有找到任何标志 as 这似乎是汇编代码更合乎逻辑的选项。
对于链接,我使用
ld -T script.ld
它似乎适用于我目前拥有的程序,但我无法通过条件执行编译任何东西。
如果我简单地添加
cmp r0, r1
bleq wait
它说src/main.s:59: Error: Thumb does not support conditional execution
嗯不错。因此,让我们在这两条指令上方添加一条it eq
,因为那是您应该为拇指做的,对吧?
然后我得到了更多的错误
src/main.s:60: Error: Thumb does not support conditional execution
src/main.s:62: Error: incorrect condition in IT block -- `b loop'
第 60 行是它的分支,第 62 行是下一条指令(它们之间的空行)。
所以,即使我的代码编译了,但似乎有些错误。wait
是一个存在的标签。否则代码可以正常工作。LED 像应有的那样闪烁。
调试问题
现在关于调试。我尝试了 OpenOCD 并尝试了 ST-Utility。
使用 OpenOCD,通过 GDB 刷新芯片的所有其他尝试都会失败。此外,有时,如果我启动 GDB,它不会在开始标签处停止,而是在某个垃圾地址处停止。我也从未想过如何简单地使用 OpenOCD 运行程序。我通过tar remote :3333
使用 ST-Utility,每次都可以通过 GDB 进行刷新,但我无法使用 st-flash 应用程序进行刷新。它抛出这个错误:
2018-01-04T10:09:22 ERROR C:\Users\Jerry\Desktop\stlink-master\src\flash_loader.c: flash loader run error
2018-01-04T10:09:22 ERROR C:\Users\Jerry\Desktop\stlink-master\src\common.c: stlink_flash_loader_run(zx) failed! == -1
stlink_fwrite_flash() == -1
我tar extended-remote :4242
过去常常通过 st-utility 连接到开发板。
ST-Utility 也忽略断点。我可以运行并终止程序(不能用 OpenOCD 做到这一点),但如果我设置断点并使用“运行”,它会忽略断点。如果我继续,它会挂起。我可以用 OpenOCD 做到这一点。
闪烁、运行、暂停和单步执行程序与 ST-Link 软件完美配合。
我正在使用内置的 ST-Link/V2.1。
我在 GitHub 存储库中有我的代码和任何配置文件。OpenOCD 还有一个 bat,所以你可以看到我使用的参数(我只使用 -m 来表示 st-util)。
我知道有一些我可以使用的 IDE 可以帮我完成这项工作,但我不想处理 eclipse。我对 Visual Studio Code 非常满意,我想继续使用它。
我从控制台而不是在 Visual Studio Code 中启动 GDB。
编辑:我刚刚意识到我的等待函数实际上有条件分支。这行得通,但如果我在其他地方添加条件,它就行不通了……我不知道为什么。