任务调度代码流程分析

第一阶段:调度触发 (The Trigger)

  1. 系统节拍中断 (Tick Interrupt):检查当前运行任务的时间片是否用完。如果用完,则设置一个标志 xYieldPending = pdTRUE,标记需要调度。

  2. 系统调用 (System Call):任务执行了能改变系统状态的 API,如 vTaskDelay()xQueueSend(),xSemaphoreGive() 等。

第二阶段:调度决策 (The Decision)

3. 查找最高优先级:调度器查看全局变量 uxTopReadyPriority。这个变量始终跟踪着当前所有就绪任务中的最高优先级编号

4. 优先级比较:将 uxTopReadyPriority 与当前正在运行的任务的优先级进行比较。高于当前任务优先级进行抢占、等于当前任务优先级进行同级检查、低于当前任务优先级则继续运行。

第三阶段:任务切换 (The Switch)

根据判断结果进行上下文切换。

下面是对应的代码流程分析

vTaskSwitchContext 完整调用链(分层:触发源 → portYIELD → PendSV 中断 → 汇编调用 C 函数)

核心前置结论

vTaskSwitchContext()绝对不会被任务、SysTick、API 直接调用; 它唯一调用方是PendS