多语言展示
当前在线:1954今日阅读:39今日分享:10

z-stack如何进入休眠

如何让z-stack进入休眠状态
工具/原料

IAR CC2530

方法/步骤
1

添加预编译选项POWER_SAVING改-DRFD_RCVC_ALWAYS_ON=FALSE//改成fault-DPOLL_RATE=0   //必须改成0,不然会出现闪烁,因为协议栈会按照这里数值进行周期性做某件事

2

osal_pwrmgr_device(PWRMGR_BATTERY);//任务中调用,例如任务初始化的时候,可以让Z-STACK进入休眠这个功能,因为协议栈默认不能进入休眠功能的协议栈默认为PWRMGR_ALWAYS_ON选项,不能够进入休眠,需要调用上面函数改变这个默认值,让其能够进入休眠模式,可以看到下面osal_pwrmgr_powerconserve函数中有条件判断语句if ( pwrmgr_attribute.pwrmgr_device != PWRMGR_ALWAYS_ON )

3

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中没有事件了,那么就可以让协议栈进入休眠状态了

4

以上设置完成之后,就调用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是深度睡眠,只能够硬件中断唤醒

推荐信息