소스 검색

解决关中断时进行了调度操作

zhkag 2 년 전
부모
커밋
4c1c6ef4e4
1개의 변경된 파일3개의 추가작업 그리고 2개의 파일을 삭제
  1. 3 2
      components/drivers/cputime/cputimer.c

+ 3 - 2
components/drivers/cputime/cputimer.c

@@ -337,6 +337,8 @@ rt_err_t rt_cputime_sleep(rt_uint64_t tick)
     /* current context checking */
     RT_DEBUG_SCHEDULER_AVAILABLE(RT_TRUE);
 
+    rt_cputimer_init(&cputimer, "cputime_sleep", _cputime_sleep_timeout, thread, 0, RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_SOFT_TIMER);
+
     /* disable interrupt */
     level = rt_hw_interrupt_disable();
 
@@ -349,7 +351,6 @@ rt_err_t rt_cputime_sleep(rt_uint64_t tick)
     /* reset the timeout of thread timer and start it */
     if (err == RT_EOK)
     {
-        rt_cputimer_init(&cputimer, "cputime_sleep", _cputime_sleep_timeout, thread, 0, RT_TIMER_FLAG_ONE_SHOT | RT_TIMER_FLAG_SOFT_TIMER);
         rt_cputimer_control(&cputimer, RT_TIMER_CTRL_SET_TIME, &tick);
         rt_cputimer_start(&cputimer);
 
@@ -359,7 +360,6 @@ rt_err_t rt_cputime_sleep(rt_uint64_t tick)
         thread->error = -RT_EINTR;
 
         rt_schedule();
-        rt_cputimer_detach(&cputimer);
         if (thread->error == -RT_ETIMEOUT)
             thread->error = RT_EOK;
     }
@@ -368,6 +368,7 @@ rt_err_t rt_cputime_sleep(rt_uint64_t tick)
         rt_hw_interrupt_enable(level);
     }
 
+    rt_cputimer_detach(&cputimer);
     return err;
 }