返回首页

Power Management 电源管理学习笔记

本笔记学习 Zephyr 的电源管理 API,实现低功耗应用。


示例路径

zephyr/samples/subsys/pm/latency/   - 电源延迟策略
zephyr/samples/subsys/pm/device_pm/ - 设备级电源管理

核心概念

电源状态

状态说明功耗
Active活动状态最高
Runtime Idle运行时空闲较低
Suspend to Idle挂起到空闲
Standby待机更低
Deep Sleep深度睡眠最低

功耗优化策略

  1. 延迟约束: 限制最大唤醒延迟
  2. 设备 PM: 设备级电源管理
  3. 策略订阅: 监听电源状态变化

核心 API

头文件

#include <zephyr/pm/policy.h>
#include <zephyr/pm/device.h>
#include <zephyr/pm/device_runtime.h>

延迟约束请求

struct pm_policy_latency_request req;

// 添加延迟约束 (30ms)
pm_policy_latency_request_add(&req, 30000);

// 更新延迟约束 (10ms)
pm_policy_latency_request_update(&req, 10000);

// 移除延迟约束
pm_policy_latency_request_remove(&req);

延迟变化订阅

static void on_latency_changed(int32_t latency)
{
    if (latency == SYS_FOREVER_US) {
        printk("No latency constraint\n");
    } else {
        printk("Latency constraint: %d ms\n", latency / 1000);
    }
}

struct pm_policy_latency_subscription subs;

// 订阅
pm_policy_latency_changed_subscribe(&subs, on_latency_changed);

// 取消订阅
pm_policy_latency_changed_unsubscribe(&subs);

设备电源管理

设备运行时 API

#include <zephyr/pm/device_runtime.h>

const struct device *dev = DEVICE_DT_GET(...);

// 启用设备
pm_device_runtime_enable(dev);

// 禁用设备
pm_device_runtime_disable(dev);

// 获取设备(使用前)
pm_device_runtime_get(dev);

// 放弃设备(使用后)
pm_device_runtime_put(dev);

// 异步放弃设备
pm_device_runtime_put_async(dev);

完整示例:延迟约束

#include <zephyr/kernel.h>
#include <zephyr/pm/policy.h>

static void on_latency_changed(int32_t latency)
{
    if (latency == SYS_FOREVER_US) {
        printk("Latency: none\n");
    } else {
        printk("Latency: %d ms\n", latency / 1000);
    }
}

int main(void)
{
    struct pm_policy_latency_subscription subs;
    struct pm_policy_latency_request req;
    
    // 订阅延迟变化
    pm_policy_latency_changed_subscribe(&subs, on_latency_changed);
    
    // 无约束时睡眠
    printk("Sleeping 1.1s - policy may select a low-power state\n");
    k_msleep(1100);
    
    printk("Sleeping 1.2s - policy may select a deeper state\n");
    k_msleep(1200);
    
    printk("Sleeping 1.3s - actual state depends on policy and board support\n");
    k_msleep(1300);
    
    // 添加延迟约束
    printk("Setting latency constraint: 30ms\n");
    pm_policy_latency_request_add(&req, 30000);
    
    // 有约束时睡眠
    printk("Sleeping 1.3s - latency constraint may limit deeper states\n");
    k_msleep(1300);
    
    // 更新约束为更严格的值
    printk("Updating constraint: 10ms\n");
    pm_policy_latency_request_update(&req, 10000);
    
    printk("Sleeping 1.1s - stricter latency may keep the system in a shallower state\n");
    k_msleep(1100);
    
    // 移除约束
    pm_policy_latency_request_remove(&req);
    
    return 0;
}

nRF54L15 电源特性

特性说明
System ON正常运行模式
System OFF深度睡眠,最低功耗
Low Power Mode低功耗模式
多电压域可独立控制电源

低功耗技巧

  1. 减少活动时间: 快速完成任务后睡眠
  2. 关闭外设: 不使用时关闭外设电源
  3. 使用中断: 用中断替代轮询
  4. 降低频率: 降低 CPU 频率

配置选项

# prj.conf
CONFIG_PM=y
CONFIG_PM_DEVICE=y
CONFIG_PM_DEVICE_RUNTIME=y
CONFIG_PM_POLICY_APP=y

应用场景

  1. 电池供电设备: 延长电池寿命
  2. IoT 传感器: 低功耗数据采集
  3. 可穿戴设备: 长时间运行
  4. 远程监控: 无线传感器网络

注意事项

  1. 唤醒时间: 深度睡眠唤醒需要更长时间
  2. 设备状态: 睡眠前确保设备状态已保存
  3. 中断处理: 唤醒后正确处理中断
  4. 调试模式: 调试时可能影响低功耗模式

*小白 🤖 - 2026-03-16*