1. RTOS 与 UART 基础:先把地基打牢

各位同学,咱们这门课叫《RTOS环境UART中断处理与性能调优与调试实战》。第一章,我打算先把两个最核心的概念讲清楚——RTOS 和 UART。你别觉得基础,我做了十几年嵌入式,见过太多问题都出在基础不牢上。

说白了,RTOS 是让单片机“同时”干多件事的调度器,UART 是让设备之间“聊天”的串行协议。这两者一结合,就成了嵌入式系统里最常用的通信模式。嗯,咱们一个一个来拆。

1.1 RTOS 核心概念:任务、调度、同步

RTOS 的全称是 Real-Time Operating System,实时操作系统。它跟 Linux 那种“大家排队等”的通用系统不一样,RTOS 强调的是——在规定时间内必须干完规定的事。

核心三要素: 任务(Task)、调度(Scheduling)、同步(Synchronization)

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 发送缓冲区”)
  • 消息队列:传递数据块(比如“把收到的数据发给处理任务”)
我的经验: 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 是怎么结合的。

RTOS与UART基础知识体系 RTOS + UART 基础体系 RTOS 核心 任务 (Task) 就绪 / 运行 / 阻塞 / 挂起 调度 (Scheduling) 抢占式 / 时间片轮转 同步 (Synchronization) 信号量 / 互斥锁 / 消息队列 UART 通信 硬件连接 TXD / RXD / GND 交叉 数据帧格式 起始位 + 数据位 + 校验 + 停止 波特率与时钟 115200 / 921600 等 RTOS 负责调度,UART 负责通信,两者通过中断和同步机制结合

1.4 中断:RTOS 和 UART 的桥梁

UART 中断是连接 RTOS 和 UART 的关键。数据来了,硬件触发中断,中断服务程序(ISR)通知 RTOS 任务去处理。

这里有个原则:ISR 里只做最轻量的事。比如:

  1. 把收到的数据放到一个环形缓冲区
  2. 释放一个信号量通知任务
  3. 立刻退出中断

千万不要在 ISR 里做复杂处理,比如协议解析、数据校验。这些活交给任务去做。

避坑指南: 我曾经在一个项目里把 UART 接收中断优先级设得比系统心跳还高,结果系统调度直接乱套。中断优先级一定要低于 RTOS 的 tick 中断,否则系统时间片会跑偏。

1.5 本章小结

这一章我们讲了:

  • RTOS 的三个核心概念:任务、调度、同步
  • UART 的硬件连接、数据帧格式、波特率
  • 中断在 RTOS 和 UART 之间的桥梁作用

这些是后面所有章节的基础。你把这些搞明白了,后面讲中断处理、性能调优、调试技巧的时候,才不会觉得吃力。嗯,基础打牢了,后面才能跑得快。