第二章 RTOS基础概念:什么是实时操作系统、任务与调度、内核对象、RTOS选型

好,咱们进入正题。这一章是地基,地基打不牢,后面移植的时候你肯定会踩坑。我当年刚接触RTOS时,觉得不就是个调度器嘛,后来被项目狠狠教育了一回——嗯,咱们慢慢聊。

2.1 什么是实时操作系统

实时操作系统,说白了就是「在规定时间内必须干完活」的系统。你想想看,剃须刀开机后,如果按下按键要等半秒才有反应,用户早就把刀片扔了。

实时性分两种:

  • 硬实时:错过截止时间就是事故。比如安全气囊的触发,晚1毫秒可能出人命。
  • 软实时:偶尔慢一点还能接受。比如剃须刀的UI响应,偶尔卡顿一下问题不大。

我个人习惯把RTOS理解成一个「管家」。它帮你管理多个任务,谁急谁先干,谁闲谁等着。没有RTOS的裸机程序,就像只有一个员工的小作坊——所有活都得排队干。有了RTOS,你就有了一个团队。

核心区别:裸机是超级循环(while(1)),RTOS是任务调度。前者靠轮询,后者靠事件驱动。

2.2 任务与调度

任务,就是RTOS里的「线程」。每个任务都有自己的栈空间、优先级和状态。我在项目中遇到过一个问题:一个任务栈给小了,跑着跑着就栈溢出,系统随机死机。查了三天才找到原因——从此我养成了给栈空间留30%余量的习惯。

任务的状态机其实很简单:

  • 运行态:CPU正在执行这个任务
  • 就绪态:随时可以运行,但CPU被别的任务占着
  • 阻塞态:在等某个事件(比如队列有数据、信号量可用)
  • 挂起态:被强制暂停

调度算法,RTOS最常用的是优先级抢占式调度。什么意思?高优先级的任务一旦就绪,立马抢走CPU。低优先级的任务?乖乖等着吧。

避坑指南:我曾经把一个任务的优先级设得太高,结果它一直占着CPU,低优先级的任务饿死了。后来我学会了用「优先级反转」的概念——嗯,这个后面讲互斥锁时会细说。

2.3 内核对象

内核对象是RTOS提供的「工具」,用来让任务之间通信和同步。常用的有四个:

2.3.1 任务(Task)

任务就是你的业务逻辑。每个任务都是一个无限循环的函数。比如剃须刀里,一个任务负责读取按键,一个任务负责控制电机,一个任务负责显示电量。

// 一个典型的任务函数
void vKeyScanTask(void *pvParameters)
{
    for(;;)
    {
        if(按键按下)
        {
            xQueueSend(xKeyQueue, &keyValue, 0);
        }
        vTaskDelay(10); // 10ms扫描一次
    }
}

2.3.2 队列(Queue)

队列是任务间传递数据的「管道」。一个任务往里写,另一个任务往外读。我习惯用队列来解耦——按键任务只管发消息,UI任务只管处理消息,互不干扰。

注意:队列的深度要算好。我曾经在项目里队列深度设小了,数据丢失,电机乱转。后来我根据最大数据量和处理速度算了一遍,才搞定。

2.3.3 信号量(Semaphore)

信号量用来做同步。比如电机启动前,必须先等电池电压稳定。这时候可以用一个二值信号量:电池任务完成后释放信号量,电机任务等待信号量。

2.3.4 互斥锁(Mutex)

互斥锁是信号量的变种,专门用来保护共享资源。比如两个任务都要修改同一个全局变量,不加锁就会出问题。

互斥锁有个经典问题叫优先级反转:低优先级任务拿着锁,高优先级任务在等锁,中优先级任务趁机抢CPU——结果高优先级任务反而被低优先级任务拖慢了。解决办法是「优先级继承」,大部分RTOS都支持。

内核对象 用途 典型场景
任务 执行独立功能 按键扫描、电机控制
队列 任务间传递数据 按键消息传递
信号量 任务间同步 等待外设就绪
互斥锁 保护共享资源 保护全局变量

2.4 RTOS选型

市面上RTOS很多,我主要用过三个:FreeRTOS、RT-Thread、μC-OS。说说我的感受。

2.4.1 FreeRTOS

最轻量,文档最全。适合资源受限的MCU,比如Cortex-M0。我第一个RTOS项目就是用的它,上手快,坑少。缺点是功能相对简单,没有设备驱动框架。

2.4.2 RT-Thread

国产之光,功能丰富。有设备驱动框架、文件系统、网络协议栈。适合资源稍多的MCU,比如Cortex-M4/M7。我个人觉得它的「线程间通信」设计得比FreeRTOS优雅。不过学习曲线陡一点。

2.4.3 μC-OS

老牌RTOS,代码规范,注释详细。适合教学和工业控制。但商业使用要收费,而且更新速度不如前两个。我记得μC-OS的调度算法是纯优先级抢占,没有时间片轮转——这个要注意。

选型建议

  • 资源紧张、追求稳定 → FreeRTOS
  • 功能丰富、生态好 → RT-Thread
  • 教学或工业控制 → μC-OS

嗯,这一章的内容差不多了。记住一句话:RTOS不是银弹,选对了是利器,选错了是累赘。下一章咱们开始动手移植,我会带着你一步步把FreeRTOS跑在剃须刀的MCU上。