This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

休眠时的时候产生中断后,Z-Stack的流程是怎样的?

Other Parts Discussed in Thread: Z-STACK

进入PM2时,P0口发生中断,Z-Stack的处理是在P0口的中断启动一个软件定时器,代码如下

HAL_ISR_FUNCTION( halKeyPort0Isr, P0INT_VECTOR )
{
  HAL_ENTER_ISR();

  if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)
  {
    halProcessKeyInterrupt();
  }

  /*
    Clear the CPU interrupt flag for Port_0
    PxIFG has to be cleared before PxIF
  */
  HAL_KEY_SW_6_PXIFG = 0;
  HAL_KEY_CPU_PORT_0_IF = 0;
  
  CLEAR_SLEEP_MODE();
  HAL_EXIT_ISR();
}

void halProcessKeyInterrupt (void)
{
  bool valid=FALSE;

  if (HAL_KEY_SW_6_PXIFG & HAL_KEY_SW_6_BIT)  /* Interrupt Flag has been set */
  {
    HAL_KEY_SW_6_PXIFG = ~(HAL_KEY_SW_6_BIT); /* Clear Interrupt Flag */
    valid = TRUE;
  }

  if (HAL_KEY_JOY_MOVE_PXIFG & HAL_KEY_JOY_MOVE_BIT)  /* Interrupt Flag has been set */
  {
    HAL_KEY_JOY_MOVE_PXIFG = ~(HAL_KEY_JOY_MOVE_BIT); /* Clear Interrupt Flag */
    valid = TRUE;
  }

  if (valid)
  {
    osal_start_timerEx (Hal_TaskID, HAL_KEY_EVENT, HAL_KEY_DEBOUNCE_VALUE);
  }
}

这里启动一个按键消抖事件,那么睡眠定时器会进入中断?此时睡眠定时器的计数值还没到达比较值哦,也会进入中断?

如果进入定时器中断,那么中断后是运行到下图划线的语句?

然后HalKeyExitSleep()使用读取一次键值?

//hal_sleep.c中的void halSleep()函数部分代码

#if ((defined HAL_KEY) && (HAL_KEY == TRUE))
        /* handle peripherals */
        if(HalKeyExitSleep())
        {
          break; 
        }
#endif

      } while(timeout != 0);

如果读取到按键按下则跳出睡眠循环,那么将会来到osal_run_system()

这函数包含了系统的主循环,这是去检测是否有事件需要执行,如果没有则

hal_sleep(next_timeout),那么OSAL又去睡觉了,睡觉的时间为按键的消抖时间?