如何从IAR EWARM中的内联汇编程序调用另一个模块中的C函数?

如何从IAR EWARM中的内联汇编程序调用另一个模块中的C函数?,c,inline-assembly,extern,cortex-m3,iar,C,Inline Assembly,Extern,Cortex M3,Iar,我在硬故障处理程序中有一点组装。程序集基本上是要将当前堆栈指针作为参数传递(在R0中)。看起来是这样 __asm(" mov r0, sp\n" " bl SavePC\n" " bx lr"); __asm("IMPORT SavePC\n" " mov r0, sp\n" " bl SavePC\n" " bx lr"); 当SavePC位于同一个c文件中时,这种方法可以正常工作。然而,当SavePC被放在另一个c文件中时,我就没有运

我在硬故障处理程序中有一点组装。程序集基本上是要将当前堆栈指针作为参数传递(在R0中)。看起来是这样

__asm("    mov     r0, sp\n"
  "    bl      SavePC\n"
  "    bx      lr");
__asm("IMPORT SavePC\n"
" mov r0, sp\n"
" bl SavePC\n"
" bx lr");
当SavePC位于同一个c文件中时,这种方法可以正常工作。然而,当SavePC被放在另一个c文件中时,我就没有运气了。我已经尝试像这样导入函数

__asm("    mov     r0, sp\n"
  "    bl      SavePC\n"
  "    bx      lr");
__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);

建议?

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

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

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

push lr
bl _SavePC
pop pc
要获取堆栈寄存器,使用相应的CMSIS函数:

  • 主堆栈指针(MSP)的
    \uu get\u MSP()
  • 进程堆栈指针(PSP)的
    \uu get\u PSP()

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

      例如:

      文件:custom_header.h 文件:source_c_File.c 文件:user_c_File.c
      在asm代码所在的文件中,是否将函数SavePC定义为extern?@mathematics help seeker I包含SavePC的头文件,其原型定义为extern-
      extern void SavePC(未签名长)。好吗?是的..我正在看装配工的手册。它使用EXTERN。你能不能也检查一下这个而不是导入?@mathematicshelp-seeker我试过了,编译器回来了。。。错误[Og005]:内联程序集中的未知符号:“EXTERN”V:\interrupt\u setup.c 137此页显示了如何编写良好的故障处理程序的示例。您不需要使用内联asm。
      
      #include "custom_header.h"
      
      void someFunction(void)
      {
      .
      .
      .
      
      __asm("    mov     r0, sp\n"
        "    bl      SavePC\n"
        "    bx      lr");
      
      .
      .
      .
      }