3. 低功耗系统架构设计

在 i.MX 系列(如 i.MX 8M Mini、i.MX 8M Plus、i.MX 6ULL)智能终端上,低功耗不是靠“把 CPU 频率调低”这一个动作实现的,而是由三个相互耦合的层面共同决定:电源域划分决定“哪些电路可以独立断电”,多核异构调度决定“任务放在哪个核、以什么频率运行”,传感器与无线模块协同决定“系统何时必须醒来、醒来多久”。三者中任何一层设计不当,都会让另外两层的省电努力被抵消。

一、电源域划分:先看“能不能断”,再看“断得干不干净”

i.MX 芯片内部通常划分为多个电源域,典型包括:VDD_SOC(SoC 核心逻辑)、VDD_ARM(Cortex-A 核)、VDD_GPU/VPU(图形与视频)、VDD_DDR(内存控制器与 I/O)、NVCC_xxx(各外设 I/O 电压域)以及 VDD_SNVS(始终供电的 RTC/唤醒逻辑)。设计原则是:把“必须常开”的部分压到最小,把“可独立关闭”的部分尽量拆细。

以 i.MX 8M Mini 的典型低功耗终端为例,可做如下划分:

  • 常开域(Always-On):VDD_SNVS + 32.768 kHz RTC + 唤醒引脚(如 ONOFF、PMIC_PWRON),仅消耗微安级电流,负责计时与唤醒源捕获。
  • 可保持域(Retention):DDR 进入自刷新(Self-Refresh),VDD_DDR 保持供电但控制器停止访问,数据不丢失,恢复时间约几十微秒。
  • 可断电域(Power-Gated):VDD_ARM、VDD_GPU、VDD_VPU 在无任务时由 PMIC 关闭,配合 GPC(General Power Controller)的电源门控信号完成。

划分时要注意两个易错点:其一,跨域信号必须经过电平转换或隔离,否则断电域漏电会通过 I/O 保护二极管倒灌;其二,唤醒源必须落在常开域,例如把 GPIO 唤醒引脚接到已断电的 I/O 域,系统将无法被唤醒。判断划分是否合理,可用“静态电流法”:在系统挂起状态下测量 VDD_SNVS 与 VDD_DDR 的电流,若常开域电流超过 100 µA,通常说明有外设或上拉电阻未处理干净。

i.MX 低功耗终端电源域与唤醒路径示意 PMIC BUCK / LDO 电源门控输出 常开域 VDD_SNVS RTC 32.768 kHz 唤醒引脚 / ONOFF 保持域 VDD_DDR DDR 自刷新 数据保持 可断电域 ARM / GPU VPU 传感器中断 I2C / GPIO 唤醒 无线模块 Wi-Fi / BLE 唤醒 GPC 电源门控控制器 根据唤醒源与任务状态,决定各域上电/断电 门控反馈 状态:Run(全开)→ Idle(关 ARM/GPU)→ Suspend(DDR 自刷新)→ Deep Sleep(仅 SNVS 常开) 唤醒路径:传感器/无线中断 → 常开域捕获 → GPC 上电 → 恢复 DDR → 恢复 ARM 执行

二、多核异构调度:把任务放到“最省电的核”上

i.MX 8M 系列常见 Cortex-A53 + Cortex-M4/M7 的异构组合。A 核性能高但漏电大,M 核性能低但可在极低频率下长期运行。调度原则是:把周期性、低算力、硬实时的任务下沉到 M 核,把 A 核留给需要 Linux、网络协议栈或复杂算法的任务,并让 A 核尽可能长时间处于 WFI 或断电状态。

一个可复现的示例:某环境监测终端需要每 500 ms 采集一次温湿度,每 5 s 通过 BLE 上报一次。若全部放在 A 核 Linux 下用定时器实现,A 核无法进入深度睡眠,平均电流约 80 mA。改为:M4 核负责 500 ms 采样与 BLE 协议栈,A 核仅在需要做数据聚合或 OTA 时被 M4 通过 MU(Messaging Unit)唤醒,A 核平均电流可降至 15 mA 以下。这里的关键配置是:

/* 设备树中保留 M4 核并分配外设 */
&m4_reserved {
    compatible = "fsl,imx8mm-cm4";
    fsl,auto-boot = <0>;   /* 由 A 核按需启动 */
};

/* A 核侧通过 rpmsg 与 M4 通信 */
echo start > /sys/class/remoteproc/remoteproc0/state

调度时还要注意频率与电压的联动:i.MX 的 CPUFreq 与 PMIC 的 DVS 必须配合,降频的同时降压,否则只降频不降压,省电收益有限。判断调度是否有效,可观察 /sys/kernel/debug/pm_genpd 中各电源域的开关次数,以及 cpuidle 各状态的驻留时间占比。

三、传感器与无线模块协同:让“唤醒”成为稀缺资源

传感器和无线模块是终端中最容易“偷偷耗电”的部分。协同设计的核心是:用传感器内部的状态机或阈值判断替代主控轮询,用无线模块的休眠周期对齐主控的睡眠周期。

具体做法包括:

  • 传感器侧:选用带 FIFO 和中断输出的器件(如 BMI270、SHT4x),配置为“超过阈值才产生中断”,主控仅在中断时被唤醒。I2C 总线上拉电阻应接到常开域,避免断电域漏电。
  • 无线侧:BLE 连接间隔(Connection Interval)从 20 ms 放宽到 500 ms,Wi-Fi 使用 DTIM 休眠,模块在无数据时进入 deep sleep,由模块自身 RTC 定时唤醒或由主控 GPIO 唤醒。
  • 时间对齐:让传感器的采样周期与无线的上报周期成整数倍关系,例如采样 500 ms、上报 5 s,主控每 5 s 醒来一次批量处理,减少唤醒次数。
协同设计的一个实用检查点:在系统挂起时,用万用表或功耗分析仪观察 10 分钟内的电流波形。若出现周期性尖峰,说明某个模块仍在自主唤醒;若电流缓慢爬升,通常是上拉电阻或 LDO 静态电流问题。

四、架构设计原则小结与案例判断

综合以上三层,低功耗系统架构可归纳为四条原则:常开域最小化、可断电域独立化、任务下沉到低功耗核、唤醒源集中管理。在实际项目中,建议先画出一张“电源域—任务—唤醒源”的对应表,再逐项确认每个域在每种状态下的供电与时钟。例如某智能门锁方案中,指纹模块和 BLE 分别独立供电,A 核仅在指纹比对时上电,M4 负责按键与 BLE 广播,整机待机电流从 2 mA 降到 180 µA,这就是三层协同设计带来的直接收益。

判断架构是否达标,不看单一指标,而看三个数:Deep Sleep 电流、平均工作电流、唤醒恢复时间。三者需要与产品定义中的电池容量和续航目标匹配,任何一项超标,都应回到电源域划分或调度策略中重新检查。