低功耗简介

电源管理架构

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

  • FreeRTOS 低功耗功能

  • CPU 周期性进入 WFI 指令休眠,发生中断时唤醒

Sleep

ON

ON

CG:ON

PG:OFF

  • 芯片级省电模式,包含 Clock Gating 与 Power Gating 两种子模式

  • 退出睡眠模式时可恢复 CPU 堆栈状态

  • 系统 RAM 保持供电,数据不会丢失

Deep Sleep

ON

OFF

OFF

  • 芯片级深度省电模式

  • 退出深度睡眠模式时无法恢复 CPU 堆栈状态,需执行完整重启流程

  • 系统 RAM 供电被切断,数据不保留

  • 备份(retention)SRAM 保持供电

低功耗软件架构

../../_images/power_save_sw_arch.svg

如图所示,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() 进入睡眠模式或深度睡眠模式。

../../_images/freertos_tickless_in_an_idle_task.svg

空闲任务中的 FreeRTOS Tickless

备注

即使设置了 FreeRTOS 时间控制机制(如软件定时器或 vTaskDelay),只要空闲任务被执行且满足条件,系统仍会进入睡眠模式。