如何解决Mbed编译器编译含__asm和__attribute__的C函数的报错问题
问题原因
报错是Mbed在线编译器默认使用ARMCC编译器,和代码参考的GCC语法不兼容导致,按以下步骤修改即可解决:
1. 替换naked属性写法
ARMCC不支持GCC风格的__attribute__((naked))属性,替换为ARMCC原生的__naked关键字,放在函数返回值前即可消除属性未知警告。
2. 调整内联汇编写法(或改用独立汇编文件)
方案A:适配ARMCC内联汇编语法
将代码拆分为头文件和源文件,避免头文件直接存函数实现引发的重复定义问题,修改后代码如下:
afl_call.h
#include <stdint.h> __naked uint32_t aflCall(uint32_t a0, uint32_t a1, int32_t a2);
afl_call.c
#include "afl_call.h" __naked uint32_t aflCall(uint32_t a0, uint32_t a1, int32_t a2) { /* * QEMU中会拦截0x3F号SVC调用,不会实际执行 * 真实硬件上该指令会被执行,可能导致固件崩溃 * 可以将noHyperCall设为1跳过该调用 */ __asm volatile( "SVC 0x3F\n" "BX LR\n" ); }
方案B:改用独立汇编文件实现(兼容性最高)
如果方案A仍报SVC指令不支持的错误,直接创建单独的汇编文件实现函数,不受C编译器内联汇编语法限制:
afl_call.h(头文件和方案A一致)
#include <stdint.h> uint32_t aflCall(uint32_t a0, uint32_t a1, int32_t a2);
afl_call.s(新增汇编源文件)
AREA |.text|, CODE, READONLY EXPORT aflCall aflCall SVC 0x3F BX LR END
修改说明
- 移除了GCC专属的
__attribute__((unused))参数标记,ARMCC不会对未使用的形参报警告,无需额外标记 - 内联汇编去掉了多余的
\t转义符,ARMCC不需要制表符缩进即可识别汇编指令 - 独立汇编方案完全兼容所有版本的ARMCC编译器,不会出现指令不识别的错误
内容的提问来源于stack exchange,提问作者mmt
相关产品推荐
相关产品推荐

