我目前正在为ARM Cortex M3开发一个引导加载程序。
我有两个功能,一个是用C编写的,另一个是用汇编语言编写的,但是当我尝试调用汇编函数时,我的程序会挂起并生成某种故障。
这些函数如下:
C:
extern void asmJump(void* Address) __attribute__((noreturn));
void load(void* Address)
{
asmJump(Address);
}
组装:
.section .text
.global asmJump
asmJump: @ Accepts the address of the Vector Table
@ as its first parameter (passed in r0)
ldr r2, [r0] @ Move the stack pointer addr. to a temp register.
ldr r3, [r0, #4] @ Move the reset vector addr. to a temp register.
mov sp, r2 @ Set the stack pointer
bx r3 @ Jump to the reset vector
我的问题是这样的:
代码通过串口打印“Hello”,然后调用
load
。被加载的代码打印“Good Bye”,然后重置芯片。如果我在
load
调用asmJump
的部分慢慢步进,一切都正常。然而,当我让代码运行时,我的代码会出现一个“内存故障”。我知道这是一个内存故障,因为它以某种方式导致了一个“硬故障”(当我暂停4或5秒后,硬故障处理程序的无限循环正在执行)。有人之前遇到过这个问题吗?如果是这样,请告诉我如何解决它。
正如你所看到的,我已经尝试使用函数属性来解决这个问题,但还没有找到解决方案。我希望有人能帮助我理解首先出现的问题是什么。
编辑:
感谢 @JoeHass 的回答,以及 @MartinRosenau 的评论。我后来找到了一个非常详细的解释,说明为什么我需要这个标签,链接在这里:this SO answer。虽然内容很长,但是非常值得一读。
!=
数据问题或者流水线效应;这也解释了为什么在调试器中暂停时它能够工作。 - artless noisedsb
,isb
指令,但它们并不是问题所在。这是一个非常愚蠢的错误。我只是不知道如果链接器没有.thumb_func
标志,我的汇编代码就不会被视为 Thumb 代码。 - nonsensickle