1.直接用stm32cubemx 生成程序时出现的bug

(1) 为什么会报这个错?

原因分析: 编译器在编译 freertos_os2.h 文件的第 31 行时卡住了,报错提示 error: #13: expected a file name(需要一个文件名)。

罪魁祸首: 紧接着报错信息的下一行显示了出问题的代码是 #include CMSIS_device_header。

底层逻辑: 在 C 语言里,#include 后面必须跟着带双引号 "" 或尖括号 <> 的文件名。CMSIS_device_header 本质上应该是一个宏定义,它在编译时应该自动被替换成具体的芯片头文件(例如 "stm32f1xx.h")。但是,CubeMX 生成代码时“忘了”在工程里定义这个宏!导致编译器傻乎乎地直接去寻找一个名叫 CMSIS_device_header 的文件,自然就找不到了。

解决方法:

在 Keil 左侧的工程目录树中,点开 Application/User/Core 这个文件夹,在里面找到并双击打开 FreeRTOSConfig.h 文件。

添加宏定义代码: 在这个文件的开头部分,找到系统为你预留的注释块。

在 /* USER CODE BEGIN Includes */ 和 /* USER CODE END Includes */ 之间,

敲入代码:#define CMSIS_device_header "stm32f1xx.h"

2.#error directive: "Definition INCLUDE_xTaskGetCurrentTaskHandle must equal 1..."。

原因: 你之前选择了使用较新的 CMSIS_V2 接口。这个 V2 版本的接口在底层需要调用 FreeRTOS 的一个特定函数(用来获取当前任务的句柄)。但是,CubeMX 在生成配置文件时,默认把这个功能**关闭(设为 0)**了,导致两边不匹配,编译器只能报错罢工。

解决方法:直接在 stm32cubemx 中修改,打开获取当前句柄的函数

1. 左侧点击 Middleware -> FREERTOS。

2.在中间偏下的配置框里,点击 Include parameters 这个标签页。

3.找到 vTaskGetCurrentTaskHandle (或者叫 xTaskGetCurrentTaskHandle)。

4.把它的状态从 Disabled 改成 Enabled。

5.重新点击右上角的 GENERATE CODE。

3.两个systick_Handler 函数起冲突

根本原因:你选择了高级的 CMSIS_V2 接口,ST 官方的 cmsis_os2.c 文件里已经极其贴心地帮你写好了一个 SysTick_Handler 函数来给系统提供心跳。

但是!CubeMX 的代码生成器有点“蠢”,它在生成 FreeRTOSConfig.h 时,忘了把默认的宏替换给删掉。导致 FreeRTOS 的 port.c 文件也强制生成了一个 SysTick_Handler。俗话说“一山不容二虎”,链接器只能报错罢工。

解决方法:注释掉一个systick_Handler

1.保持 FreeRTOSConfig.h 文件打开。

2.一直往下拉,拉到文件的最底部(大约在 140 行左右)。

3.你会看到类似下面这三行负责“中断重定向”的宏定义:

#define vPortSVCHandler    SVC_Handler

#define xPortPendSVHandler PendSV_Handler

#define xPortSysTickHandler SysTick_Handler

4.找到 xPortSysTickHandler 这一行,在它最前面加上 //,把它注释掉。

Logo

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。

更多推荐