Skip to content

Commit 7dc540c

Browse files
committed
删除rt_schedule(); 在rt_enter_critical作用域下,无效退出作用域自动调用rt_schedule(); --- 修复时钟溢出
1 parent 7327fb9 commit 7dc540c

File tree

1 file changed

+7
-9
lines changed

1 file changed

+7
-9
lines changed

src/thread.c

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -647,9 +647,6 @@ static rt_err_t _thread_sleep(rt_tick_t tick)
647647

648648
thread->error = -RT_EINTR;
649649

650-
/* notify a pending rescheduling */
651-
rt_schedule();
652-
653650
/* exit critical and do a rescheduling */
654651
rt_exit_critical_safe(critical_level);
655652

@@ -692,7 +689,6 @@ RTM_EXPORT(rt_thread_delay);
692689
rt_err_t rt_thread_delay_until(rt_tick_t *tick, rt_tick_t inc_tick)
693690
{
694691
struct rt_thread *thread;
695-
rt_tick_t cur_tick;
696692
rt_base_t critical_level;
697693

698694
RT_ASSERT(tick != RT_NULL);
@@ -708,13 +704,15 @@ rt_err_t rt_thread_delay_until(rt_tick_t *tick, rt_tick_t inc_tick)
708704
/* disable interrupt */
709705
critical_level = rt_enter_critical();
710706

711-
cur_tick = rt_tick_get();
712-
if (cur_tick - *tick < inc_tick)
707+
if (rt_tick_get_delta(*tick) < inc_tick)
713708
{
714709
rt_tick_t left_tick;
710+
rt_tick_t target_tick;
711+
target_tick = *tick + inc_tick;
712+
left_tick = target_tick - rt_tick_get();
715713

716-
*tick += inc_tick;
717-
left_tick = *tick - cur_tick;
714+
if (left_tick > target_tick)
715+
left_tick = RT_TICK_MAX - left_tick + 1;
718716

719717
/* suspend thread */
720718
rt_thread_suspend_with_flag(thread, RT_UNINTERRUPTIBLE);
@@ -735,7 +733,7 @@ rt_err_t rt_thread_delay_until(rt_tick_t *tick, rt_tick_t inc_tick)
735733
}
736734
else
737735
{
738-
*tick = cur_tick;
736+
*tick = rt_tick_get();
739737
rt_exit_critical_safe(critical_level);
740738
}
741739

0 commit comments

Comments
 (0)