【问题标题】:Calling a C function from ARM function defined with __asm从用 __asm 定义的 ARM 函数调用 C 函数
【发布时间】:2018-12-05 10:43:37
【问题描述】:

我无法理解我的编译器。我们使用 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 说我需要一个“外部 C”调用,但我还没有找到关于它的详细信息。

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

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

【问题讨论】:

  • 尝试在IRQHandler_real的开头添加下划线:_IRQHandler_real
  • 我认为代码也是为了将 SP 传递给被调用函数而不是 PC。
  • Thomas,我尝试了单下划线和双下划线,都以相同的编译失败。
  • Supercat,我更新了问题。谢谢你的收获。
  • 我们所有的代码都是用 C 编写的。我在办公室里四处询问,看起来我们使用的是 ARMCC 5.06,而不是 GCC ARM。我试图避免为如此小的更改创建新文件,但如果没有内联解决方案,我可以将其移动到新文件中。我会尝试将结构加载到中断向量中,然后再检查一下

标签: c arm inline-assembly cortex-m armcc


【解决方案1】:

似乎编译器在评估所有 C 代码之后单独评估 ARM 代码。我通过导入函数来修复它 使用IMPORT 命令。我的最终代码如下所示:

IMPORT IRQHandler_real
PUSH { R4, lr }
MOV R4, SP; The compiler does this from the C code, I'm assuming to avoid a hardware limitation.
MOV R0, R4
BL IRQHandler_real
POP { R4, PC }
ENDP

这适用于 ARMCC 5.6。我认为大多数文档都是针对 GCC ARM (asm("statement");) 的。我仍然收到Warning: #667-D: "asm" function is nonstandard,因此如果存在“更正确”的答案,我将很乐意接受。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 我希望这适用于 VS/C++。不幸的是,它不适用于 ARMCC。
    • @MPStoering 您可能需要用#ifdef __cplusplus 包围它,但它在ARM 网站上记录了here。我认为没有人再使用 armcc,但我也确信这适用于 gcc。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-30
    • 1970-01-01
    相关资源
    最近更新 更多