外观
1.4 裸机 vs FreeRTOS
这节要搞懂:不用 RTOS 会遇到什么麻烦,用了之后好在哪。 需要基础:1.3
一、什么是裸机开发
裸机开发(Bare-metal)指的是不使用任何操作系统,程序直接运行在硬件之上。所有的执行顺序、时间安排,全部由开发者自己在代码里编排。
它的典型形态是一个永远转的大循环:
c
int main(void)
{
hardware_init(); // 初始化硬件
while (1) { // 永远不结束的大循环
check_key(); // 检查按键
update_display(); // 更新屏幕
read_temperature(); // 读温度
check_key();
}
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
简单、直接、一眼看懂。功能少的时候完全够用。
二、麻烦从哪来
假设 update_display() 这一步要花 80 毫秒:
时间轴 →
[check_key][──── update_display 耗时 80ms ────][read_temp][check_key]...
↑
这 80 毫秒里你按了按键
程序完全不知道,因为它正忙着刷屏1
2
3
4
5
2
3
4
5
结果:按键反应迟钝,甚至直接丢掉。
你可能会想:那把刷屏拆成 8 小段,每次只刷一点?可以,但代码会变成这样:
c
static int step = 0; // 记录刷到第几步了
if (step == 0) { draw_block_0(); step++; }
else if (step == 1) { draw_block_1(); step++; }
else if (step == 2) { draw_block_2(); step++; }
// ...1
2
3
4
5
6
2
3
4
5
6
每加一个功能,这堆判断就翻一倍。 写到后面自己都不敢改。
三、RTOS 怎么解决
RTOS 允许你把程序拆成几个互不干扰的小程序(叫"任务"):
任务 A:刷屏幕 ── 慢就慢,卡住的只是它自己
任务 B:管按键 ── 平时"睡着",一按键就醒来干活
任务 C:读温度 ── 每 2 秒醒一次1
2
3
2
3
每个任务都可以写自己的 while(1),互相不用管对方。
关键在于**"睡着"这两个字**:
| 裸机 | RTOS | |
|---|---|---|
| 等待的时候 | 傻等,CPU 被白白占着 | 睡过去,CPU 让给别人用 |
| 谁安排顺序 | 你自己写代码排 | 系统自动安排 |
| 加新功能 | 要改动原来的代码 | 新写一个任务就行 |
| 代码好不好读 | 功能一多就乱 | 每个任务各管一摊,清楚 |
四、什么时候不该上 RTOS
别觉得 RTOS 万能。这些情况裸机反而更合适:
- 功能就一件事(比如只是定时闪个灯)
- 内存特别紧张(RTOS 每个任务至少要吃 1KB 以上)
一句话判断
当你开始写"第几步、第几步"那种拆分代码时,就是该上 RTOS 的时候了。
本节要点
- 裸机 = 没有操作系统,一个大循环,所有顺序你自己排
- 裸机的致命伤:一件慢活会拖住所有事
- RTOS 把程序拆成互不干扰的任务,等待时会"睡过去"把 CPU 让出来
- 功能单一、内存极小的场合,裸机反而更合适
动手试试
- 找一个你熟悉的电子产品(微波炉、洗衣机),想想它同时在做几件事。
- 如果让你用裸机写"一边每 500ms 闪灯、一边每 2 秒读一次传感器、还要随时响应网络消息",你会怎么写?体会一下麻烦在哪。