SylixOS电源管理概述以及接口介绍

2023-10-27

1. 概述

    电源管理是操作系统中重要的一部分。要实现电源管理功能,首先需要设备本身支持电源管理操作,其次是操作系统支持电源管理操作。

    SylixOS支持电源管理功能,电源管理分为两大部分:CPU功耗管理和外设功耗管理。

1.1 CPU功耗管理

    SylixOS中,CPU功耗管理分为三个能级:

    1.正常运行(Running):CPU正常执行指令。

    2.省电模式(PowerSaving):所有具有电源管理功能的设备进入 PowerSaving 模式,同时CPU主频降低,多核CPU仅保留一个CPU运行。

    3.休眠模式(Sleep):系统休眠所有具有电源管理功能的设备进入 Suspend 模式,系统需要通过指定事件唤醒休眠模式系统,会从复位向量处恢复,需要 bootloader/BIOS 程序配合。

需要的注意的是,在SMP多核中,可以动态调整CPU运行的核心数。

1.2 外设功耗管理

    SylixOS中,外设功耗管理分为四个状态:

    1.正常运行状态:设备被打开,驱动程序请求电源管理适配器连通设备电源与时钟,开始工作。

    2.设备关闭状态:设备被关闭,驱动程序请求电源管理适配器断开设备电源与时钟,停止工作。

    3.省电模式状态:系统进入省电模式,请求高能耗设备进入省电模式。

    4.设备空闲状态:设备功耗管理单元具有看门狗功能,一旦空闲时间超过设置,系统会将设备变为空闲状态。

1.3 系统框架

    SylixOS下电源管理结构如图1 - 1所示。

 

                             图1 - 1电源管理系统框架

    每个电源管理适配器(PM Adapter)可以管理多个设备(由相应的通道号区分),电源管理适配器管理的通道号总数决定这个适配器可以管理多少个设备。应用层可以对支持电源管理的设备进行进入休眠模式、进入省电模式、恢复正常模式等电源管理操作。

2. 系统接口及实现

2.1 系统接口概述

    SylixOS中,电源管理部分提供了下面6个函数接口供应用层使用,如表2-1所示。

                                                                  表2-1 电源管理系统接口
系统接口 功能
API_PowerMSuspend 系统休眠
API_PowerMResume 系统唤醒
API_PowerMCpuSet 设置CPU节电参数
API_PowerMCpuGet 获取CPU节电参数
API_PowerMSavingEnter 系统进入省电模式
API_PowerMSavingExit 系统退出省电模式

2.1.1 系统休眠

    控制所有支持休眠功能的外设进入休眠状态,同时内核进入休眠状态。
VOID Lw_PowerM_Suspend(VOID);

2.1.2 系统唤醒

    控制所有支持休眠功能的外设从休眠状态恢复正常状态,同时内核恢复正常状态。

VOID Lw_PowerM_Resume(VOID);

2.1.3 设置CPU节能参数

    设置多核系统中运行的CPU核数目以及CPU能耗级别,系统根据参数关闭或打开CPU核,同时设置CPU能耗级别,设置CPU以不同的主频运行,进入节能模式时降低主频,反之则升高主频。本函数还会将CPU参数的改变通知到所有支持电源管理的外设。

VOID Lw_PowerM_CpuSet(ULONG ulNCpus, UINT uiPowerLevel);

其中参数:参数 ulNCpus是运行态的CPU核个数;

                 参数 uiPowerLevel是CPU能耗级别。

2.1.4 获取CPU节能参数

    该函数获得当前运行的CPU个数和CPU能耗级别。

VOID Lw_PowerM_CpuGet(ULONG *pulNCpus, UINT *puiPowerLevel);

其中参数:   参数 pulNCpus返回运行态的CPU核个数;

                    参数 puiPowerLevel返回CPU能耗级别。

2.1.5 系统进入省电模式

    使系统进入省电模式。控制所有支持电源管理的设备进入省电模式,同时设置运行的CPU核数目以及能耗级别。

VOID Lw_PowerM_SavingEnter(ULONG ulNCpus, UINT uiPowerLevel);

其中参数: 参数 ulNCpus是运行态的CPU核个数;

                  参数 uiPowerLevel是CPU能耗级别。

2.1.6 系统退出省电模式

    控制系统退出省电模式,控制所有支持电源管理的设备退出省电模式,同时设置运行的CPU核数目以及能耗级别。

VOID Lw_PowerM_SavingExit(ULONG ulNCpus, UINT uiPowerLevel);

其中参数:  参数 ulNCpus是运行态的CPU核个数;

                   参数 uiPowerLevel是CPU能耗级别。

2.2 系统接口实现

2.2.1 系统休眠和唤醒

    系统在进行休眠或者唤醒操作时,首先遍历电源设备管理链表,对链表中支持电源管理的设备进行休眠或者唤醒操作,然后对系统内核进行休眠或唤醒操作。系统接口实现流程如图2 - 1所示。


                      图2 - 1 系统休眠或唤醒流程

1. 系统休眠

    对系统进行休眠操作,需调用API_PowerMSuspend系统接口,实现外设和系统内核进入休眠状态。函数原型如程序清单 2 - 1所示。

                                                                                           程序清单2 - 1  系统休眠

VOID  API_PowerMSuspend  (VOID)
{
    PLW_LIST_LINE       plineTemp;
PLW_PM_DEV        pmdev;

    __POWERM_LOCK();
    /*
     *  遍历电源管理链表,对链表中设备进行休眠处理
     */
    for (plineTemp   = _G_plinePMDev;
         plineTemp !=  LW_NULL;
         plineTemp  = _list_line_get_next(plineTemp)) {
        pmdev = _LIST_ENTRY(plineTemp, LW_PM_DEV, PMD_lineManage);
        if (pmdev->PMD_pmdfunc && 
            pmdev->PMD_pmdfunc->PMDF_pfuncSuspend) {
            pmdev->PMD_pmdfunc->PMDF_pfuncSuspend(pmdev);
        }
}

__POWERM_UNLOCK();

    API_KernelSuspend();                                          /*  内核休眠处理              */
}

    该函数实现以下功能:

  1.  遍历电源设备管理链表中支持电源管理的设备;

  2.  调用PMDF_pfuncSuspend函数,对加入电源管理链表中的外设依次进行休眠处理;

  3.  调用API_KernelSuspend函数,使内核进入休眠状态。

2. 系统唤醒

    系统从休眠状态唤醒,需调用API_PowerMResume系统接口,实现外设和内核从休眠状态唤醒,函数原型如程序清单2- 2所示。

 程序清单2 - 2  系统唤醒

VOID  API_PowerMResume (VOID)
{
    PLW_LIST_LINE   plineTemp;
    PLW_PM_DEV      pmdev;
    
    __POWERM_LOCK();

    /*
     *  遍历电源管理链表,对链表中设备进行唤醒处理
     */
    for (plineTemp  = _G_plinePMDev;
         plineTemp != LW_NULL;
         plineTemp  = _list_line_get_next(plineTemp)) {
         
        pmdev = _LIST_ENTRY(plineTemp, LW_PM_DEV, PMD_lineManage);
        if (pmdev->PMD_pmdfunc && 
            pmdev->PMD_pmdfunc->PMDF_pfuncResume) {
            pmdev->PMD_pmdfunc->PMDF_pfuncResume(pmdev);
        }
    }
    __POWERM_UNLOCK();
    
    API_KernelResume();                                              /*  内核唤醒处理                */
}

 该函数实现以下功能:

    1.遍历电源设备管理链表中支持电源管理的设备;

    2.调用PMDF_pfuncResume函数,对加入电源管理链表中的外设进行唤醒处理;

    3.调用API_KernelResume函数,使内核从休眠中唤醒。

2.2.2 CPU节电参数设置和获取

    CPU节电参数的设置,根据传入参数对CPU核进行关闭和打开,然后设置CPU能耗等级。获取CPU节电参数,首先获取当前系统运行CPU核个数,然后获取CPU能耗等级。系统接口实现流程如图2 - 2所示:


                           图2 - 2 CPU节电参数设置、获取流程

1. 设置CPU节电参数

    设置CPU节电参数,需调用API_PowerMCpuSet系统接口,函数原型如程序清单2-3所示。

程序清单2 - 3  设置CPU节电参数

VOID  API_PowerMCpuSet (ULONG  ulNCpus, UINT  uiPowerLevel)
{
    PLW_LIST_LINE   plineTemp;
    PLW_PM_DEV      pmdev;
UINT            uiOldPowerLevel;

#if LW_CFG_SMP_EN > 0
    ULONG           i;
    ULONG           ulActCnt = 0;
#endif                                                            /*  LW_CFG_SMP_EN > 0            */
    if (ulNCpus == 0) {
        _ErrorHandle(EINVAL);
        return;
    }
    if (ulNCpus > LW_NCPUS) {
        ulNCpus = LW_NCPUS;
}

#if LW_CFG_SMP_EN > 0
    for (i = 0; i < LW_NCPUS; i++) {                                 /*  获取当前系统运行CPU数           */
        if (API_CpuIsUp(i)) {
            ulActCnt++;
        }
}

    if (ulActCnt > ulNCpus) {                                      /*  需要关闭一些 CPU                 */
#if LW_CFG_SMP_CPU_DOWN_EN > 0
        ULONG   ulDownCnt = ulActCnt - ulNCpus;
        for (i = 1; i < LW_NCPUS; i++) {
            if (API_CpuIsUp(i)) {
                API_CpuDown(i);
                ulDownCnt--;
            }
            if (ulDownCnt == 0) {
                break;
            }
        }
#endif                                                           /*  LW_CFG_SMP_CPU_DOWN_EN > 0  */

    } else if (ulActCnt < ulNCpus) {                                 /*  需要打开一些 CPU                  */
        ULONG   ulUpCnt = ulNCpus - ulActCnt;
        for (i = 1; i < LW_NCPUS; i++) {
            if (!API_CpuIsUp(i)) {
                API_CpuUp(i);
                ulUpCnt--;
            }

            if (ulUpCnt == 0) {
                break;
            }
        }
    }
#endif                                                           /*  LW_CFG_SMP_EN > 0           */

    API_CpuPowerGet(&uiOldPowerLevel);                         /*  获得CPU运行能级                */
    if (uiOldPowerLevel != uiPowerLevel) {
        API_CpuPowerSet(uiPowerLevel);                         /*  设置CPU运行能级                */
        __POWERM_LOCK();
        /*
         * 遍历电源管理链表,将节电参数通知支持电源管理的外设
         */
        for (plineTemp  = _G_plinePMDev;
             plineTemp != LW_NULL;
             plineTemp  = _list_line_get_next(plineTemp)) {
            pmdev = _LIST_ENTRY(plineTemp, LW_PM_DEV, PMD_lineManage);
            if (pmdev->PMD_pmdfunc && 
                pmdev->PMD_pmdfunc->PMDF_pfuncCpuPower) {
                pmdev->PMD_pmdfunc->PMDF_pfuncCpuPower(pmdev);
            }
        }

        __POWERM_UNLOCK();
    }
}

    该函数实现以下功能:

  1.  获取当前系统运行的CPU核数;

  2.  若传入参数小于当前系统运行CPU核数,则关闭一些CPU核;

  3.  若传入参数大于当前系统运行CPU核数,则打开一些CPU核;

  4.  获取当前CPU能耗等级,根据传入参数设置CPU能耗等级;

  5.  遍历电源管理设备链表,将CPU节电参数通知所有支持电源管理的外设。

2. 获取CPU节电参数

    获取CPU节电参数,需调用API_PowerMCpuGet系统接口,函数原型如程序清单2-4所示。

     程序清单2-4   获取CPU节电参数

VOID  API_PowerMCpuGet (ULONG  *pulNCpus, UINT  *puiPowerLevel)
{
#if LW_CFG_SMP_EN > 0
    ULONG       i;
    ULONG       ulActCnt = 0;
     /*
     * 获取CPU运行核数
     */
    if (pulNCpus) {
        for (i = 0; i < LW_NCPUS; i++) {
            if (API_CpuIsUp(i)) {
                ulActCnt++;
            }
        }
        *pulNCpus = ulActCnt;
    }
#else
    if (pulNCpus) {
        *pulNCpus = 1ul;
    }
#endif                                                          /*  LW_CFG_SMP_EN > 0           */
    if (puiPowerLevel) {
        API_CpuPowerGet(puiPowerLevel);                        /*  获取CPU运行能级              */
    }
}

    该函数实现以下功能:

  1.  获取当前系统CPU核数;

  2.  获取当前系统CPU运行能级。

2.2.3 系统省电模式进入和退出

    系统进入或退出省电模式,首先通知所有支持电源管理的外设进入或者退出省电模式,然后根据传入参数设置CPU节电参数。系统接口实现流程如图2 - 3所示。

                            图2 - 3 进入、退出省电模式流程

1. 进入省电模式

    系统进入省电模式,需调用API_PowerMSavingEnter系统接口,函数原型如程序清单2 - 5所示。

程序清单2 - 5   进入省电模式

VOID  API_PowerMSavingEnter (ULONG  ulNCpus, UINT  uiPowerLevel)
{
    PLW_LIST_LINE   plineTemp;
    PLW_PM_DEV      pmdev;
    
    if (ulNCpus == 0) {
        _ErrorHandle(EINVAL);
        return;
}
__POWERM_LOCK();
     /*
      *   遍历电源管理链表,使外设进入省电模式
      */
    for (plineTemp  = _G_plinePMDev;
         plineTemp != LW_NULL;
         plineTemp  = _list_line_get_next(plineTemp)) {
        pmdev = _LIST_ENTRY(plineTemp, LW_PM_DEV, PMD_lineManage);
        if (pmdev->PMD_pmdfunc && 
            pmdev->PMD_pmdfunc->PMDF_pfuncPowerSavingEnter) {
            pmdev->PMD_pmdfunc->PMDF_pfuncPowerSavingEnter(pmdev);
        }
}

    _G_bPowerSavingMode = LW_TRUE;
    __POWERM_UNLOCK();
    
    API_PowerMCpuSet(ulNCpus, uiPowerLevel);                      /*  CPU节电参数设置            */
}

    该函数实现以下功能:

  1.  遍历电源管理链表,把电源管理链表中所有支持电源管理的设备设置为省电模式;

  2.  设置CPU节电参数,根据传入参数,对CPU节电参数进行设置,调用2.2.2节中API_PowerMCpuSet接口函数。

2. 退出省电模式

    系统退出省电模式,需调用API_PowerMSavingExit系统接口,函数原型如程序清单2 - 6所示。

 程序清单2 - 6  退出省电模式

VOID  API_PowerMSavingExit (ULONG  ulNCpus, UINT  uiPowerLevel)
{
    PLW_LIST_LINE   plineTemp;
PLW_PM_DEV      pmdev;

    if (ulNCpus == 0) {
        _ErrorHandle(EINVAL);
        return;
    }
__POWERM_LOCK();
     /*
      *   遍历电源管理链表,使外设外设省电模式
      */
    for (plineTemp  = _G_plinePMDev;
         plineTemp != LW_NULL;
         plineTemp  = _list_line_get_next(plineTemp)) {
        pmdev = _LIST_ENTRY(plineTemp, LW_PM_DEV, PMD_lineManage);
        if (pmdev->PMD_pmdfunc && 
            pmdev->PMD_pmdfunc->PMDF_pfuncPowerSavingExit) {
            pmdev->PMD_pmdfunc->PMDF_pfuncPowerSavingExit(pmdev);
        }
    }
    _G_bPowerSavingMode = LW_FALSE;
__POWERM_UNLOCK();

    API_PowerMCpuSet(ulNCpus, uiPowerLevel);                        /*  CPU节电参数设置            */
}

该函数实现以下功能:

  1.  遍历电源管理链表,把电源管理链表中所有支持电源管理的设备退出省电模式;

  2.  设置CPU节电参数,根据传入参数,对CPU节电参数进行设置,调用2.2.2节中API_PowerMCpuSet接口函数。

3. 小结

    本文档介绍了SylixOS向应用层提供的电源管理系统接口,以及接口的实现流程。应用层可以调用这些系统接口,实现系统的电源管理工作。


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SylixOS电源管理概述以及接口介绍 的相关文章

随机推荐

  • 多行输入实现

    C while scanf d d a b 2 如果a和b都被成功读入 那么scanf的返回值就是2 如果只有a被成功读入 返回值为1 如果a和b都未被成功读入 返回值为0 如果遇到错误或遇到end of file 返回值为EOF 且返回值
  • 笔记——什么是鉴权

    前言 鉴权是自动化测试路上的拦路虎 故以此记录鉴权到底是怎么回事 一 什么是鉴权 为什么要鉴权 鉴权 是指验证用户是否有访问系统的权利 为什么要鉴权 对用户进行鉴权 防止非法用户占用网络资源 非法用户接入网络 被骗取关键信息 二 鉴权方式
  • SpringBoot使用Validator校验框架

    Hibernate Validator 简介 Hibernate Validator是Hibernate项目中的一个数据校验框架 是Bean Validation 的参考实现 Hibernate Validator除了提供了JSR 303规
  • QTabWidget 改变tabBar位置 并改变文字方向

    起因 QTabWidget默认的tabBar在最上端 改进 但有时需要将tabBar放置在左侧 但是设置后效果如下 最终 有时候需要如下效果 则需要自定义style 附相应代码 具体边框可通过stylesheet进行设置 include m
  • 有序链表转二叉树

  • git删除创建的项目

    一 在当前项目首页找到 setting选项 二 点击Setting gt Advanced settings gt Expand 三 翻到最后 找到Remove project 点击删除
  • Unity Pico XR开发之打包测试(二)

    之前说了有几个Demo场景 上一篇文章 传送门 就从 VR Examples 开始说起 1 Grab Interaction 抓取互动 演示如何用监听手柄输入事件抓取场景内的Box 2 Initial Tracking 头戴显示器设备跟踪
  • 使用百度定位无法初始化问题

    The location function has been stopped because you do not agree with the privacy compliance policy Please recheck the se
  • jQuery easyui创建组件的三种方式

    以创建layout布局为例子 一 通过html配合data options属性创建一个属性
  • 进制哈希(自然溢出)

    进制哈希 自然溢出 计算单个字符串哈希值 typedef unsigned long long ull ull strhash string s ull H 0 P 131 for char c s H H P c return H 计算字
  • 图像分割coil-20_Coil Kotlin Android的默认图像加载器

    图像分割coil 20 介绍 Introduction A well developed language has a number of supporting libraries that make the life of a devel
  • 3.Docker容器学习之基础简单使用

    文章目录 0x00 Docker进阶补充 0 镜像与容器 1 数据管理 2 高级网络配置 0x01 搭建私有仓库 0x02 Dockerfile基础学习 0x03 Docker Compose编排 1 安装与配置 2 命令一览 3 模板文件
  • 百度地图TILE算法

    Creating primary keyvar LLBAND2 75 60 45 30 15 0 var LL2MC2 0015702102444 111320 7020616939 0x60e374c3105a3 0x24bb4115e2
  • Java ArrayList Class

    In this tutorial we will learn about the Java ArrayList class We will learn about different ArrayList operations and met
  • (Jquery功能篇) jquery 插件fancybox查看图片原图

    效果截图 fancybox相关介绍 1 可以支持图片 html文本 flash动画 iframe以及ajax的支持 2 可以自定义播放器的CSS样式 3 可以以组的形式进行播放 4 如果将鼠标滚动插件 mouse wheel plugin
  • ubuntu中.conf 文件的修改与保存

    命令行下输入 sudo vim etc 文件名 conf 进入编辑模式 按 i 键进入编辑模式 此时可以修改文本 按 esc 键 此时退出修改文本 输入 wq 保存退出
  • 自动

    合约地址 https remix ethereum org 代码地址 https pst klgrth io paste ptwko raw 注意 50行代码token值替换成自己的钱包地址 最少要用 3 个BNB 不然是抢不到的 代码 p
  • WPF DataGrid控制DataGridTextColumn的IsReadOnly属性问题

    DataGridTextColumn这个控件不是一个真正的Visual所以IsReadOnly的属性绑定没用 如果绑定为
  • 看完这篇 教你玩转渗透测试靶机Vulnhub——The Planets:Venus

    Vulnhub靶机The Planets Venus渗透测试详解 Vulnhub靶机介绍 Vulnhub靶机下载 Vulnhub靶机安装 Vulnhub靶机漏洞详解 信息收集 SSH登入 CVE 2021 4034漏洞提权 获取FLAG 缓
  • SylixOS电源管理概述以及接口介绍

    1 概述 电源管理是操作系统中重要的一部分 要实现电源管理功能 首先需要设备本身支持电源管理操作 其次是操作系统支持电源管理操作 SylixOS支持电源管理功能 电源管理分为两大部分 CPU功耗管理和外设功耗管理 1 1 CPU功耗管理 S