瀏覽代碼

fix timer re-start issue if stop a timer in itself timeout_func.

git-svn-id: https://rt-thread.googlecode.com/svn/trunk@107 bbd45198-f89e-11dd-88c7-29a3b14d5316
bernard.xiong 15 年之前
父節點
當前提交
39ff757705
共有 1 個文件被更改,包括 11 次插入4 次删除
  1. 11 4
      src/timer.c

+ 11 - 4
src/timer.c

@@ -270,6 +270,9 @@ rt_err_t rt_timer_stop(rt_timer_t timer)
 	/* disable interrupt */
 	level = rt_hw_interrupt_disable();
 
+	/* change stat */
+	timer->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED;
+
 	/* remove it from timer list */
 	rt_list_remove(&(timer->list));
 
@@ -361,14 +364,18 @@ void rt_timer_check()
 			rt_kprintf("current tick: %d\n", current_tick);
 #endif
 
-			/* change timer state */
-			t->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED;
-
-			if (t->parent.flag & RT_TIMER_FLAG_PERIODIC)
+			if ((t->parent.flag & RT_TIMER_FLAG_PERIODIC) && 
+				(t->parent.flag & RT_TIMER_FLAG_ACTIVATED))
 			{
 				/* start it */
+				t->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED;
 				rt_timer_start(t);
 			}
+			else
+			{
+				/* stop timer */
+				t->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED;
+			}
 		}
 		else break;
 	}