RTOS 入门
什么是 RTOS
RTOS(Real-Time Operating System,实时操作系统)是一类面向嵌入式场景的操作系统,核心职责是:在确定的时间内,让该运行的任务运行起来。它通过任务调度、时间管理、同步与通信机制,把"多件事同时发生"的组织工作交给内核,而不是散落在应用代码里。
为什么需要 RTOS
裸机程序通常是一个大循环:
c
while (1) {
handle_sensor(); // 可能要等很久
handle_uart();
handle_display();
}问题在于:任何一个函数耗时过长,其它任务都会被拖累,响应时间不可控。RTOS 把功能拆成一个个任务,由调度器按优先级决定谁先运行,让高优先级事件(比如通信、报警)能及时响应,也让代码按"并发的多个任务"组织,更容易维护。
核心概念
任务
任务是 RTOS 中最基本的执行单元,本质是一段"永不返回"的函数,配合独立的栈。Yuan RTOS 中任务会处于以下状态:
| 状态 | 含义 |
|---|---|
| 就绪 | 可以运行,等待调度 |
| 运行 | 正在占用 CPU |
| 阻塞 | 等待延时或 IPC 事件 |
| 挂起 | 被主动暂停 |
| 终止/删除 | 已结束或不再被管理 |
调度
调度器决定"下一个运行谁":
- 优先级抢占:高优先级任务就绪后,立即打断低优先级任务。Yuan RTOS 有 32 级优先级,数值越小优先级越高。
- 时间片轮转:同优先级任务轮流运行,每个任务运行固定长度的时间片(默认 10 个 tick)。
Tick 与时间管理
系统 tick 是内核的"心跳",由定时器中断周期性产生(Yuan RTOS 默认 1000Hz)。tick 驱动延时、超时、软件定时器:
yr_task_delay()/yr_task_sleep_until():相对/周期延时- 软件定时器:内核维护的超时回调机制
上下文切换
CPU 同一时刻只能运行一个任务,切换任务时需要保存当前任务的寄存器现场、恢复下一个任务的现场,这就是上下文切换,通常由汇编实现,是移植层(Yuan RTOS 的 portable.h)的核心工作。
同步与通信
多个任务需要协作,常用机制:
| 机制 | 用途 |
|---|---|
| 信号量 | 资源计数 / 事件通知 |
| 互斥锁 | 保护共享资源(Yuan RTOS 支持递归与优先级继承) |
| 消息队列 | 任务间传递数据 |
临界区与中断
访问共享数据的代码段叫临界区,通常通过关中断保护。中断里也能安全地使用部分 API(Yuan RTOS 提供 *_isr 系列),用于唤醒任务。
内存管理
RTOS 内存模型分两类:
- 动态分配:内核运行时从堆中分配任务栈/对象(FreeRTOS 的部分方案)
- 静态分配:所有对象由用户预先定义(Yuan RTOS 采用),资源占用完全可预测,无碎片
RTOS 的代价
- 额外资源:每个任务需要独立栈;内核本身占用 RAM/ROM(Yuan RTOS 约 640B RAM / 2.5KB ROM)
- 切换开销:上下文切换需要时间,但通常只有几微秒
- 调试复杂度:并发问题(竞态、死锁、优先级反转)比裸机更难排查
什么项目适合 RTOS
- 多个周期性/事件驱动任务并存
- 对响应时间有确定性要求
- 功能模块多、需要清晰隔离
下一步:在 Yuan RTOS 教程 中,看看这些概念在真实内核里是怎么实现的。