TI中文支持网
TI专业的中文技术问题搜集分享网站

休眠时的时候产生中断后,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_0PxIFG 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又去睡觉了,睡觉的时间为按键的消抖时间?

YiKai Chen:

那么睡眠定时器会进入中断?—-> halProcessKeyInterrupt 已經是在中断了啊、只是啓动消抖timer event 等等來確認是按鍵有按下啊!

Lord Over:

回复 YiKai Chen:

测试了一下,会先进入IO中断,然后到PCON = 1的下一行。

YiKai Chen:

回复 Lord Over:

不大懂你的問題,可以具體一點,清楚一些的描述嗎?

Lord Over:

回复 YiKai Chen:

现在搞懂了,我其实就是想搞懂睡眠后的IO中断流程,在了解过程中发现在没有IO中断的时候,睡眠定时器超时进入不了睡眠中断服务程序,注释掉hal_sleep()函数中的 HAL_SLEEP_TIMER_CLEAR_INT();却可以正常进入中断,这就有点懵了。

YiKai Chen:

回复 Lord Over:

那還有什麼問題嗎?

赞(0)
未经允许不得转载:TI中文支持网 » 休眠时的时候产生中断后,Z-Stack的流程是怎样的?
分享到: 更多 (0)