IAR CC2530
添加预编译选项POWER_SAVING改-DRFD_RCVC_ALWAYS_ON=FALSE//改成fault-DPOLL_RATE=0 //必须改成0,不然会出现闪烁,因为协议栈会按照这里数值进行周期性做某件事
osal_pwrmgr_device(PWRMGR_BATTERY);//任务中调用,例如任务初始化的时候,可以让Z-STACK进入休眠这个功能,因为协议栈默认不能进入休眠功能的协议栈默认为PWRMGR_ALWAYS_ON选项,不能够进入休眠,需要调用上面函数改变这个默认值,让其能够进入休眠模式,可以看到下面osal_pwrmgr_powerconserve函数中有条件判断语句if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON )
osal_pwrmgr_task_state(GenericApp_TaskID,1);//标志位,不能够休眠,任务中巧妙使用,因为协议栈会查pwrmgr_task_state这个标志位,如果全部为零则协议栈可以进入休眠,如果设置了对应任务ID对应位为1,则会阻止协议栈进入休眠,前提是pwrmgr_device = PWRMGR_BATTERY允许协议栈进入休眠的条件void osal_pwrmgr_powerconserve( void ){ uint16 next; halIntState_t intState; // Should we even look into power conservation 初始化已经设定为不能休眠的模式PWRMGR_ALWAYS_ON 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 获取下一次MAC定时器到期时间 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_pwrmgr_task_state(GenericApp_TaskID,0);则是去掉相应任务相应的pwrmgr_task_state标志位为0如果pwrmgr_task_state==0的话,而协议栈Z-STACK中没有事件了,那么就可以让协议栈进入休眠状态了
以上设置完成之后,就调用osal_start_timerEx( GenericApp_TaskID, GENERICAPP_WAITUP_EVT, GENERICAPP_SEND_MSG_TIMEOUT );//调用其进入休眠函数让协议栈进入休眠,PM_2休眠,如果想让协议栈不进入PM_2休眠的话,不要调用这个函数,然后协议栈检测到没有事件并且 if ( pwrmgr_attribute.pwrmgr_task_state == 0 )条件成立时,就会进入PM_3,否则进入PM_2休眠模式,PM_2是定时器唤醒的休眠,PM_3是深度睡眠,只能够硬件中断唤醒