一、配置过程
二、基本知识点
2.1 抢占优先级和响应优先级
在 FreeRTOS 中,任务的调度方式主要有 抢占式(Preemptive) 和 协作式(Cooperative) 两种模式,它们的核心区别在于 任务如何释放 CPU 控制权,以及 调度器如何决定任务切换。以下是详细对比:
1.抢占式调度(Preemptive Scheduling)
高优先级任务可立即抢占低优先级任务,无需等待当前任务主动让出 CPU。
依赖配置:需在 FreeRTOSConfig.h中启用:
#define configUSE_PREEMPTION 1 // 启用抢占式调度
#define configUSE_TIME_SLICING 1 // 可选:同优先级任务时间片轮转
工作流程
- 任务就绪:当一个高优先级任务进入就绪状态(如被创建、延迟结束、收到信号量等),调度器会立即检查是否需要切换。
- 抢占发生:如果新就绪的任务优先级高于当前任务,CPU 会立即切换到高优先级任务。
- 无需主动让步:即使当前任务未调用
taskYIELD()或vTaskDelay(),也会被强制打断。
优点
- 实时性强:高优先级任务能快速响应(适合中断服务、紧急事件处理)。
- 自动化调度:开发者无需手动管理任务切换。
缺点
- 资源竞争风险:需注意优先级反转(Priority Inversion)问题(可通过互斥量优先级继承解决)。
- 上下文切换开销:频繁抢占会增加 CPU 负载。
2. 协作式调度(Cooperative Scheduling)
特点
- 任务必须主动释放 CPU,否则会一直运行直到完成。
- 依赖配置:需在 FreeRTOSConfig.h中关闭抢占:
#define configUSE_PREEMPTION 0 // 关闭抢占式调度
工作流程
- 任务运行:当前任务会一直占用 CPU,直到:
- 调用 taskYIELD()主动让出 CPU。
- 调用阻塞 API(如 vTaskDelay(), xQueueReceive())。
- 调度器介入:只有当任务主动放弃 CPU 时,调度器才会选择下一个最高优先级就绪任务运行。
优点
- 确定性高:任务切换完全由代码控制,避免不可预知的抢占。
- 资源竞争少:无需频繁处理共享数据的互斥问题(适合简单系统)。
- 低开销:减少上下文切换次数。
缺点
- 实时性差:高优先级任务可能因低优先级任务不释放 CPU 而无法及时响应。
- 开发者负担:需手动插入 taskYIELD(),否则可能导致低优先级任务“饿死”。
3. 如何选择?
选抢占式:
- 需要快速响应中断或高优先级事件(如传感器数据处理)。
- 系统中有多个不同优先级的任务。
选协作式:
- 资源受限的裸机升级项目(减少调度复杂性)。
- 任务执行时间短且可预测(如串口协议解析)。
2.2 响应优先级和抢占优先级
1. 优先级的基本机制
FreeRTOS 使用 单一的优先级数值(通常为 0到 configMAX_PRIORITIES-1,默认最高优先级为 configMAX_PRIORITIES-1)来管理任务调度。
数值越大,优先级越高(例如优先级 3> 2)。
高优先级任务可抢占(Preempt)低优先级任务,无需等待当前任务主动释放 CPU。
2. 抢占优先级(Preemptive Priority)
定义:高优先级任务立即抢占低优先级任务的 CPU 使用权。
表现:
如果任务 A(优先级 3)就绪,而当前运行的是任务 B(优先级 2),FreeRTOS 会立即切换到任务 A。
这是 FreeRTOS 默认的调度行为(需配置 configUSE_PREEMPTION=1)。
关键点:
抢占是自动的,无需任务主动让步(除非使用 taskYIELD())。确保高优先级任务能实时响应。
3. 响应优先级(Response Priority)
定义:任务在就绪状态下被调度的顺序,完全由优先级决定。
表现:
当多个任务同时就绪时,调度器会选择优先级最高的任务运行(即响应最快)。
例如:任务 A(优先级 3)和任务 B(优先级 2)同时就绪,任务 A 会优先被调度。
关键点:
“响应优先级”是抢占式调度的结果,而非独立配置。
与“抢占优先级”是同一机制的两个视角:
- 抢占:强调中断当前任务的行为。
- 响应:强调任务被选中的顺序。
FreeRTOS 中 “实时性” 的体现是什么: 抢占式:高优

最低0.47元/天 解锁文章
760

被折叠的 条评论
为什么被折叠?



