You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 06:24:08