现象:
- 线程调用rt_thread_delay()会导致进入idle线程然后卡住的问题么,我看rt_thread_delay()似乎有这样
- https://www.rt-thread.org/qa/forum.php?mod=viewthread&tid=5274&highlight=rt\_thread\_delay
使线程睡眠原理
在实际应用中,我们有时需要让运行的当前线程延迟一段时间,在指定的时间到达后重新运行,这就叫做 “线程睡眠”。线程睡眠可使用以下三个函数接口:
rt_err_t rt_thread_sleep(rt_tick_t tick);
rt_err_t rt_thread_delay(rt_tick_t tick);
rt_err_t rt_thread_mdelay(rt_int32_t ms);
这三个函数接口的作用相同,调用它们可以使当前线程挂起一段指定的时间,当这个时间过后,线程会被唤醒并再次进入就绪状态。这个函数接受一个参数,该参数指定了线程的休眠时间。线程睡眠接口 rt_thread_sleep/delay/mdelay() 的参数和返回值见下表:
参数 | 描述 |
---|---|
tick/ms | 线程睡眠的时间: sleep/delay 的传入参数 tick 以 1 个 OS Tick 为单位 ; mdelay 的传入参数 ms 以 1ms 为单位; |
返回 | —— |
RT_EOK | 操作成功 |
原因分析:
@Sanjay_Wu
rt_thread_delay会导致当前线程进入阻塞,如果你只有主线程和idle线程,主线程阻塞了,那么就只有空闲线程在执行了,也就是你说的“卡死”,如果除了主线程,还有其他线程就绪,那么主线程阻塞就会执行就绪的线程,如果其他线程也是阻塞状态,那么还是会执行idle线程
@bernard
rt_thread_delay后,当前线性就进入阻塞状态;这个时候整个系统切换到其他线程运行,如果没有其他就绪线程,则最终进入到idle线程中执行。
参考资料:
- https://www.rt-thread.org/document/site/programming-manual/thread/thread/#_22
- https://www.rt-thread.org/qa/forum.php?mod=viewthread&tid=5274&extra=&ordertype=2
特别感谢:@Sanjay_Wu