0

编辑是我无法调试的代码的最小工作示例。我找到了编译问题的解决方案。

编译问题的解决方案:添加 .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。

编辑:我刚刚意识到我的等待函数实际上有条件分支。这行得通,但如果我在其他地方添加条件,它就行不通了……我不知道为什么。

4

1 回答 1

0
08000000 <wait-0x8>:
 8000000:   20001000
 8000004:   08000016

向量应该与一个 lsbit 集相匹配。添加代码以指示这是拇指功能标签

.thumb_func
_start:

解决了这个问题

08000000 <wait-0x8>:
 8000000:   20001000
 8000004:   08000017

也许这是唯一的问题,也许还有其他问题。

我建议您的“isr”,(向量表)获取更多条目,只是让它们进入无限循环。

.section .isr_vector
.word 0x20001000
.word _start
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang
.word hang


.thumb_func
hang: b hang


.thumb_func
_start:

这样,因为如果这是预取中止或未定义的指令,您正在尝试使用调试器(获取中止使用表中偏移量处的“地址”,这实际上是拇指代码,在某处进入杂草并最终挂起) 你有一半的机会跟踪它。如果您最终进入无限循环,您可以为每个向量创建一个单独的无限循环。

将来请在问题文本中发布示例,而不是链接。例如,如果您完全修改该链接处的代码,甚至修复任何损坏的部分,您现在已经破坏了这个问题,因为它对其他人有用。

也许即使在我写这篇文章的时候,你已经修复了它?如果是这样,要么修复问题以涵盖问题的历史并修复,要么一起删除问题。

于 2018-01-04T13:13:42.893 回答