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_state的bit0~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 ); } }}
- OSAL 之功耗管理
- OSAL之任务管理
- OSAL之消息管理
- OSAL机制的ZigBee低功耗管理(CC2530)
- OSAL机制的ZigBee低功耗管理(CC2530)
- zigbee学习笔记--电源管理OSAL机制的ZigBee低功耗管理(CC2530)
- zigbee学习笔记--电源管理OSAL机制的ZigBee低功耗管理(CC2530)
- zigbee--电源管理OSAL机制的z-statk低功耗管理(CC2530)
- OSAL之时间管理,软件定时器链表管理
- OSAL内存管理
- BLE 协议栈之低功耗管理
- OSAL之任务同步
- OSAL之按键驱动
- 【转】OSAL内存管理0
- 【转】OSAL内存管理1
- 转】OSAL内存管理2
- 【转】OSAL内存管理3
- 实测CC2530 OSAL睡眠唤醒时间、电流、功耗
- android broadcast
- 关于学生成绩管理的小程序 -- 一个菜鸟
- substr 和subString 的用法及区别
- NTP configure 时间服务器
- 人脸识别(简单代码)
- OSAL 之功耗管理
- 计算子网掩码和子网个数以及最大主机数?
- MySQL创建用户与授权方法
- dhcpv4 test env building
- 选择排序
- 子线程循环10次,紧接着主线程循环100次,来回50次
- nginx 防盗链+动静分离+反向代理+缓存+负载均衡
- spring定时任务
- 理解B+树算法和Innodb索引