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又去睡觉了,睡觉的时间为按键的消抖时间?