如何编译和调试ARM Cortex M7的ASM代码?

时间:2018-01-04 09:46:52

标签: assembly arm gdb cortex-m openocd

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

编译问题解决方案:添加.syntax统一,并停止抱怨它阻止。

仍然不确定标志,但

我在ARM组装方面遇到了一些麻烦。我有一台STM32F769NI发现板(有一台Cortex M7)。

我有一个程序正在使LED闪烁,如果我使用ST Utility实现它可以正常工作,我也可以使用相同的应用程序运行它。

但是,我在编译方面遇到了一些麻烦。一旦我介绍了条件指令的任何关系(cmp,它阻塞和BL {cond}),事情就会向南发展,但我也不知道我编译汇编代码时实际需要什么参数。目前,我正在使用

gcc -mthumb -mcpu=cortex-m7 -mfpu=fpv5-sp-d16 -mfloat-abi=hard -ffunction-sections -fdata-sections -ffast-math -c -g

我没有设法找到任何标志,因为这似乎是汇编代码更合乎逻辑的选项。

对于链接,我使用

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,所以你可以看到我使用的参数(我只使用-m作为st-util)。

我知道我可以使用的IDE可以将这项工作从我身上拿走,但我不想处理eclipse。我对Visual Studio Code非常满意,并且我想继续使用它。

我从控制台启动了GDB,而不是在Visual Studio Code中启动。

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

1 个答案:

答案 0 :(得分:0)

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

矢量应该与一个lsbit集合进行比较。 添加代码以指示这是一个拇指功能标签

.thumb_func
_start:

解决了这个问题

08000000 <wait-0x8>:
 8000000:   20001000
 8000004:   08000017
也许这是唯一的问题,也许还有其他问题。

我建议你的&#34; isr&#34;,(向量表)获得更多条目,让它们进入无限循环。

.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:

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

将来请在问题文本中发布示例而不是链接。例如,如果您根据该链接修改代码,甚至修复任何损坏的内容,您现在已经将此问题视为对其他人有用。

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