OSAL 之功耗管理

来源:互联网 发布:c语言简单程序100例 编辑:程序博客网 时间:2024/06/05 17:04
                    尊重原创,转载请注明:

基于蓝牙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_BATTERY  if ( 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 );    }  }}
0 0
原创粉丝点击