Fork me on GitHub
0%

功耗管理

功耗管理

  • 系统时钟(系统时钟、外设时钟)
  • 电源模式(IDLE、DEEP、LIGHT、STANDBY)
  • 引脚处理(普通引脚、总线引脚、中断引脚)
  • 定时器(系统定时器、软件定时器、低功耗定时器)
  • 电池(充电、放电曲线)
  • 电量(库仑计、电池电压估算)
  • PM框架(睡眠管理、变频管理)

休眠唤醒流程

  • 休眠准备

    1. 正常退出应用程序并保存数据。将此时应用程序的状态及数据进行保存;
    2. 关闭外设、GPIO及时钟等。这里是对系统功耗做优化的核心部分;
    3. 配置唤醒源。将我们所关心的事件作为唤醒源
  • 进入休眠

    通过执行软件命令,进入休眠状态。

  • 等待唤醒

    在此状态下,主处理器和大部分系统模块会停止运行。当系统检测到唤醒时间发生,比如触屏事件、按键事件、定时器事件等等,系统将进入唤醒流程。(唤醒事件一定是要在休眠前进行配置的)

  • 唤醒恢复

    恢复保存的状态和数据,重新启动必要的外设和时钟,并使系统回到正常工作状态。

休眠唤醒原则

时钟

休眠:

  • 时钟状态保存:保存关键的时钟状态和寄存器信息。包括处理器时钟频率、外设时钟配置、中断控制器状态等。
  • 禁用时钟源:例如处理器主时钟、外设时钟等。禁用这些时钟源有助于降低系统功耗并减少电流消耗。
  • RTC定时器。通常RTC是有独立电源域的,RTC将以低功耗模式供电

唤醒

  • 恢复时钟源:将禁用的时钟源将被重新启用,处理器主时钟和外设时钟会重新配置。
  • 时钟状态恢复:包括处理器时钟频率、外设时钟配置、中断控制器状态等。
  • 时钟系统稳定:在唤醒后,系统会等待一段时间以确保时钟系统稳定(对应时钟控制器的stable标志位置位即可)。

CPU Core

不同的处理器架构和硬件设计可能会有不同的掉电级别和功耗管理策略,在特定的应用中,需要查阅相关的处理器手册、硬件规格和操作系统文档,以了解详细的掉电行为和配置方法。

对于较高级别的处理器将存在以下级别的状态:Normal、Idle、Sleep、Stand By、Power Down,在不同的等级下将执行不同等级的休眠操作。在该章节下,对于cpu core最大节省功耗的点在于掉电。Suspend-to-RAM,系统的状态会保存到内存中,CPU核心将被禁用并进入低功耗状态,当系统唤醒时,CPU核心重新上电并恢复正常运行。

GPIO

休眠:

  • 尽量对所有pin都进行设置

  • GPIO内部PULL状态与外部PULL状态一致的管脚:输入PULL状态(GPIO_INPUT | GPIO_PULL_UP/DOWN)

    例如:IO内部只有上拉电阻,查看原理图外设对应管脚上拉,则可以设置为输入上拉

    或者可以遵循另一种原则:

    • 如果该IO口带上拉,请设置为高电平输出或者高阻态输入(GPIO_OUTPUT_HIGH| GPIO_PULL_HIZ)
    • 如果该IO口带下拉,请设置为低电平输出或者高阻态输入(GPIO_OUTPUT_LOW | GPIO_PULL_HIZ)
  • 外部接上下拉电阻或接电源接地,并且与内部上下拉状态不一致的管脚:输入NO PULL状态(GPIO_INPUT | GPIO_PULL_HIZ)

    具体需要根据设备的原理图来判断

  • 悬空管脚:输出低电平并且 NO PULL 状态(GPIO_OUTPUT_LOW | GPIO_PULL_HIZ)

  • 中断引脚除唤醒中断源保留外其他需要失能(关中断)

唤醒:

  • 普通引脚:正常输入输出状态,据情况判断
  • 总线引脚:可以在休眠前通过相关函数记录状态,唤醒时恢复即可(该部分基本是配置为FUNC功能)
  • 中断引脚:使能中断

外设

外设的休眠唤醒取决于具体的产品。但是一般存在于嵌入式设备产品的外设包括:LCD、Camera、WIFI、BT、CODEC或其它传感器。通常外设时钟关闭、掉电外设将不会工作,功耗也随之降低

功耗测量

测量条件

对功耗进行测量的时候,需要将usb断开,使用电池供电

测量指标

功耗测量的时候需要对系统在不同阶段进行测量,主要包括:

  1. 静态功耗:指设备处于空闲或低负载状态时的功耗。它是设备在没有进行任何操作或执行任务时的最小功耗水平。
  2. 动态功耗:指设备在执行各种任务和工作负载时的功耗。它取决于设备的工作负载、处理器使用率、外设活动等。
  3. 休眠功耗:指设备进入休眠模式时的功耗。
  4. 唤醒功耗:指设备从休眠状态唤醒时的功耗。唤醒时可能会有一些额外的功耗,例如重新启动CPU核心、恢复外设等。
  5. 峰值功耗:指设备在执行高负载或特定任务时的最大功耗水平。

Linux电源管理

1
2
3
# cat /sys/power/state  //查看内核支持哪几种休眠方式

# echo standby > /sys/power/state // 命令系统进入standby休眠
  • freeze: 冻结I/O设备,将它们置于低功耗状态,使处理器进入空闲状态。唤醒最快,耗电比其它standby, mem,disk方式高。

  • standby:请求系统进入 Suspend-to-Idle状态。在该状态下,系统仅关闭 CPU 核心并保持其他硬件运行,以实现更低的功耗。

  • mem:请求系统进入 Suspend-to-RAM状态。在该状态下,系统的状态会保存到内存中,并关闭不必要的硬件设备。进入等待模式,唤醒较慢,耗电比disk方式高。

  • disk:请求系统进入 Suspend-to-Disk状态。在该状态下,系统的状态会保存到磁盘上,并完全关闭系统。

Q&A

  1. Q:时钟与功耗的关系?

    A:Soc中各个设备在工作时,时钟频率越高功耗越大、发热越大、越容易不稳定,需要散热条件越苛刻;
    Soc内部有很多外设,这些外设不使用的时候最好关掉

  2. Q:休眠之后没有按键、没有触屏中断触发,也没有rtc唤醒,但是刚刚休眠之后就被唤醒?

    A:wifi-irq中断在休眠时需要配置成下拉或者输出低,不让其唤醒即可

  3. Q:唤醒之后某个功能不能正常使用?

    A:唤醒之后相关IO的状态设置可能出现错误,在休眠前通过get_gpio_func获取到并记录保证一致;如果还是不成功可以考虑休眠时IO状态的设置,是否是休眠时某些IO状态组合对外设产生了非法的命令导致错误,IO状态设置原则只是一般规则

参考资料