任务调度代码流程分析

📅 2026/6/28 18:31:18
任务调度代码流程分析
第一阶段:调度触发 (The Trigger)系统节拍中断 (Tick Interrupt):检查当前运行任务的时间片是否用完。如果用完,则设置一个标志 xYieldPending = pdTRUE,标记需要调度。系统调用 (System Call):任务执行了能改变系统状态的 API,如vTaskDelay(),xQueueSend(),xSemaphoreGive()等。第二阶段:调度决策 (The Decision)3. 查找最高优先级:调度器查看全局变量uxTopReadyPriority。这个变量始终跟踪着当前所有就绪任务中的最高优先级编号。4. 优先级比较:将uxTopReadyPriority与当前正在运行的任务的优先级进行比较。高于当前任务优先级进行抢占、等于当前任务优先级进行同级检查、低于当前任务优先级则继续运行。第三阶段:任务切换 (The Switch)根据判断结果进行上下文切换。下面是对应的代码流程分析vTaskSwitchContext 完整调用链(分层:触发源 → portYIELD → PendSV 中断 → 汇编调用 C 函数)核心前置结论vTaskSwitchContext()绝对不会被任务、SysTick、API 直接调用; 它唯一调用方是PendS