Skip to main content
每个内核使用专用的空闲计数器跟踪其空闲时长。该计数器在每个 FreeRTOS 滴答时递增。当计数器超过 30,000 个滴答时,该内核即具备进入睡眠的条件。 睡眠条件检查在 FreeRTOS 空闲钩子中执行:
  • 主空闲钩子在主内核的空闲任务上运行。
  • 被动空闲钩子在没有可执行任务时于从内核上运行。
两个钩子都会检查空闲计数器是否已达到睡眠阈值。如果达到阈值,控制权将转交给中央睡眠例程。唤醒后,空闲计数器重置为零。系统必须再保持空闲 30,000 个滴答,才能再次进入睡眠。

所有内核空闲要求

除非系统中所有活动内核都处于空闲状态,否则内核 0 不会进入等待中断(WFI)状态。一个全局原子计数器用于跟踪已准备好进入睡眠的内核数量。在进入 WFI 之前,内核 0 会将该值与活动内核数量进行比较。如果任何活动内核仍在处理工作,内核 0 将退出睡眠进入序列,重置其空闲计数器,并等待下一次睡眠机会。 活动内核数量在调度器初始化期间根据 GPIO 启动配置引脚确定:
  • 在锁步(lock-step)集群模式下,视为有三个活动内核。
  • 在正常模式下,视为所有四个内核均处于活动状态。
此机制使睡眠同步能够自动适应当前的硬件配置。

唤醒序列

从内核唤醒 当收到分配给相应内核的外设中断时,从内核(内核 1、内核 2 和内核 3)退出 WFI。示例包括来自 CAN、IPCC 和其他外设源的中断。
注意UART 中断注册在内核 0 上。因此,UART 活动无法将内核 1、内核 2 和内核 3 从睡眠状态唤醒。
内核 0 唤醒 内核 0 的主要唤醒机制是 IPCC 中断。从内核被硬件中断唤醒后,会调用 IPCC_Trigger,通过 IPCC 通道通知内核 0。该通知会使内核 0 退出 WFI。
注意
因此,在 freertos_init.h 中禁用 SLEEP_ENABLE 是一种安全的方法,可在调试和板级启动(bring-up)时完全绕过睡眠子系统,而无需删除任何代码