FreeRTOS移植

手动移植

非常麻烦,上网查

快速移植

使用STM32CubeMX快速移植,下面主要讲需要注意的地方:

内核版本选择

STM32CubeMX使用的接口并不是原生的FreeRTOS的接口,而是在此基础上进行封装的过后的通用的RTOS的API。具体区别如下:

特点 FreeRTOS原生接口 CMSIS-RTOS接口(V1/V2)
设计者 FreeRTOS作者 ARM公司
可移植性 只能用在FreeRTOS 只要有适配层,可换RTOS
API名称 xTaskCreate, vTaskDelay osThreadNew, osDelay
文档参考 FreeRTOS官方文档 ARM CMSIS-RTOS文档
CubeMX生成 原生接口不生成适配层 CubeMX自动生成适配层代码
生态适配 多数FreeRTOS例程 适合中间件/跨平台通用库

在中间件中可以找到FREERTOS,但是此时有内核版本CMSIS_V1CMSIS_V2

CMSIS_V1:大多数情况下V1就够用了

CMSIS_V2:V2比V1其实就是内核版本更高,功能更多了而已

image-20250630210201988

TimeBase-时基选择

使用FreeRTOS的时候,需要把HAL库的时基(TimeBase Source),切换为除了SysTick以外的任意TIM

image-20250630210008016

为什么需要更换HAL的时基?

裸机开发:HAL库时基默认使用的SysTick(1ms中断计数1次),我们的HAL_Delay就是基于SysTick来延时的

操作系统(FreeRTOS等):OS由于需要处理任务调度时间片轮转延时,也需要占用SysTick作为调度器的时基,并且会使SysTick的中断优先级很低,保证任务调度机制正常工作,不会抢占其他中断服务程序

所以使用操作系统的时候就可能会出现OS和HAL共同使用SysTick的情况,这种情况下由于SysTick优先级很低,在高优先级中断中调用HAL_Delay就会卡死。

推荐做法:使用TIM外设产生HAL心跳,systick产生freertos的心跳,HAL是不依赖于OS API的一套硬件操作接口。

我们修改HAL库的时基为其他TIM,让FreeRTOS默认使用SysTick是最好的选择,HAL库的延时等可以通过TIM实现

配置完成后我们可以看到:

HAL_Init中的HAL_InitTick对时基的配置变成了TIM1,而不是SysTick:

image-20250710225754577

而FreeRTOS中默认使用SysTick作为时基:

image-20250710230014264