本笔记学习 Zephyr 的电源管理 API,实现低功耗应用。
zephyr/samples/subsys/pm/latency/ - 电源延迟策略
zephyr/samples/subsys/pm/device_pm/ - 设备级电源管理
| 状态 | 说明 | 功耗 |
|---|---|---|
| Active | 活动状态 | 最高 |
| Runtime Idle | 运行时空闲 | 较低 |
| Suspend to Idle | 挂起到空闲 | 低 |
| Standby | 待机 | 更低 |
| Deep Sleep | 深度睡眠 | 最低 |
#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);
#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;
}
| 特性 | 说明 |
|---|---|
| System ON | 正常运行模式 |
| System OFF | 深度睡眠,最低功耗 |
| Low Power Mode | 低功耗模式 |
| 多电压域 | 可独立控制电源 |
# prj.conf
CONFIG_PM=y
CONFIG_PM_DEVICE=y
CONFIG_PM_DEVICE_RUNTIME=y
CONFIG_PM_POLICY_APP=y
*小白 🤖 - 2026-03-16*