裸机与 RTOS 基本认识
学习说明
本文为个人学习 FreeRTOS 过程中的整理笔记,主要用于知识复习与学习交流,并非官方文档。
本系列主要基于 STM32F103C8T6 + Cortex-M3 + FreeRTOS V11.1.0 + Keil ARMCC5 进行学习和实验,不同 FreeRTOS 版本、MCU 或编译环境下,部分 API、配置及底层实现可能存在差异。
文中内容会尽量结合官方源码、实际工程和个人理解进行整理,如有错误或表述不严谨之处,欢迎指出。
一、裸机与 RTOS 基本认识
1. 裸机开发
1.1 示例
while (1)
{
读取按键;
采集 ADC;
刷 OLED;
}
1.2 CPU 执行流程
CPU
↓
LED
↓
ADC
↓
OLED
↓
回到 LED
↓
继续循环
这种方式叫 Super Loop(超级循环),也叫 裸机开发。
2. 裸机开发的问题——实时性差
2.1 示例
while (1)
{
OLED(); // 20ms
ADC(); // 2ms
CAN(); // 1ms
Flash(); // 50ms
}
一次循环耗时:
20 + 2 + 1 + 50 = 73ms如果按键在第 5ms 按下,CPU 也需要等到这一轮循环结束、再次执行到按键检测代码时才能检测到。
2.2 项目复杂后存在的问题
如果后续项目升级,任务越来越多,while(1) 循环内的函数也会越来越多。
这样会导致:
- 程序越来越难维护;
- 实时性变差;
- 不可能把每个任务都放进中断;
- 不仅工程量大,而且硬件中断资源也有限。
3. RTOS
3.1 Scheduler(调度器)
调度器是 FreeRTOS 的核心组成部分之一。
裸机开发时,CPU 的运行逻辑通常是:
干完 A
↓
干 B
↓
干 C
↓
干 D
CPU 不会主动判断哪个任务更重要,只会按照程序设计好的顺序执行。
例如在车载场景中,如果某个重要任务需要立即处理,而 CPU 此时正在执行其他耗时任务,就可能导致响应延迟。
所以 FreeRTOS 中引入了:
Scheduler(调度器)
Scheduler 的作用是:
决定 CPU 当前应该执行哪个任务。
FreeRTOS 中可以理解为:
调度器
│
┌─────────────┼─────────────┐
│ │ │
Task1 Task2 Task3
│ │ │
ADC OLED CAN
CPU 执行哪个任务,由调度器根据任务状态、优先级等条件进行安排。
3.2 Task(任务)
Task 可以先简单理解为:
CPU 需要完成的一项独立工作。
例如:
Task1 → ADC
Task2 → OLED
Task3 → CAN
关于 Task 的具体结构和运行机制,后续再详细学习。
4. 高频问题
4.1 为什么裸机实时性不好?
因为裸机通常采用 Super Loop 方式,CPU 按顺序执行各个功能。
一个任务执行时间过长或者发生阻塞时,会影响后续任务,因此系统响应时间可能变长,实时性较差。
4.2 为什么裸机程序通常采用 while(1) 超级循环?它有哪些优点和缺点?
裸机程序通常采用 Super Loop 结构,通过
while(1)保证程序持续运行。CPU 依次执行各个功能模块,由于没有操作系统调度器,因此各功能主要按照程序设计好的顺序执行。
优点是结构简单、资源占用少、容易理解;
缺点是复杂项目中实时性较差,任务之间不能灵活调度,一个耗时任务可能阻塞后续任务。
4.3 调度器的职责是什么?
调度器负责管理可运行任务,根据调度算法,例如任务优先级、时间片等,决定 CPU 下一时刻执行哪个任务。
当发生任务切换时,系统需要保存当前任务的运行现场,并恢复下一个任务的运行现场。
4.4 为什么 Task 不是普通函数?
普通函数通常属于正常的函数调用流程。
Task 拥有自己的独立栈、任务状态以及可以保存和恢复的 CPU 上下文,并且可以被 FreeRTOS 调度、阻塞、恢复和切换,因此不能简单等同于普通函数。
4.5 FreeRTOS 为什么看起来能够同时运行多个任务?
因为调度器按照一定策略快速切换 CPU 当前执行的任务。
每次任务切换时,系统会保存当前任务的运行现场,再恢复另一个任务的运行现场。
由于切换速度很快,所以从整体上看起来像多个任务同时运行。
但是对于单核 STM32 来说,同一时刻实际上只有一个任务正在执行。
4.6 FreeRTOS 是不是让 CPU 真正同时运行多个任务?
不是。
单核 STM32 在任意时刻只能执行 一个任务。
FreeRTOS 通过快速任务切换,让多个任务在一段时间内交替运行。
这种方式叫:
并发(Concurrency)
而不是:
并行(Parallelism)
真正的并行通常需要多个 CPU 核心同时执行不同任务。
更多推荐



所有评论(0)