【问题标题】:How do I call a C function in another module from inline assembler in IAR EWARM?如何从 IAR EWARM 的内联汇编程序调用另一个模块中的 C 函数?
【发布时间】:2012-10-05 18:48:19
【问题描述】:

我在硬故障处理程序中进行了一些组装。该程序集基本上是为了将当前堆栈指针作为参数传递(在 R0 中)。好像是这样……

__asm("    mov     r0, sp\n"
  "    bl      SavePC\n"
  "    bx      lr");

当 SavePC 在同一个 c 文件中时,这可以正常工作。但是,当将 SavePC 放在另一个 c 文件中时,我没有运气。我试图像这样导入函数......

__asm("IMPORT SavePC\n"
" mov r0, sp\n"
" bl SavePC\n"
" bx lr");

...但我一定做错了什么。编译器报告以下...

Error[Og005]: Unknown symbol in inline assembly: "IMPORT" 
Error[Og005]: Unknown symbol in inline assembly: "SavePC" 
Error[Og006]: Syntax error in inline assembly: "Error[54]: Expression can not be forward"
Error[Og005]: Unknown symbol in inline assembly: "SavePC" 
Error while running C/C++ Compiler 

带有程序集的 c 文件包括带有 SavePC 原型的头文件...

extern void SavePC(unsigned long);

建议?

【问题讨论】:

  • 你有没有在这个 asm 代码所在的文件中定义为 extern 的函数 SavePC
  • @maths-help-seeker 我包含了 SavePC 的头文件,它的原型定义为 extern - extern void SavePC(unsigned long);。好吗?
  • 是的..我正在阅读汇编程序的手册。它使用 EXTERN 。您能否也检查一下而不是导入?
  • @maths-help-seeker 我试过了,编译器返回... 错误[Og005]:内联汇编中的未知符号:“EXTERN”V:\interrupt_setup.c 137
  • 这个页面展示了一个如何编写一个好的故障处理程序的例子。您不需要使用内联汇编。 blog.frankvh.com/2011/12/07/cortex-m3-m4-hard-fault-handler

标签: c inline-assembly extern cortex-m3 iar


【解决方案1】:

即使调用正确,您的代码也无法工作。

bl _SavePC
bx lr

您认为bx lr 指令中LR 寄存器中的值是多少? 指令本身的地址! bl 指令已将其放在那里。 这实际上是带有 bx 指令的while (1);

嵌套函数调用看起来更像这样:

push lr
bl _SavePC
pop pc

要获取堆栈寄存器,请使用相应的 CMSIS 函数:

  • __get_MSP() 用于主堆栈指针 (MSP)
  • __get_PSP() 用于进程堆栈指针 (PSP)

【讨论】:

    【解决方案2】:

    使用 extern 是一个坏习惯,因为它容易出错。 C-99 标准为外部提供了一种安全的替代方案。您应该在没有 extern 关键字的头文件中编写函数原型。然后在两个 C 文件中包含头文件。然后链接器负责将函数链接到不同的文件中。

    例子:

    文件:custom_header.h

    void SavePC(unsigned long);
    

    文件:source_c_file.c

    #include "custom_header.h"
    
    void SavePC(unsigned long)
    {
          ....
          ....
    
          ....
    
    }
    

    文件:user_c_file.c

    #include "custom_header.h"
    
    void someFunction(void)
    {
    .
    .
    .
    
    __asm("    mov     r0, sp\n"
      "    bl      SavePC\n"
      "    bx      lr");
    
    .
    .
    .
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-23
      • 1970-01-01
      • 2012-07-09
      相关资源
      最近更新 更多