从用 __asm 定义的 ARM 函数调用 C 函数
Calling a C function from ARM function defined with __asm
我无法理解我的编译器。我们使用 Scons 实用程序为 M0+ 处理器编译 ARM 代码(在 Windows 上,如果重要的话。这是一个 ARMCC 编译)我试图在中断期间使用 [= 的答案捕获堆栈指针的地址15=].
对于我的编译器,我得到以下信息: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" 电话,但我还没有找到详细信息。
我仔细检查了编译处理器代码的语法,它看起来与我正在使用的命令相同。我认为在评估程序集时未定义该符号。我只是不知道如何定义和 link 符号。
TL:DR,我需要从 ARM 程序集中调用 C 函数,但我还没有通过编译器。
如果您的编译器是 C++ 编译器,您需要像这样使用 extern "C";
extern "C" {
void IRQHandler_real( uint32_t *sp )
{
// Do some work
}
}
似乎编译器在评估所有 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
,所以我很乐意接受 "more correct" 答案(如果有的话)。
我无法理解我的编译器。我们使用 Scons 实用程序为 M0+ 处理器编译 ARM 代码(在 Windows 上,如果重要的话。这是一个 ARMCC 编译)我试图在中断期间使用 [= 的答案捕获堆栈指针的地址15=].
对于我的编译器,我得到以下信息: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" 电话,但我还没有找到详细信息。
我仔细检查了编译处理器代码的语法,它看起来与我正在使用的命令相同。我认为在评估程序集时未定义该符号。我只是不知道如何定义和 link 符号。
TL:DR,我需要从 ARM 程序集中调用 C 函数,但我还没有通过编译器。
如果您的编译器是 C++ 编译器,您需要像这样使用 extern "C";
extern "C" {
void IRQHandler_real( uint32_t *sp )
{
// Do some work
}
}
似乎编译器在评估所有 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
,所以我很乐意接受 "more correct" 答案(如果有的话)。