--- tags: [嵌入式系统, 复习, RTOS, uC/OS-II] create time: 2026-06-10 11:11 --- # 嵌入式操作系统 ## 概述 本文档讲解嵌入式操作系统的核心概念,重点覆盖RTOS调度策略、uC/OS-II的特性与API、任务管理机制,以及嵌入式Linux和WinCE的对比。RTOS是嵌入式系统考试中与ARM架构并列的重点。 ## 正文 ### 1. 嵌入式操作系统概述 嵌入式操作系统是运行在嵌入式硬件上的系统软件,负责管理硬件资源、提供任务调度和服务接口。与通用操作系统相比,它更注重**实时性**、**可裁剪性**和**可靠性**。 嵌入式操作系统的分类: | 分类 | 特点 | 典型代表 | |------|------|----------| | 嵌入式RTOS | 严格实时,微内核,可裁剪 | FreeRTOS, uC/OS-II, RT-Thread | | 嵌入式Linux | 功能丰富,开源,非严格实时 | Android, OpenWrt, Yocto | | 商用嵌入式OS | 商业授权,完整生态 | WinCE, VxWorks, QNX | ### 2. 抢占式 vs 协作式调度 这是RTOS最核心的概念之一: **抢占式调度(Preemptive)**: - 高优先级任务**立即**获得CPU控制权 - 无论当前任务在做什么,都会被中断 - **实时性好**,响应时间可预测 - uC/OS-II、FreeRTOS均采用此方式 **协作式调度(Cooperative)**: - 任务必须**主动**放弃CPU(调用yield或等待事件) - 实现简单,但一个任务卡死会影响整个系统 - 早期Windows 3.1、部分简单RTOS使用 ```mermaid graph TD subgraph preemptive["Preemptive Scheduling"] direction TB PA1["Task A running"] --> |"Higher priority Task B becomes ready"| PB1["Task B preempts A"] PB1 --> |"Task B finishes"| PA2["Task A resumes"] end subgraph cooperative["Cooperative Scheduling"] direction TB CA1["Task A running"] --> |"Task A calls yield or blocks"| CB1["Task B runs"] CB1 --> |"Task B yields"| CA2["Task A resumes"] end style PA1 fill:#90caf9 style PB1 fill:#ef9a9a style PA2 fill:#90caf9 style CA1 fill:#a5d6a7 style CB1 fill:#ffcc80 style CA2 fill:#a5d6a7 ``` > [!question] 为什么嵌入式系统通常选择抢占式调度? > 嵌入式系统经常需要处理紧急事件(如传感器报警、安全检测),如果采用协作式调度,低优先级任务长时间不让出CPU会导致高优先级任务无法及时响应,可能造成安全事故。 ### 3. RTOS实时性指标 衡量一个RTOS的实时性,主要看两个指标: 1. **调度器执行时间**:调度算法本身运行所需的时间。越短越好。 2. **任务切换时间**:从一个任务切换到另一个任务所需的时间(保存上下文 + 恢复上下文 + 刷新流水线)。 > [!tip] 最坏情况下的响应时间 > 对于硬实时系统,关注的是**最坏情况**下的响应时间,而不是平均响应时间。最坏响应时间 = 最长中断屏蔽时间 + 最高优先级任务执行时间。 ### 4. uC/OS-II概述 uC/OS-II是一个经典的**抢占式实时内核**,主要特点: - **抢占式**基于优先级的调度 - **可裁剪**:通过条件编译去掉不需要的功能 - **可移植**:支持多种处理器架构 - **确定性**:服务时间可预测 - **商业软件**:非开源,需要购买授权 - **支持64个任务**(优先级0-63,0最高,63最低) > [!warning] uC/OS-II不是免费的 > uC/OS-II是商业软件,与FreeRTOS(免费开源)不同。学习和评估可以使用,但商业应用需要购买许可证。 ### 5. 任务管理API uC/OS-II提供了完善的任务管理接口: #### 创建与删除 ```c // 创建任务 INT8U OSTaskCreate( void (*task)(void *), // 任务函数指针 void *pdata, // 传递给任务的参数 OS_STK *ptos, // 任务栈顶指针 INT8U prio // 任务优先级 ); // 删除任务 INT8U OSTaskDel(INT8U prio); // 删除指定优先级的任务 INT8U OSTaskDelReq(INT8U prio); // 请求其他任务删除自己 ``` #### 挂起与恢复 ```c // 挂起任务(暂停执行) INT8U OSTaskSuspend(INT8U prio); // 恢复被挂起的任务 INT8U OSTaskResume(INT8U prio); ``` #### 延时 ```c // 延时指定时钟节拍数 void OSTimeDly(INT32U ticks); // 精确延时(时、分、秒) void OSTimeDlyHMSM(INT8U hours, INT8U minutes, INT8U seconds, INT16U ms); ``` #### 优先级修改 ```c // 动态修改任务优先级 INT8U OSTaskChangePrio(INT8U oldprio, INT8U newprio); ``` ### 6. 任务状态 uC/OS-II中任务有5种状态: ```mermaid stateDiagram-v2 [*] --> Dormant: Task Created Dormant --> Ready: OSTaskCreate Ready --> Running: Scheduler Dispatch Running --> Ready: Preempted by higher priority Running --> Waiting: OSTimeDly or Event Wait Waiting --> Ready: Delay expires or Event occurs Running --> Suspended: OSTaskSuspend Suspended --> Ready: OSTaskResume Running --> Dormant: OSTaskDel Dormant --> [*]: Deleted ``` | 状态 | 说明 | 进入条件 | |------|------|----------| | **Dormant**(休眠) | 任务代码存在内存中但未被调度器管理 | OSTaskDel后 | | **Ready**(就绪) | 任务准备好运行,等待CPU | 创建后、事件到达后 | | **Running**(运行) | 任务正在使用CPU执行 | 被调度器选中 | | **Waiting**(等待) | 任务等待某个事件(延时、信号量等) | 调用延时或等待函数 | | **Suspended**(挂起) | 任务被显式挂起,不再参与调度 | 调用OSTaskSuspend | > [!question] Ready和Waiting有什么区别? > Ready状态的任务随时可以运行,只等调度器分配CPU;Waiting状态的任务即使给它CPU也无法运行,因为它在等待某个外部事件(如延时到期、信号量释放等)。 ### 7. 任务优先级分配原则 - **每个任务必须有唯一的优先级**(uC/OS-II中不允许同优先级任务) - **数值越小,优先级越高**(0最高,63最低) - **关键任务分配高优先级**:如安全检测、紧急控制 - **不同优先级之间可以抢占** - **相同优先级的处理**:在uC/OS-II中不支持,但在FreeRTOS中支持时间片轮转 分配策略示例: | 任务 | 优先级 | 理由 | |------|--------|------| | 安全监控 | 0-2 | 最高优先级,必须立即响应 | | 电机控制 | 3-5 | 实时性要求高 | | 传感器采集 | 6-10 | 周期性任务 | | 通信处理 | 11-15 | 重要但允许一定延迟 | | UI显示 | 20-30 | 实时性要求低 | ### 8. 嵌入式Linux 嵌入式Linux基于标准Linux内核进行裁剪和定制: - **开源免费**:遵循GPL协议 - **功能丰富**:网络协议栈、文件系统、设备驱动完善 - **非严格意义上的RTOS**:Linux本身不是实时内核,但通过PREEMPT_RT补丁可以实现软实时 - **适合场景**:需要复杂网络功能、多媒体处理的嵌入式设备 与RTOS的对比: | 比较维度 | 嵌入式Linux | RTOS (uC/OS-II) | |----------|-------------|------------------| | 实时性 | 软实时(非严格) | 硬实时 | | 内核大小 | MB级 | KB级 | | 开源 | 是 | 否(商业) | | 功能 | 丰富 | 精简 | | 适用场景 | 复杂嵌入式设备 | 资源受限的实时系统 | ### 9. WinCE Windows CE(简称WinCE)是微软推出的嵌入式操作系统: - **非开源**,商业授权 - 提供完整的GUI和开发工具(Visual Studio集成) - 适合需要Windows风格界面的手持设备 - 已逐渐被Windows IoT Core取代 > [!question] 在资源极度受限的MCU(如Cortex-M0, 2KB RAM)上,应该选择什么OS? > 这种情况下应该选择轻量级RTOS如FreeRTOS或直接裸机编程。嵌入式Linux至少需要几MB内存,uC/OS-II虽然裁剪后很小但也需要几十KB,而FreeRTOS最小仅需几百字节RAM。 ## 关联笔记 - [[嵌入式系统/试题册/index|试题册索引]]