在 FreeRTOS 中,uxSchedulerSuspended
和 xYieldPending
是调度器内部使用的关键状态变量,用于控制任务调度和切换的时机。以下是它们的具体作用和工作原理:
1. uxSchedulerSuspended
(调度器挂起计数器)
作用
-
标记调度器是否被挂起
uxSchedulerSuspended
是一个 无符号整数计数器,用于跟踪调度器的挂起状态:- 值为 0:调度器处于活动状态(正常调度)。
- 值大于 0:调度器被挂起,禁止任务切换。
-
支持嵌套操作
允许多次调用vTaskSuspendAll()
(挂起调度器)和xTaskResumeAll()
(恢复调度器),通过计数器管理嵌套的挂起/恢复操作。
典型应用场景
- 临界区保护
当进入临界区(Critical Section)时,通过taskENTER_CRITICAL()
挂起调度器(uxSchedulerSuspended++
),防止任务切换和并发问题。 - 批量操作优化
在批量处理队列、信号量等资源时挂起调度器,避免频繁切换任务的开销。
工作机制
- 挂起调度器:
调用vTaskSuspendAll()
,增加计数器uxSchedulerSuspended++
。 - 恢复调度器:
调用xTaskResumeAll()
,减少计数器uxSchedulerSuspended--
。若计数器归零且需要