summaryrefslogtreecommitdiff
path: root/src/clock.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/clock.c')
-rw-r--r--src/clock.c20
1 files changed, 14 insertions, 6 deletions
diff --git a/src/clock.c b/src/clock.c
index 0880d8d241..77516b3775 100644
--- a/src/clock.c
+++ b/src/clock.c
@@ -13,7 +13,8 @@
* 2010-07-13 Bernard fix rt_tick_from_millisecond issue found by kuronca
* 2011-06-26 Bernard add rt_tick_set function.
* 2018-11-22 Jesven add per cpu tick
- * 2020-12-29 Meco Man add function rt_tick_get_millisecond()
+ * 2020-12-29 Meco Man implement rt_tick_get_millisecond()
+ * 2021-06-01 Meco Man add critical section projection for rt_tick_increase()
*/
#include <rthw.h>
@@ -22,8 +23,8 @@
#ifdef RT_USING_SMP
#define rt_tick rt_cpu_index(0)->tick
#else
-static rt_tick_t rt_tick = 0;
-#endif
+static volatile rt_tick_t rt_tick = 0;
+#endif /* RT_USING_SMP */
/**
* @addtogroup Clock
@@ -62,13 +63,16 @@ void rt_tick_set(rt_tick_t tick)
void rt_tick_increase(void)
{
struct rt_thread *thread;
+ rt_base_t level;
+
+ level = rt_hw_interrupt_disable();
/* increase the global tick */
#ifdef RT_USING_SMP
rt_cpu_self()->tick ++;
#else
++ rt_tick;
-#endif
+#endif /* RT_USING_SMP */
/* check time slice */
thread = rt_thread_self();
@@ -78,11 +82,15 @@ void rt_tick_increase(void)
{
/* change to initialized tick */
thread->remaining_tick = thread->init_tick;
-
thread->stat |= RT_THREAD_STAT_YIELD;
+ rt_hw_interrupt_enable(level);
rt_schedule();
}
+ else
+ {
+ rt_hw_interrupt_enable(level);
+ }
/* check timer */
rt_timer_check();
@@ -130,7 +138,7 @@ RT_WEAK rt_tick_t rt_tick_get_millisecond(void)
#warning "rt-thread cannot provide a correct 1ms-based tick any longer,\
please redefine this function in another file by using a high-precision hard-timer."
return 0;
-#endif
+#endif /* 1000 % RT_TICK_PER_SECOND == 0u */
}
/**@}*/