目录
[一、裸机开发与 RTOS 开发对比](#一、裸机开发与 RTOS 开发对比)
[二、RTOS 核心概念](#二、RTOS 核心概念)
[1. 任务(线程)](#1. 任务(线程))
[2. 时间片轮转](#2. 时间片轮转)
[3. 任务栈](#3. 任务栈)
[四、RTOS 常见易错理论点](#四、RTOS 常见易错理论点)
[五、RTOS 适用场景与不适用场景](#五、RTOS 适用场景与不适用场景)
[六、RTOS 开发思路](#六、RTOS 开发思路)
前言
前面四篇我们完成单片机裸机开发全部核心内容:硬件基础、片上外设、中断进阶、调试排错。裸机适合逻辑简单项目,当业务变多,同时处理按键、屏幕、传感器、通信等任务,裸机while(1)会出现时序卡顿、逻辑混乱,这时候就需要 RTOS 实时操作系统。
本篇讲解 RTOS 核心基础理论,不涉及具体代码,搞懂概念再上手移植。
一、裸机开发与 RTOS 开发对比
-
裸机开发 程序跑在一个大 while 循环里面,顺序轮询执行各个业务。中断用来处理紧急事件。 优点:简单、资源占用极小,逻辑清晰,适合小型项目。 缺点:任务多之后耦合严重;一个业务延时,所有任务都会被拖慢;很难保证实时响应。
-
RTOS 实时操作系统 把程序拆分成多个独立任务,操作系统内核做任务调度,宏观上多个任务 "同时运行"。 优点:业务解耦,每个任务只负责一件事;高优先级任务可以抢占 CPU,保障实时性;方便维护大型项目。 缺点:占用 RAM、Flash 资源;需要理解调度、同步机制,学习成本更高。
注意:RTOS 不是 Linux,单片机 RTOS 属于小型实时内核,没有完整文件系统、图形界面。主流:FreeRTOS、RT‑Thread。
二、RTOS 核心概念
1. 任务(线程)
任务就是独立的执行单元,每个任务拥有自己的栈空间。 每个任务拥有状态:
- 运行态:当前正在占用 CPU 执行
- 就绪态:条件满足,等待 CPU 调度
- 阻塞态:任务等待延时、信号量,主动让出 CPU,不占用运算资源
- 挂起态:任务暂停,等待其他任务恢复
任务优先级:数字大小代表优先级,高优先级任务可以抢占低优先级任务 CPU 使用权。高优先级任务就绪,内核立刻剥夺低优先级任务 CPU,优先执行高优先级。
2. 时间片轮转
多个相同优先级任务,内核分配时间片,轮流执行,实现宏观并行。
3. 任务栈
每个任务独立栈,保存局部变量、寄存器上下文。栈设置过小会栈溢出,系统直接死机跑飞;设置过大浪费 RAM 内存。单片机 RAM 有限,栈大小是调试高频踩坑点。
三、任务间同步与通信组件
信号量 二值信号量:常用于中断和任务之间传递事件标记,中断只释放信号量,任务里面等待信号量处理业务,避免中断写复杂业务。 计数信号量:资源计数,统计可用资源数量。
互斥锁 用于多个任务访问同一个共享硬件 / 全局变量,防止多个任务同时操作资源引发数据错乱。解决资源竞争问题。 注意:互斥锁有优先级继承机制,缓解优先级反转问题。
消息队列 任务和任务、中断和任务之间传递数据缓冲区。可以存放多组数据,FIFO 先进先出。适合串口、传感器把数据投递给处理任务。
事件组 按位标记多个事件,一个任务可以等待多个不同事件触发。
四、RTOS 常见易错理论点
中断限制 RTOS 的 API 函数不能全部在中断里面随便调用,只有带 FromISR 后缀版本才允许中断内调用。普通任务 API 放到中断会直接系统崩溃。
优先级反转 低优先级任务拿到互斥锁,高优先级任务等待锁;此时一个中优先级任务持续运行,高优先级任务得不到执行。RTOS 内核提供优先级继承缓解该问题。
不要在任务里面使用裸机延时 裸机
HAL_Delay()是阻塞 CPU 延时,RTOS 要使用内核自带延时函数,任务进入阻塞状态,让出 CPU 给其他任务,CPU 利用率提升。栈溢出 现象:系统随机死机,没有固定复现条件。排查手段:开启栈水位统计,查看任务剩余栈空间。
五、RTOS 适用场景与不适用场景
✅适合使用 RTOS:
- 需要同时处理多路业务:屏幕刷新、按键检测、传感器采集、多路通信
- 需要严格实时响应,部分事件必须快速处理
- 项目功能多,希望业务解耦,方便后续迭代维护
❌不建议使用 RTOS:
- 简单点灯、单逻辑小项目,资源紧张的极小单片机
- 追求极致代码效率,RAM 资源极度受限
六、RTOS 开发思路
- 业务拆分:把不同功能拆成独立任务,一个任务尽量只做一类事情。
- 划分优先级:紧急响应任务设置高优先级;周期性显示、日志任务设置低优先级。
- 资源隔离:共享资源使用队列、互斥锁做保护,减少全局变量直接访问。
- 中断轻量化:中断只做标记,数据投递,业务逻辑交给普通任务处理。
