一、问题背景

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 开发中踩过类似的坑,也欢迎交流讨论。

愿这篇内容对你有所帮助,也感谢每一份认可与鼓励。公众号「单片机那点事」

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐