从Keil µVision切换到Makefile后内置汇编编译报错如何解决
问题原因
你当前使用的是Keil MDK(ARMCC编译器)专属的内嵌汇编语法,而自研Makefile大概率调用的是arm-none-eabi-gcc这类GNU ARM工具链,二者内嵌汇编语法完全不兼容,既不是缺少头文件,也不是缺少编译选项。
两个报错的对应逻辑:
- 第一个报错指向
__asm void vPortSVCHandler( void ):GCC不识别ARMCC的__asm加函数定义的语法,会把__asm当成普通变量名,进而报函数定义格式错误。 - 第二个报错指向
mov r0, #0:由于GCC没有识别到这是内嵌汇编块,会把大括号内的内容当成C代码解析,自然不认识汇编语法里的立即数前缀#,报非法字符错误。
解决方案
- 优先直接替换移植文件:FreeRTOS官方针对GNU工具链提供了对应架构的移植包,你直接找到和你所用芯片内核匹配的GCC版本
port.c、portasm.S文件,替换当前Keil版本的port文件即可,不需要手动修改汇编语法。 - 若需要手动适配语法:可以将该纯汇编函数迁移到单独的
.S汇编文件中,改用GNU汇编器(GAS)语法编写,需要调整的点包括:- 函数声明前加
.global vPortSVCHandler、.thumb_func伪指令 PRESERVE8对应替换为.preserve8伪指令- 其余汇编指令语法基本兼容,直接保留即可
- 函数声明前加
内容的提问来源于stack exchange,提问作者GabrielT
相关产品推荐
相关产品推荐

