外观
为什么嵌入式开发中要使用RTOS
大家好,我是李述铜,一名专注于嵌入式系统与底层开发的工程师,我的主要工作是制作课程带大家从零手写操作系统、TCP/IP协议栈、文件系统等核心系统,从实现的视角理解计算机底层原理。
以下是本文配套的视频,欢迎观看。
为什么有些项目裸机能跑,但换成 RTOS 就更“爽”?
每次和我的课程学生聊到RTOS时,总会有人会提出这样的问题:
“我做单片机开发这么多年,从来没用过RTOS,不照样把项目做得挺好的吗?”
确实是这样的,其实很多项目可以不用RTOS。比如,我最近在做的一个小工具,用祼机就能够完全搞定,不需要跑任何RTOS。
不过,问题在于:当项目越来越复杂之后,如果再用祼机代码去写,会发现开发难度会直线上升!
此时,如果还一味的坚持去跑祼机,则会费时、费力且不划算。
那么,使用RTOS会给我们带来哪些处呢?下面,我将通过一个示例来说明。
裸机的隐藏痛点
假设现在要做一个设备,需要完成三项工作:
- 读取传感器
- 刷新屏幕
- 处理网络通信
如果用裸机写,代码大概可以这样写:
while (1) {
read_sensor();
lcd_refresh();
network_process(); // 可能阻塞
}也就是说,整个程序的执行流程如下:
读取一下传感器 → 刷新一下屏幕 → 处理一下网络 → 再循环。
乍一看,这个流程没问题,但真正跑起来的时候我们会发现:
只要 网络稍微卡一下,整个系统的节奏都会被拖慢,比如:
- 传感器采集变得不实时
- 屏幕刷新跟着卡顿
为什么会出现这样的问题?主要原因在于:这些工作全部堵在同一个while(1)循环里,只要一项工作变慢,其它工作也跟着变慢。
这就像三辆车走同一条路,只要其中一辆堵住,后面全堵。
换成RTOS,系统立刻变得不一样
如果使用RTOS;那么,我们可以将三个功能拆成三个独立任务,比如:
- 传感器任务
- 屏幕刷新任务
- 网络通信任务
在任务创建起来后,RTOS的调度器会让它们各跑各的:
即便网络出现卡顿,也只影响网络任务本身。传感器采集仍然实时进行。屏幕刷新也不会受网络卡顿影响。
这就是为什么换成RTOS后,系统会突然变得流畅、省心、扩展性好。
RTOS的其它关键优势
除了支持“多任务独立运行”外,RTOS还有几个裸机比不了的点:
代码结构更清晰
RTOS可以为每个功能单独创建一个任务,而不用把所有逻辑堆成一大坨while(1)。
你甚至可以让不同的人开发不同任务,互不干扰。
扩展性强
当项目一旦增大规模,用裸机会变得越来越混乱,开发起来也越来越有难度。使用RTOS可以方便我们新增逻辑、支持新的业务流程,只需要“加一个任务”就完事。
能保证实时性
最重要的一点便是,RTOS可以为关键任务设成高优先级。比如,我们可以将传感器采样任务设置成高优先级。这样一来,即使网络通信出现卡顿、LCD屏幕刷新速率较慢,也不会影响传感器采样的实时性。
总结
综上所述,在大多数情况下,用祼机足够完全成开发工作。但是,当系统功能增多、逻辑变得复杂,裸机就会显得不够用。此时,用 RTOS才是更稳定、更工程化的选择。
延伸阅读
- 作为嵌入式开发者,有必要手写一个RTOS吗
- 别再只用malloc了!嵌入式C的栈上动态数组分配:变长数组
- 告别固定大小:利用C语言伸缩型数组,实现动态结构体
- C结构体的初始化你还在按顺序写?试试这个C99神操作!
如果你想系统学 RTOS
我专门做了一个RTOS体系课,用工程师能听懂的方式:
- 手把手带你写任务调度器
- 全流程讲解任务、优先级、时间片
- 教你如何写实际的工程 RTOS 代码
- 课程内容不难、不玄学、不跳步骤
如果你想从“会用”变成“真的理解”,可以看看:
作者介绍
李述铜,嵌入式系统与底层架构领域讲师,专注于操作系统、CPU 架构的教学与研究。 出版作品《从0手写x86计算机操作系统》。主讲课程包括:《从0手写嵌入式操作系统》《从0手写TCP/IP协议栈》等。
欢迎关注我的微信公众号【李述铜的嵌入式内功修炼】,以便及时获取我的更多文章!-> lishutong1024.cn
