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

Posted

技术标签:

【中文标题】如何为 ARM Cortex M7 编译和调试 ASM 代码?【英文标题】:How do I compile and debug ASM code for ARM Cortex M7? 【发布时间】:2018-01-04 09:46:52 【问题描述】:

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

编译问题的解决方案:添加 .syntax 统一,它不再抱怨 it 块。

但仍然不确定标志


我在使用 ARM 组装时遇到了一些问题。我有一个 STM32F769NI 探索板(它有一个 Cortex M7)。

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

但是,我在编译时遇到了一些麻烦。一旦我介绍了与条件指令相关的任何内容(cmp、it blocks 和 BLcond),事情就会向南发展,但我也不知道编译汇编代码实际上需要哪些参数。目前,我正在使用

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 指令中使用。 【参考方案1】:
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:

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

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

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

【讨论】:

以上是关于如何为 ARM Cortex M7 编译和调试 ASM 代码?的主要内容,如果未能解决你的问题,请参考以下文章

ARM Cortex M7:缓存清理可以覆盖 DMA 设备所做的更改吗?

ARM

单片机行业经常提到的M0 M1 M2 M3 M4 M7指的是啥

ARM基础教程 | ARM代码编译链接调试的过程

MDK-ARM下载与安装

ARM基础教程 | ARM Cortex-M的调试和跟踪技术