尊重原创,转载请注明:

基于蓝牙4.0,协议栈版本是1.3.2
在OSAL中的OSAL_PwrMgr.c与OSAL_PwrMgr.h两个文件实现对功耗的控制。

首先是功耗管理的结构体定义

typedef struct
{uint16 pwrmgr_task_state;   //是否进入节能模式uint16 pwrmgr_next_timeout; //记录软件定时器中下次超时的最短一个时间uint16 accumulated_sleep_time;  //记录累计睡眠多少时间uint8  pwrmgr_device;   //记录现在设备供电的类型
} pwrmgr_attribute_t;

pwrmgr_task_statebit0~bit15分别对应着16个任务的功耗状态,如果某一位为0,则它对应的任务进入节电模式。
pwrmgr_next_timeout记录着最短的超时时间,从定时器管理列表获得,在这段时间内,系统处于空闲状态,所以pwrmgr_next_timeout实际上是记录当次系统睡眠的时间。
accumulated_sleep_time则记录这系统累计睡眠时间。
pwrmgr_device则标明系统的供电设备,有两种:一种是正常供电另外一种是电池供电。一般正常供电下不需要也没有必要控制功耗,只有电池供电是,功耗的控制才有意义。
另外定义了一个对应的变量用于存储功耗管理结构体类型变量
pwrmgr_attribute_t pwrmgr_attribute;

一些宏的定义

2、设定任务功耗状态的宏

#define PWRMGR_CONSERVE 0

#define PWRMGR_HOLD 1

其中PWRMGR_CONSERVE表示进入节电模式,而PWRMGR_HOLD则关闭节电模式。
3、设备供电方式的设定宏

#define PWRMGR_ALWAYS_ON 0

#define PWRMGR_BATTERY 1

其中PWRMGR_ALWAYS_ON表示正常供电,PWRMGR_BATTERY表示使用电池供电。

功耗API函数

void osal_pwrmgr_init( void )

函数对芯片的设备供电方式,任务是否能进入节能模式进行设置;默认是正常供电模式,所有的任务都可以进入节能模式。

void osal_pwrmgr_init( void )
{pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON; // Default to no power conservation.pwrmgr_attribute.pwrmgr_task_state = 0;            // Cleared.  All set to conserve
}

void osal_pwrmgr_device( uint8 pwrmgr_device )

函数设置功耗管理系统设备的供电方式
参数: pwrmgr_device 可为下面宏的其中一个

#define PWRMGR_ALWAYS_ON 0

#define PWRMGR_BATTERY 1

其中PWRMGR_ALWAYS_ON表示正常供电,PWRMGR_BATTERY表示使用电池供电。

void osal_pwrmgr_device( uint8 pwrmgr_device )
{pwrmgr_attribute.pwrmgr_device = pwrmgr_device;
}

uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state )

函数被每个任务调用以设定每个任务的功耗模式

uint8 osal_pwrmgr_task_state( uint8 task_id, uint8 state )
{if ( task_id >= tasksCnt )return ( INVALID_TASK );if ( state == PWRMGR_CONSERVE ){// Clear the task state flag,清零相应任务位以进入节能模式pwrmgr_attribute.pwrmgr_task_state &= ~(1 << task_id );//这里说明只能设置16个任务,每一位设定对应一个任务的功耗模式}else{// Set the task state flag退出节电模式pwrmgr_attribute.pwrmgr_task_state |= (1 << task_id);}return ( SUCCESS );
}

void osal_pwrmgr_powerconserve( void )

该函数只能由OSAL主循环调用而不能再其它地方调用,当没有预定的任务执行的时候,执行该函数使系统进入睡眠模式。

void osal_pwrmgr_powerconserve( void )
{uint32        next;halIntState_t intState;// Should we even look into power conservation设备要处于非正常供电情况下,即处于PWRMGR_BATTERYif ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON ){// Are all tasks in agreement to conserve所有任务都要允许进入节电模式if ( pwrmgr_attribute.pwrmgr_task_state == 0 ){// Hold off interrupts.HAL_ENTER_CRITICAL_SECTION( intState );// Get next time-out获得下次超时的时间next = osal_next_timeout();// Re-enable interrupts.HAL_EXIT_CRITICAL_SECTION( intState );// Put the processor into sleep mode进入睡眠模式OSAL_SET_CPU_INTO_SLEEP( next );}}
}

OSAL 之功耗管理相关推荐

  1. SylixOS电源管理之外设功耗管理

    1.前言 在这个世界中,任何系统的运转都需要能量.如树木依靠光能生长,如马儿依靠食物奔跑,如计算机系统依靠电能运行.而能量的获取是有成本的,因此如果能在保证系统运转的基础上,尽量节省对能量的消耗,就会 ...

  2. 指南-Luat二次开发教程指南-功能开发教程-功耗管理

    目录 功耗管理 简介 常用模块功耗指标 API说明 3种工作模式: 1. 全功能模式 2. 休眠模式 3. 最少功能模式 实现流程 全功能模式 休眠模式 最少功能模式 示例 全功能模式 休眠模式 最少 ...

  3. STM8S---电源功耗管理之停机模式(halt)实现

    官方资料   可以去网络搜索中文版,或者到官方网站上去下载英文版.   英文:   译文: 主要内容简介 影响功耗的主要因素 电源系统 时钟管理 运行模式和低功耗模式 运行模式 等待模式 活跃停机模式 ...

  4. S32K144功耗管理与系统模式控制

    S32K144功耗管理与系统模式控制 1.引言 S32K144是一款NXP以Cortex M4为内核的32位汽车通用芯片,本文主要介绍该芯片的功耗管理与系统模式控制相关内容,如低功耗等运行模式.参考文 ...

  5. cortex-R52 CPU的功耗管理之power gating(电源门控)

    最近在看CORTEX-R52文档时,了解了一下该处理器功耗管理相关的内容,这里记录一下power gating的部分,并加上一些自己的理解. 1.概述 power gating是一种直接关闭芯片上某一 ...

  6. OSAL之时间管理,软件定时器链表管理

    读源码写作,尊重原创: 本博文根据蓝牙4.0, 协议族版本是1.3.2 本博文分两大块.一部分是时间管理,另一部分是软件定时器管理. OSAL的时钟实现在OSAL_CockBLE.c与OSAL_Clo ...

  7. PCIe功耗管理(三)ASPM机制

    通常情况下,处于D0状态的设备会保持其Upstream链路处于L0状态:而ASPM为D0状态定义了一种协议,可以将链路置于低功耗状态,同时指示另一端同样及那个第功耗.ASPM可以动态降低链路功耗,实现 ...

  8. Linux功耗管理(19)_Linux cpuidle framework(2)_cpuidle core

    1. 前言 cpuidle core是cpuidle framework的核心模块,负责抽象出cpuidle device.cpuidle driver和cpuidle governor三个实体,并提 ...

  9. WiFi功耗管理(三)(U-APSD)

    ADDTS是ADD Traffic Stream的缩写,是一种属于Qos Category的管理帧. Traffic Stream是传输流,具体而言,是流的属性是什么?速率,带宽,延时要求,因此它体现 ...

最新文章

  1. 推荐一款学习R的APP
  2. java日志统计_Java实现蓝桥杯日志统计
  3. Schema initialization FAILED! Metastore state would be inconsistent !!
  4. CentOS经常使用文件操作命令[百度博客搬家]
  5. LeetCode 433. 最小基因变化(广度优先搜索)
  6. 如何获取STM32 MCU的唯一ID
  7. display属性_Numpy知识点(1)讲解实操安装/属性/数组创建/运算
  8. JavaScript代码规范和性能整理
  9. 关于在linux系统下卸载软件的问题
  10. 2019年上海春运志愿服务启动 3000余名志愿者守护归乡路
  11. 403保护网站服务器,HTML5服务器禁止访问403错误动画
  12. 基于Java毕业设计新能源汽车租赁管理系统源码+系统+mysql+lw文档+部署软件
  13. VBA引用管理加载宏
  14. Localhost到底是干什么用的?
  15. 贪心算法 | 神秘电报密码——哈夫曼编码
  16. 使用Math.max和Math.min求数组的最大值和最小值
  17. Eureka Server的REST端点
  18. HDU 1019 Least Common Multiple-数论(最小公倍数)
  19. 小米盒子3s刷机为国际版系统android TV 8.0
  20. transform matrix3d

热门文章

  1. 在计算机英语中input的意思,input是什么意思
  2. org.springframework.jdbc.BadSqlGrammarException: Error updating database
  3. Genymotion 自配 AndoidSDK 一直Booting
  4. python按日期爬取b站弹幕 2.0版
  5. [Alg]排序算法之分布排序
  6. WIN7 安装 SQL2000
  7. 我的世界服务器显示披风指令,我的世界电脑披风指令 | 手游网游页游攻略大全...
  8. PLC 工程师必备知识 — IO模块选型和使用(下篇)
  9. 函数:判断一个整数是否既是5又是7的整倍数
  10. 3D目标检测——代码理解——Second代码:数据处理kitti_dataset.py的理解