一、问题现象
在使用正点原子 STM32 开发板例程时,原子的sys.c
和sys.h
文件中使用了一些内嵌汇编函数。当使用 armcc V6 进行编译的时候会报错,如下图所示:
二、原因分析
内联汇编
首先要明白什么是内联汇编,所谓内联汇编即使用__asm("指令");
这种语法结构的 C 语句。而在 mdk 下,内联汇编仅支持 ARM 汇编语言,不支持 Thumb 或者 Thumb-2 汇编语言,但内嵌汇编器支持 Thumb 和 Thumb-2 汇编指令,STM32 的 core cortex-M3是 Thumb-2指令,所以采用内嵌汇编的方式进行汇编调用。
在 armcc V5 的版本中,如下形式的内嵌汇编函数能够通过编译:
__asm void xxx()
{
nop
BX lr
}
但在 armcc V6 的版本中,需要将形式修改为:
void xxx(xx)
{
__ASM volatile("xxx");
}
三、解决方案
对内联汇编函数进行重新编写:
修改前:
__asm void WFI_SET(void)
{
WFI;
}
修改后:
void WFI_SET(void)
{
__ASM volatile("WFI");
}
如下图所示,修改后的内联函数不再报错且通过编译