从使用 __asm 定义的 ARM 函数调用 C 函数

标签 c arm inline-assembly cortex-m armcc

我无法理解我的编译器。我们使用 Scons 实用程序为 M0+ 处理器编译 ARM 代码(在 Windows 上,如果重要的话。这是一个 ARMCC 编译)我试图在中断期间使用对 this question 的回答来捕获堆栈指针的地址。 .

对于我的编译器,我得到以下信息:Error: #20: identifier "asm" is undefined我能够让它(大部分)编译的唯一方法是使用以下内容:

  void IRQHandler_real( uint32_t *sp )
  {
     // Do some work
  }

  __asm void IRQHandler( void )
  {
     MOV R0,SP
     ADDS R0, #1
     LDR R1, =IRQHandler_real //<<-- This line fails
     BX R1
  }

错误代码是
  Error: A1516E: Bad symbol 'IRQHandler_real', not defined or external

BL IRQHandler_real替换最后两条流水线导致同样的错误。

This answer解释内联汇编非常依赖于编译器,所以我无法找到与我的代码匹配的示例。

我读了 here我需要一个“extern C”调用,但我还没有找到它的详细信息。

我仔细检查了编译后的处理器代码的语法,它看起来与我正在使用的命令相同。我认为在评估程序集时没有定义符号。我只是不知道如何定义和链接符号。

TL:DR,我需要从 ARM 程序集调用 C 函数,但我还没有通过编译器。

最佳答案

如果您的编译器是 C++ 编译器,您将需要像这样使用 extern "C";

extern "C" {
  void IRQHandler_real( uint32_t *sp )
  {
     // Do some work
  }
}

关于从使用 __asm 定义的 ARM 函数调用 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51047492/

相关文章:

子进程在运行 fork() 时接管父进程

c - 从C开始,结构和函数简单程序,返回数据可能错误

linux - ARM 内联汇编 : exit system call with value read from memory

c - GCC 内联汇编错误 : "Operand size mismatch for ' int'"

gcc - 了解基本的内联 NEON 组装

c - 如何在列表中的每个节点之前插入数字(C)?

c - 数组是指向第一个元素的指针,如果是……?

android - 在 Android (ARM) 上比较和交换

Cortex : NVIC,请演示如何通过软件使其电平或边缘检测

gcc - arm-none-eabi-gdb 和 openocd : Malformed response to offset query, qOffsets?