vault backup: 2026-06-10 11:17:10

This commit is contained in:
2026-06-10 11:17:10 +08:00
parent 89e183aaaa
commit 788576ec4b
15 changed files with 3124 additions and 0 deletions
@@ -0,0 +1,216 @@
---
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|试题册索引]]