3

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

对于我的编译器,我得到以下信息: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为相同的错误。

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

我在这里读到我需要一个“extern C”调用,但我还没有找到关于它的详细信息。

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

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

4

2 回答 2

2

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

extern "C" {
  void IRQHandler_real( uint32_t *sp )
  {
     // Do some work
  }
}
于 2018-06-26T16:51:47.800 回答
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,所以如果存在一个“更正确”的答案,我会很乐意接受。

于 2018-06-26T21:52:06.060 回答