【发布时间】:2018-01-04 09:46:52
【问题描述】:
编辑:here 是我无法调试的代码的最小工作示例。我找到了编译问题的解决方案。
编译问题的解决方案:添加 .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 存储库 here 中有我的代码和任何配置文件。 OpenOCD 也有一个 bat,所以你可以看到我使用的参数(我只对 st-util 使用 -m)。
我知道我可以使用一些 IDE 来减轻我的工作负担,但我不想处理 eclipse。我对 Visual Studio Code 非常满意,我想继续使用它。
我从控制台而不是在 Visual Studio Code 中启动 GDB。
编辑:我刚刚意识到我的等待函数实际上有条件分支。这行得通,但如果我在其他地方添加条件,它就行不通了……我不知道为什么。
【问题讨论】:
-
显示 minimal reproducible example 以获取不起作用的代码。根据您的描述,不清楚您尝试了什么。
-
链接的 github 提交是我无法调试但可以编译的代码示例。我将添加一个也无法编译的代码的小脚本。
-
关于条件执行的部分只是表明你对
it的工作原理似乎还没有完全理解。考虑阅读手册并研究其中提供的示例,以了解您需要做哪些不同的事情。如果我没记错的话,bl无论如何都不允许在it指令中使用。
标签: assembly arm gdb cortex-m openocd