STM32CubeMX 生成 Keil5 FreeRTOS 工程,AC6编译报错 解决方案
嵌入式开发中,很多问题并没有所谓“标准答案”。工程稳定、可维护、可复现,才是最重要的。如果你在 STM32 或 FreeRTOS 开发中踩过类似的坑,也欢迎交流讨论。公众号「单片机那点事」
一、问题背景
CubeMX 默认生成的 Keil 5 FreeRTOS 工程,在使用:
Keil AC6(ARMCLANG)


编译时,经常会出现类似错误:

__asm 语法错误
PRESERVE8 未定义
traceISR_ENTER 未定义
二、问题本质
FreeRTOS 为不同编译器准备了不同移植层(portable)。
目录大致如下:
portable
├─ GCC
├─ RVDS
其中:
|
目录 |
对应编译器 |
|---|---|
|
GCC |
GCC / ARMCLANG / AC6 |
|
RVDS |
Keil AC5 |
而 CubeMX 生成 Keil 5 工程时:
仍然默认使用 RVDS 版本
三、为什么 AC6 会报错
AC6 使用的是:
ARMCLANG
它不再兼容:
RVDS 汇编语法
因此会导致:
-
port.c 编译失败
-
汇编函数无法识别
四、一个简单直接的解决方法
核心思路:
直接替换 CubeMX 中的固件,用 GCC 端口替换 RVDS 端口,这样后续生成的代码也不会报错了。
0.先备份下 RVDS 目录
选中 RVDS 目录 ,Ctrl + C,Ctrl + V生成副本。

1.删除 RVDS 目录下原文件

复制到文件管理器的地址栏回车
进入:
Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS

删除:
ARM_CM4F 文件夹,这里根据芯片来,
我使用的是STM32F407,所以选择 ARM_CM4F ,具体看下面的对照表。
不同 Cortex-M型号 → 必须对应移植层
|
目录名 |
CPU内核 |
FPU |
MPU |
常见 STM32 示例 |
|---|---|---|---|---|
|
ARM_CM0 |
Cortex-M0/M0+ |
❌ |
❌ |
STM32F0、STM32G0、STM32L0 |
|
ARM_CM3 |
Cortex-M3 |
❌ |
❌ |
STM32F1 |
|
ARM_CM3_MPU |
Cortex-M3 |
❌ |
✅ |
(STM32 基本不用 MPU 版本) |
|
ARM_CM4 |
Cortex-M4(无FPU) |
❌ |
❌ |
少见(部分早期M4型号) |
|
ARM_CM4F |
Cortex-M4(带FPU) |
✅ |
❌ |
STM32F3(部分)、STM32F4、STM32G4、STM32L4 |
|
ARM_CM4_MPU |
Cortex-M4 |
❌ |
✅ |
STM32F4(带MPU型号) |
|
ARM_CM7 |
Cortex-M7(无FPU) |
❌ |
❌ |
少见 |
|
ARM_CM7_MPU |
Cortex-M7 |
❌ |
✅ |
STM32F7、STM32H7(安全应用) |
|
ARM_CM23 |
Cortex-M23 |
❌ |
TrustZone |
STM32L5(安全域使用) |
|
ARM_CM23_NTZ |
Cortex-M23 |
❌ |
❌ |
STM32L5(关闭 TrustZone) |
|
ARM_CM33 |
Cortex-M33 |
可选 |
TrustZone |
STM32U5、STM32WB(安全模式) |
|
ARM_CM33_NTZ |
Cortex-M33 |
可选 |
❌ |
STM32U5、STM32WB(普通模式) |
2.复制 GCC 版本端口
进入目录:
Middlewares\Third_Party\FreeRTOS\Source\portable\GCC\

复制:
ARM_CM4F 文件夹
粘贴到:
Middlewares\Third_Party\FreeRTOS\Source\portable\RVDS\
3.重新生成 CubeMX 工程
保持 FreeRTOS 配置不变:
直接 Generate Code
4.切换 Keil 编译器
选择:
ARM Compiler 6
重新编译。

编译通过 ✔
结语
嵌入式开发中,很多问题并没有所谓“标准答案”。
工程稳定、可维护、可复现,才是最重要的。
如果你在 STM32 或 FreeRTOS 开发中踩过类似的坑,也欢迎交流讨论。
愿这篇内容对你有所帮助,也感谢每一份认可与鼓励。公众号「单片机那点事」
更多推荐



所有评论(0)