编辑: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中启动。
编辑:我刚刚意识到我的等待函数实际上有条件分支。这有效,但如果我在其他地方添加条件,它就不起作用......我不知道为什么。
答案 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;在表中的偏移量,实际上是拇指代码,启动在某个地方进入杂草并最终挂起)你有一半的机会跟踪它。如果你最终进入无限循环,你可以为每个向量创建一个单独的无限循环。
将来请在问题文本中发布示例而不是链接。例如,如果您根据该链接修改代码,甚至修复任何损坏的内容,您现在已经将此问题视为对其他人有用。
也许即使现在我写这篇文章你已经修好了吗?如果是这样,要么修复问题以涵盖问题的历史和修复,要么一起删除问题。