- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在为 ARM Cortex M3 开发引导加载程序。
我有两个函数,一个在 C 中,一个在 assembly 中,但是当我尝试调用 assembly 函数 时,我的程序挂起并生成某种错误。
功能如下,
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
。加载的代码打印“再见”,然后重置芯片。
如果我慢慢地逐步完成 load
调用 asmJump
的部分,一切都会完美无缺。但是,当我让代码运行时,我的代码遇到了“内存故障”。我知道这是一个内存故障,因为它以某种方式导致 Hard Fault
(当我在 4 或 5 秒后暂停时,Hard Fault 处理程序的无限 while 循环正在执行)。
有没有人遇到过这个问题?如果是这样,您能告诉我如何解决吗?
如您所见,我已尝试使用函数属性来解决问题,但尚未找到解决方案。我希望有人能帮助我首先了解问题所在。
编辑:
感谢@JoeHass 的回答,以及@MartinRosenau 的评论,此后我继续寻找 this SO answer这对为什么我需要这个标签有一个非常详尽的解释。这是一本很长的书,但值得一读。
最佳答案
我认为您需要告诉汇编程序使用统一语法并将您的函数显式声明为拇指函数。 GNU 汇编器有这样的指令:
.syntax unified
.section .text
.thumb_func
.global asmJump
asmJump:
.syntax unified
指令告诉汇编程序您正在使用汇编代码的现代语法。我认为这是一些遗留语法的不幸遗留物。
.thumb_func
指令告诉汇编程序该函数将以拇指模式执行,因此用于符号 asmJump
的值将其 LSB 设置为 1 .当 Cortex-M 执行分支时,它会检查目标地址的 LSB 以查看它是否为 1。如果是,则目标代码以拇指模式执行。由于这是 Cortex-M 支持的唯一模式,如果目标地址的 LSB 为零,它将出错。
关于调用汇编例程的 C 代码 - ARM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18841693/
我最近购买了《C 编程语言》并尝试了 Ex 1-8这是代码 #include #include #include /* * */ int main() { int nl,nt,nb;
早上好!我有一个变量“var”,可能为 0。我检查该变量是否为空,如果不是,我将该变量保存在 php session 中,然后调用另一个页面。在这个新页面中,我检查我创建的 session 是否为空,
我正在努力完成 Learn Python the Hard Way ex.25,但我无法理解某些事情。这是脚本: def break_words(stuff): """this functio
我是一名优秀的程序员,十分优秀!