1. RTOS 与 UART 基础:先把地基打牢
各位同学,咱们这门课叫《RTOS环境UART中断处理与性能调优与调试实战》。第一章,我打算先把两个最核心的概念讲清楚——RTOS 和 UART。你别觉得基础,我做了十几年嵌入式,见过太多问题都出在基础不牢上。
说白了,RTOS 是让单片机“同时”干多件事的调度器,UART 是让设备之间“聊天”的串行协议。这两者一结合,就成了嵌入式系统里最常用的通信模式。嗯,咱们一个一个来拆。
1.1 RTOS 核心概念:任务、调度、同步
RTOS 的全称是 Real-Time Operating System,实时操作系统。它跟 Linux 那种“大家排队等”的通用系统不一样,RTOS 强调的是——在规定时间内必须干完规定的事。
1.1.1 任务(Task)
任务就是一段独立的代码,有自己的栈、优先级和状态。我习惯把任务想象成一个“工人”,每个工人只干自己那摊活。
- 就绪态(Ready):任务准备好了,等 CPU 分配时间片
- 运行态(Running):CPU 正在执行这个任务
- 阻塞态(Blocked):任务在等某个事件(比如 UART 数据到达)
- 挂起态(Suspended):任务被强制暂停
我在项目中遇到过一个问题:一个新手把 UART 接收任务优先级设得太高,结果低优先级的控制任务一直抢不到 CPU,系统直接“死”了。嗯,优先级不是越高越好,得看业务逻辑。
1.1.2 调度(Scheduling)
调度就是 RTOS 决定“下一个该谁干活”。最常见的两种调度策略:
| 调度策略 | 特点 | 适用场景 |
|---|---|---|
| 抢占式调度 | 高优先级任务随时打断低优先级任务 | 实时性要求高的系统 |
| 时间片轮转 | 同优先级任务轮流执行固定时间 | 多个同等重要的任务 |
我个人习惯在 UART 中断处理中用抢占式调度。为什么?因为 UART 数据来了你不立刻处理,缓冲区可能就溢出了。你想想看,串口数据可不会等你。
1.1.3 同步(Synchronization)
任务之间怎么协调?靠信号量(Semaphore)、互斥锁(Mutex)、消息队列(Message Queue)。
- 信号量:通知某个事件发生了(比如“UART 收到一帧数据”)
- 互斥锁:保护共享资源不被同时访问(比如“UART 发送缓冲区”)
- 消息队列:传递数据块(比如“把收到的数据发给处理任务”)
1.2 UART 通信协议与硬件原理
UART,全称 Universal Asynchronous Receiver/Transmitter,通用异步收发器。说白了,就是一根线发数据,一根线收数据,不需要时钟线。
1.2.1 硬件连接
UART 只需要三根线:
- TXD:发送数据
- RXD:接收数据
- GND:共地
注意:两个设备的 TXD 和 RXD 要交叉连接。我记得第一次焊板子时把 TXD 接 TXD,RXD 接 RXD,结果怎么调都不通……后来才发现是交叉线的问题。
1.2.2 数据帧格式
UART 一帧数据长这样:
起始位(1bit) + 数据位(5~8bit) + 校验位(可选) + 停止位(1~2bit)
举个例子,最常用的配置是 8N1:8 位数据、无校验、1 位停止位。
| 参数 | 常见值 | 说明 |
|---|---|---|
| 波特率 | 115200 | 每秒传输的比特数 |
| 数据位 | 8 | 一帧中有效数据的位数 |
| 校验位 | None | 奇校验/偶校验/无校验 |
| 停止位 | 1 | 帧结束标志 |
1.2.3 波特率与时钟
波特率决定了 UART 的通信速度。115200 波特率意味着每秒传输 115200 个比特。算一下:一帧 10 位(1 起始 + 8 数据 + 1 停止),115200 / 10 = 11520 字节/秒。
我曾经在一个项目里把波特率设成了 921600,结果线太长信号衰减,数据全是乱码。嗯,高速通信对硬件布线要求很高,不是想设多快就多快。
1.3 知识体系总览
下面这张图把本章的核心知识点串起来了。你仔细看,RTOS 和 UART 是怎么结合的。
1.4 中断:RTOS 和 UART 的桥梁
UART 中断是连接 RTOS 和 UART 的关键。数据来了,硬件触发中断,中断服务程序(ISR)通知 RTOS 任务去处理。
这里有个原则:ISR 里只做最轻量的事。比如:
- 把收到的数据放到一个环形缓冲区
- 释放一个信号量通知任务
- 立刻退出中断
千万不要在 ISR 里做复杂处理,比如协议解析、数据校验。这些活交给任务去做。
1.5 本章小结
这一章我们讲了:
- RTOS 的三个核心概念:任务、调度、同步
- UART 的硬件连接、数据帧格式、波特率
- 中断在 RTOS 和 UART 之间的桥梁作用
这些是后面所有章节的基础。你把这些搞明白了,后面讲中断处理、性能调优、调试技巧的时候,才不会觉得吃力。嗯,基础打牢了,后面才能跑得快。