OpenHarmony 电源管理模块状态转换分析

电源管理服务组件

简介

电源管理服务组件提供如下功能:

  1. 重启系统。
  2. 管理休眠运行锁。
  3. 系统电源状态查询。

图 1 电源管理服务组件架构图

目录

复制代码
/base/powermgr/power_manager
├── figures                  	# 架构图
├── frameworks                  # Framework层
│   ├── napi                  	# NAPI层
│   └── native                  # Native层
├── interfaces                  # 接口层
│   └── inner_api               # 内部接口
├── sa_profile                  # SA 配置文件
├── services                    # 服务层
│   ├── native                  # Native 层
│   └── zidl                    # Zidl 接口层
├── test                        # 测试用例
│   ├── fuzztest                # Fuzz 测试
│   ├── unittest                # 单元测试
│   ├── systemtest              # 系统测试
│   └── utils                   # 测试工具
└── utils                       # 工具和通用层

相关仓

电源管理子系统

电源管理模块源代码链接为:https://gitcode.com/openharmony/powermgr_power_manager

powermgr_power_manager

powermgr_display_manager

powermgr_battery_manager

powermgr_thermal_manager

powermgr_battery_statistics

powermgr_battery_lite

powermgr_powermgr_lite

OpenHarmony 电源管理模块状态转换分析

一、电源状态定义 (power_state_machine_info.h:56-106)

cpp 复制代码
enum class PowerState : uint32_t {
    AWAKE = 0,     // 屏幕亮,CPU运行 (正常工作状态)
    FREEZE,        // 屏幕亮,后台进程冻结
    INACTIVE,      // 屏幕灭,CPU运行 (灭屏)
    STAND_BY,      // 屏幕灭,部分进程冻结
    DOZE,          // 屏幕灭,大部分进程冻结 (Doze模式)
    SLEEP = 85,    // S3 - 屏幕灭,CPU停止,内存供电
    HIBERNATE = 90,// S4 - 屏幕灭,CPU停止,内存内容保存到磁盘
    SHUTDOWN,      // 关机
    DIM,           // 屏幕变暗 (亮度降低)
    UNKNOWN
};

二、OpenHarmony 电源管理状态转换图

三、各场景详细状态转换分析

  1. 亮灭屏转换 (AWAKE ↔ INACTIVE)
    代码位置: power_state_machine.cpp:296-380

    代码分析:
  • AWAKE状态 (行296-335): 设置DisplayState为DISPLAY_ON,唤醒系统
  • DIM状态 (行434-470): 设置DisplayState为DISPLAY_DIM,设置弱定时器
  • INACTIVE状态 (行347-381): 设置DisplayState为DISPLAY_OFF,取消活动定时器
  1. S3 睡眠转换 (SLEEP状态)
    代码位置: suspend_controller.cpp:799-839

    强制睡眠实现 (suspend_controller.cpp:799-839):
cpp 复制代码
void SuspendController::HandleForceSleep(SuspendDeviceType reason)
{
    // 1. 设置强制睡眠标志
    SetForceSleepingFlag(true);
    
    // 2. 设置电源状态为SLEEP
    stateMachine_->SetState(PowerState::SLEEP, reason, true);
    
    // 3. 触发同步睡眠回调
    TriggerSyncSleepCallback(false);
    
    // 4. 延迟8秒后执行底层Suspend
    ffrtTimer_->SetTimer(TIMER_ID_SLEEP, task, FORCE_SLEEP_DELAY_MS);
}
  1. S4 Hibernate 休眠转换
    代码位置: hibernate_controller.cpp 和 power_state_machine.cpp:415-422

    Hibernate实现 (hibernate_controller.cpp:22-28):
cpp 复制代码
HibernateStatus HibernateController::Hibernate(bool clearMemory)
{
    if (SystemSuspendController::GetInstance().Hibernate()) {
        return HibernateStatus::HIBERNATE_SUCCESS;
    }
    return HibernateStatus::HIBERNATE_FAILURE;
}
  1. ULSR (User Space Light Sleep) 机制
    代码位置: ulsr_callback_holder.cpp/h 和 suspend_controller.cpp
  2. 开合盖场景转换
    代码位置: suspend_controller.cpp:897-1103

四、状态转换限制矩阵

代码位置: power_state_machine.cpp:137-191

五、RunningLock 阻止机制

代码位置: power_state_machine.cpp:95-113

六、完整的场景流程图

┌─────────────────────────────────────────────────────────────────────────────────────┐

│ 完整电源状态转换流程 │
├─────────────────────────────────────────────────────────────────────────────────────┤
│ │
│ 【亮屏流程】 │
│ ┌──────────┐ 用户活动(Touch/Key/App) ┌──────────┐ │
│ │ INACTIVE│ ─────────────────────────────▶│ AWAKE │ │
│ │ (灭屏) │ │ (亮屏) │ │
│ └──────────┘ └────┬─────┘ │
│ │ │
│ 【灭屏流程】 │ 超时(默认30秒) │
│ ┌──────────┐ 用户无操作 ┌──────────┴──────────┐ │
│ │ AWAKE │ ──────────────────▶ │ DIM (变暗) │ ◀── │ ─ ─ ─ │ │
│ │ (亮屏) │ └──────────────┘ │ │
│ └──────────┘ │ │ │
│ │ 继续超时 ▼ │
│ ┌──────────────┐ ┌──────────┐ │
│ │ INACTIVE │──│ SLEEP │ │
│ │ (灭屏,CPU运行)│ │ (S3) │ │
│ └──────────────┘ └────┬─────┘ │
│ │ │
│ 【合盖睡眠】 │ RunningLock释放 │
│ ┌──────────┐ Lid合上 ┌────────────────────┐ │ │
│ │ AWAKE │ ─────────────▶│ LidSuspendMonitor │ │ │
│ │ (亮屏) │ └─────────┬───────────┘ │ │
│ └──────────┘ │ │ │
│ ▼ │ │
│ SetState(SLEEP) ◀──────────┘ │
│ │
│ 【强制睡眠】 │
│ ┌──────────┐ 电源键长按/系统请求 ┌────────────────────┐ │
│ │ AWAKE │ ─────────────────────▶│ HandleForceSleep() │ │
│ │ (亮屏) │ └─────────┬───────────┘ │
│ └──────────┘ │ │
│ │ 设置forceSleeping_=true │
│ ▼ │
│ SetState(PowerState::SLEEP) │
│ │ │
│ ▼ 8秒延迟 │
│ SystemSuspendController::Suspend() │
│ │
│ 【S4休眠】 │
│ ┌──────────┐ 电池低/长按/配置 ┌────────────────────┐ │
│ │ SLEEP │ ─────────────────────▶│ HandleHibernate() │ │
│ │ (S3) │ └─────────┬───────────┘ │
│ └──────────┘ │ │
│ │ PreHibernate() │
│ ▼ │
│ SystemSuspendController::Hibernate() │
│ │ │
│ ▼ PostHibernate() │
│ │
│ 【ULSR唤醒】 │
│ ┌──────────┐ 外部事件 ┌────────────────────┐ │
│ │ SLEEP │ ──────────────▶│ WakeupController │ │
│ │ (S3) │ └─────────┬───────────┘ │
│ └──────────┘ │ │
│ │ WakeupDeviceType::WAKEUP_DEVICE_FROM_ULSR │
│ ▼ │
│ SetState(PowerState::AWAKE) │
│ │ │
│ ▼ UlsrCallbackHolder::WakeupNotify() │
│ │
└─────────────────────────────────────────────────────────────────────────────────────┘


七、关键文件汇总

这个状态转换图展示了OpenHarmony电源管理模块的完整工作流程,涵盖了从亮灭屏、S3/S4睡眠、开合盖等所有关键场景的状态转换逻辑。

相关推荐
wanghu202419 小时前
ABC460_E题题解
c++·算法
智者知已应修善业20 小时前
【51单片机象棋快棋赛 电子裁判器】2023-12-27
c++·经验分享·笔记·算法·51单片机
晚风予卿云月20 小时前
二分算法练习
数据结构·c++·算法·竞赛·算法随笔
lilili也20 小时前
C++:文件操作
c++
Lhan.zzZ21 小时前
C++多线程——std::thread与condition_variable形象理解
c++
头歌实践平台21 小时前
C++面向对象 - 运算符重载的应用
开发语言·c++·算法
思麟呀21 小时前
C++11并发编程:互斥锁
linux·开发语言·c++·windows
AC赳赳老秦21 小时前
OpenClaw批量任务队列优化:解决任务堆积、执行缓慢、优先级混乱问题
java·大数据·数据库·c++·自动化·php·openclaw
晚风予卿云月21 小时前
《二分答案》算法练习
数据结构·c++·算法·二分·竞赛·算法随笔
郭涤生21 小时前
C++ 各类数据的内存分区与读写性能详解
开发语言·c++