首页 资讯 应用 高压 设计 行业 低压 电路图 关于

嵌入式

旗下栏目: PLC 嵌入式 单片机 DCS

OSAL之功耗管理

嵌入式 | 发布时间:2017-10-04 | 人气: | #评论# |本文关键字:OSAL,功耗管理
摘要:OSAL 常用于 TI 自己的一些低功耗产品上,如 Zigbee 、蓝牙 BLE ,故 OSAL 还需要具备对功耗的管理能力。在 OSAL 中的 OSAL_PwrMgr.c 与 OSAL_PwrMgr.h 两个文件就实现了对功耗的控制。 1 、定义一个

OSAL常用于TI自己的一些低功耗产品上,如Zigbee、蓝牙BLE,故OSAL还需要具备对功耗的管理能力。在OSAL中的OSAL_PwrMgr.cOSAL_PwrMgr.h两个文件就实现了对功耗的控制。

1、定义一个功耗管理的结构:

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则标明系统的供电设备,有两种:一种是常供电,另外一种是电池供电。一般常供电下不需要也没有必要控制功耗,只有电池供电是,功耗的控制才有意义。

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表示使用电池供电。

4、定义一个变量用于存储功耗管理的属性

pwrmgr_attribute_t pwrmgr_attribute;

 

osal_pwrmgr_init() 初始化功耗管理系统

设置默认的功耗管理属性为常电源供电,允许全部任务进入节点模式。

pwrmgr_attribute.pwrmgr_device = PWRMGR_ALWAYS_ON;pwrmgr_attribute.pwrmgr_task_state = 0;


osal_pwrmgr_device() 设置供电设备

参数:

pwrmgr_device-供电设备

设置功耗管理属性:

pwrmgr_attribute.pwrmgr_device = pwrmgr_device;


osal_pwrmgr_task_state() 设置任务的功耗状态

参数:

task_id-任务的id

state-功耗状态

1、进入节点模式(state=PWRMGR_CONSERVE),则清除对应的状态位。

pwrmgr_attribute.pwrmgr_task_state &= ~(1 << task_id );

2、关闭节点模式(state=PWRMGR_HOLD),则设置对应的状态位

pwrmgr_attribute.pwrmgr_task_state |= (1 << task_id);

 

osal_pwrmgr_powerconserve() 系统进入睡眠

这个函数只能被osal_run_system()主循环函数调用,当没有任务收到事件,则调用这个函数让系统进入睡眠。

if (idx < tasksCnt){......}else{osal_pwrmgr_powerconserve();}

1、首先需要确保供电对按原不是常供电,而是电池供电

if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON )

2、在确保所有的任务状态都为允许进入节电模式

if ( pwrmgr_attribute.pwrmgr_task_state == 0 )

3、获取可以睡眠的时间,然后进入睡眠

HAL_ENTER_CRITICAL_SECTION( intState );/*进入临界段*/

next = osal_next_timeout();/*获取睡眠时间*/

HAL_EXIT_CRITICAL_SECTION( intState );/*退出睡眠时间*/

OSAL_SET_CPU_INTO_SLEEP( next );/*进入睡眠*/



责任编辑:电气自动化网

上一篇:OSAL之消息管理

下一篇:OSAL之缓冲管理

首页 | 资讯 | 应用 | 高压 | 设计 | 行业 | 低压 | 电路图 | 关于

Copyright 2017-2018 电气自动化网 版权所有 辽ICP备17010593号-1

电脑版 | 移动版

Ctrl+D 将本页面保存为书签,全面了解最新资讯,方便快捷。