代码之家  ›  专栏  ›  技术社区  ›  nonsensickle

调用汇编例程的C代码-ARM

  •  6
  • nonsensickle  · 技术社区  · 11 年前

    我目前正在为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 。加载的代码打印“再见”,然后重置芯片。

    如果我慢慢走过 负载 电话 asmJump 一切都很完美。然而,当我让代码运行时,我的代码会遇到 “内存故障” 。我知道这是内存故障,因为它会导致 Hard Fault 在某种程度上(当我在4或5秒后暂停时,Hard Fault处理程序的无限while循环正在执行)。

    以前有人经历过这个问题吗?如果是,你能告诉我如何解决吗?

    正如你所看到的,我已经尝试使用函数属性来解决这个问题,但还没有找到解决方案。我希望有人能帮助我首先了解问题所在。

    编辑:

    感谢@JoeHass的回答,感谢@MartinRosenau的评论,我后来发现 this SO answer 对我为什么需要这个标签有一个非常彻底的解释。这是一本很长的书,但值得一读。

    3 回复  |  直到 7 年前
        1
  •  8
  •   user1619508 user1619508    11 年前

    我认为您需要告诉汇编程序使用统一的语法,并明确声明您的函数为拇指函数。GNU汇编程序有如下指令:

      .syntax unified
      .section .text
      .thumb_func
      .global asmJump
    asmJump:
    

    这个 .syntax unified 指令告诉汇编程序您正在为汇编代码使用现代语法。我认为这是一些遗留语法的不幸遗迹。

    这个 .thumb_func 指令告诉汇编程序该函数将以拇指模式执行,因此用于符号的值 asmJump 将其LSB设置为1。当Cortex-M执行分支时,它会检查目标地址的LSB,看看它是否是一个。如果是,那么目标代码将以拇指模式执行。由于这是Cortex-M支持的唯一模式,因此如果目标地址的LSB为零,它将出现故障。

        2
  •  1
  •   Community CDub    7 年前

    既然你提到你有调试器在工作,那就用它吧!

    查看故障状态寄存器 determine the fault source 。也许不是 asmJump 崩溃,但你正在调用的代码。

        3
  •  0
  •   TwoCode    11 年前

    如果这是你所有的代码。。我想您对SP的更改称为段错误或类似的错误。 您应该在更改SP之前保存它,并在使用后恢复它。

    ldr r6, =registerbackup
    str sp, [r6]
    #your code
    ...
    ldr r6, =registerbackup
    ldr sp, [r6]