【发布时间】: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