TI大神:
小弟在测试PM2低功耗模式下,预想的是 每5s中,向外发送一次广播信息。广播信息后,保持1s的监听时间,然后再转入允许休眠的时间。周而复始的进行,使其能够降低功耗。
实现思路:创建两个事件,一个是广播发送事件,另一个是允许进入低功耗事件。在上电入网或者建立网络后,触发广播任务。广播发送事件的周期为持续工作事件,记为T1,允许进入低功耗的周期的事件为休眠时间,记为T2,那么,整个工作周期就为T1+T2。
代码流程如下:
if ( event & START_EVT )
{
//发送广播信息 ...
osal_pwrmgr_device( PWRMGR_ALWAYS_ON ); osal_pwrmgr_task_state(sapi_TaskID,PWRMGR_HOLD);
//确保在接下来的时间内,接收机是打开的
#define MAC_RECEIVE_ON 1
#define MAC_RECEIVE_OFF 0
uint8 value = MAC_RECEIVE_ON;
MAC_MlmeSetReq(MAC_RX_ON_WHEN_IDLE,&value);
osal_start_timerEx(sapi_TaskID,SLEEP_EVT,1000); //等待1s,在这1s内,接收机始终处于开启状态。
return event ^ START_EVT;
}
if ( event & SLEEP_EVT )
{
osal_pwrmgr_device( PWRMGR_BATTERY );
osal_pwrmgr_task_state(sapi_TaskID,PWRMGR_CONSERVE);
osal_start_timerEx( sapi_TaskID,START_EVT,4000); //允许进入休眠,4s后再次发送广播周期
return event ^ SLEEP_EVT;
}
以下的修改,在halSleep函数中。
1 在进入MAC层休眠之前,需要手动关闭MAC层接收机,相关代码为
uint8 value = MAC_RECEIVE_OFF;
MAC_MlmeSetReq(MAC_RX_ON_WHEN_IDLE,&value);
2.. 在针对路由器的低功耗中,终端的MAC休眠模式不能使用,应该改为使用MAC_PwrOffReq(MAC_PWR_SLEEP_LITE),轻度休眠模式。
只要经过上述这两点的修改,路由器模式下,也是可以进入低功耗的。至于在广播数据后,等待接收数据的时间与整个广播周期的比例,则取决于你应用场景所需要的休眠占空比。
如上面的框架代码:发送广播数据后1s内,保持接收机唤醒状态。1s后,允许当前任务进入低功耗,之后OSAL完成自己的事件处理,随机进入低功耗,在4s的时间内,会发生几次进入低功耗的情况,这是正常的。4s后,设备再次发送广播信息,周而复始重复上述操作。
采用上述的做法,可以使路由器节省一定的功耗(协调器在建立网络后,也是可以这样来实现的)。
上述是小弟在基于OSAL低功耗实现方面的摸索出来的一点心得体会,贡献出来,请大家点评,共同提高。