调试中遇到软定时器无法正常结束的问题,现象如下:
1、创建好软件定时器
osTimerDef(KeyTimer, APP_KeyProcess);
Timer_Key_Handle = osTimerCreate(osTimer(KeyTimer), osTimerPeriodic, NULL);
2、按键中断出发时,启动定时器(20 ms)
osTimerStart(Timer_Key_Handle, 20);
3、回调函数中关闭定时器
void APP_KeyProcess(void const* argument)
{
osTimerStop(Timer_Key_Handle);
}
问题:发现在这个逻辑过程中,有时会出现无法停止定时器的情况
调试定位,发现在osTimerStop执行结束前,xTimerQueue会收到一个0x00(restart定时器的命令),会导致
先执行tmrCOMMAND_START_DONT_TRACE ---》 调用回调函数 --》osStop(增加0x03到xTimerQueue) ---》 执行xTimerGenericCommand修改周期(增加0x00到xTimerQueue)---》然后才轮到设计目标的那次(第一次回调函数目的)tmrCOMMAND_STOP
此时命令序列里已经因上面的逻辑又新增了的xTimerQue信息,导致一直循环,无法真正停止该定时器 |