空闲任务与阻塞延时

← FreeRTOS内核实现与应用开发实战指南知识地图 | ← 主页


SysTick 硬件中断作为时基

空闲任务

没有就绪任务可运行时进入空闲任务。

  1. 调用 vPortFree()回收已经结束的任务的栈和TCB的空间
  2. 执行 ARM 汇编指令 __WFI()(Wait For Interrupt),CPU 核心立刻暂停时钟等待中断
  3. 如果开了 configUSE_TICKLESS_IDLE == 1那就是开低功耗定时器去睡眠唤醒
  4. 如果开了 configUSE_IDLE_HOOK == 1,执行钩子函数,去喂狗和算CPU负载

阻塞延时

任务调用延时接口时,记录唤醒时刻,将任务从就绪链表移入延时/阻塞链表,并设置悬起标志位。任务主动让出 CPU 后,由其他就绪任务运行。

SysTick 每次将时间xTickCount加 1;当当前时间达到任务唤醒时刻时,移出阻塞链表、清除悬起标志位并重新置为就绪,随后由调度器决定是否切换。