一、前言(为什么必须学 FreeRTOS)
裸机大循环架构 while(1) 存在致命缺陷:
- 某个函数延时过长,会阻塞所有任务;
- 传感器采集、电机控制、蓝牙上报、屏幕显示时序冲突;
- 无法做优先级管理,紧急任务无法及时响应;
- 项目越大逻辑越乱,后期完全无法维护。
FreeRTOS 完美解决以上问题:
- 真正多任务并发,vTaskDelay 非阻塞延时;
- 任务优先级抢占,高优先级优先执行;
- 自带队列、信号量、互斥锁、软件定时器;
- 资源占用极小,STM32F1 完美跑满。
本文采用 标准库原版工程 移植,不使用 HAL 库、不使用CubeMX,纯手动移植,吃透所有底层原理。
二、FreeRTOS移植核心原理(深度解析)
2.1 操作系统靠什么切换任务?
FreeRTOS 任务切换完全依赖两个中断:
- SysTick 定时器中断:系统时钟节拍,提供心跳节拍(1ms)
- PendSV 中断:最低优先级中断,专门做任务上下文切换
裸机没有这一套机制,所以无法多任务切换。
2.2 移植本质(全网最通俗总结)
FreeRTOS 移植只干三件事:
- 添加 FreeRTOS 核心源码到工程。
- 修改 sys_tick、PendSV、SVC 中断函数。
- 配置系统时钟节拍、开启任务调度。
2.3 重点禁忌(90%新手报错根源)
绝对不能再用裸机 SysTick 延时!
裸机 delay_ms() 阻塞抢占系统节拍,直接导致系统崩溃、死机、任务卡死。
RTOS 必须使用 vTaskDelay() 非阻塞延时。
三、完整移植步骤(从零手把手)
3.1 准备工程
基于标准库纯净工程:串口、GPIO、基本延时正常运行。
使用 FreeRTOS V9