rt-thread中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线程中执行。

参考资料:

特别感谢:@Sanjay_Wu

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值