低功耗简介
电源管理架构
SoC 搭载了先进的电源管理控制器(Power Management Controller,PMC),可灵活控制芯片不同电源域的上电时序,实现性能与功耗的最佳平衡。
SoC 的数字系统中一般包含三个核心电源域:AON 域、SYSON 域和 SOC 域。不同省电模式下,各电源域的关断策略存在差异。
Ameba 系列 SoC 的电源域和唤醒源如下所示:
低功耗模式
Ameba SoC 支持两种低功耗模式:
睡眠(Sleep)模式
Clock Gating(CG):关闭 SOC 域的时钟,保留其供电
Power Gating(PG):关闭 SOC 域的电源
深度睡眠(Deep-Sleep)模式
关闭 SYSON 域和 SOC 域的供电。深度睡眠模式比睡眠模式关闭更多电源域,因此功耗更低,但同时唤醒源也会减少。
下表详细解释了各个模式的电源域工作状态及特点:
模式 |
AON |
SYSON |
SOC |
描述 |
|---|---|---|---|---|
Tickless |
ON |
ON |
ON |
|
Sleep |
ON |
ON |
CG:ON PG:OFF |
|
Deep Sleep |
ON |
OFF |
OFF |
|
低功耗软件架构
如图所示,Ameba 低功耗功能的实现主要由以下部分组成:
usrcfg: 由开发者直接编辑该文件进行修改,主要可以设置:
为哪些外设打开 sleep 唤醒功能,唤醒哪个 MCU Core
为哪些 pin 打开 deep sleep 唤醒功能
进入 sleep 模式之后,系统的电压
一些 clock 进入 sleep 模式之后是否关闭,这主要取决于打开唤醒功能的外设是否需要这些 clock
睡眠锁(wakelock):
如果某个睡眠锁处于锁定状态,则系统无法 sleep,只有所有 wakelock 都释放之后,系统才可能进入 sleep 模式
可以用于保护某段程序不会走到中间(因等待)误入 sleep 模式
Active 时间设定:
让系统再一段时间之内不要进入 sleep 模式
用于保护某些行为(尤其是该行为结束的点有多个分支的情况)不会走到中间误入 sleep 模式,可以估一个保守的 active 时间放在该行为的开头
sleep hook 设定:
为某个外设或者程序设置 sleep hook
所有的 sleep hook 会在 MCU 真正 sleep 之前被调用
wake hook 设定:
为某个外设或者程序设置 wake hook
所有的 wake hook 会在 MCU wake 后,运行系统线程之前调用
FreeRTOS Tickless
FreeRTOS 的 Tickless 低功耗特性通过优先级最低的 Idle 任务实现,当系统没有其他运行任务时触发。
备注
低功耗应用必须启用 configUSE_TICKLESS_IDLE 配置项,因为睡眠模式基于 Tickless 机制实现。
与原生 FreeRTOS 不同,不依赖 xExpectedIdleTime 进行唤醒。
下展示了空闲任务的代码流程。在空闲任务中,系统会检查睡眠条件(包括睡眠锁状态、系统活跃时间等),以决定是否进入睡眠模式。
当条件不满足时:CPU 执行 ARM WFI (等待中断)指令,使处理器挂起直至中断触发。通常由 SysTick 中断恢复运行,此模式称为 软件 Tickless。
当条件满足时:执行函数
freertos_pre_sleep_processing()进入睡眠模式或深度睡眠模式。
空闲任务中的 FreeRTOS Tickless
备注
即使设置了 FreeRTOS 时间控制机制(如软件定时器或 vTaskDelay),只要空闲任务被执行且满足条件,系统仍会进入睡眠模式。