RT-Thread waitqueue等待队列的简单调用

文章目录


关键字:rtt waitqueue 等待队列

waitqueue和workqueue名字看上去有点像,但是这两个是完全不同的东西,workqueue工作队列强调的是work,waitqueue等待队列强调的是wait等待/阻塞,workqueue是将事务延迟处理,而waitqueu是等待条件满足/唤醒,功能是不一样的,不要混淆了。RTT和linux上的wait queue功能差不多,只不过实现方式不一样。

这里需要先介绍一下阻塞和不阻塞。
阻塞:我们获取不到资源时,让改线程进入睡眠状态。不阻塞:我们获取不到资源时,直接放回。
例如,如果我们使用read去读串口数据,如果不阻塞的话,即使没有数据也会返回,如果是阻塞模式,读取不到则线程进入睡眠。如果不阻塞去读取多个字节,那么就需要循环去判断是否读取成功,比较消耗资源。阻塞的话,在获取不到时可以将cpu让给其他线程。

等待队列的功能看上去和信号量有点像,在linux中,信号量就是用等待队列实现的。等待队列主要不同是在rt_wqueue_wait时需要判断条件,条件不成立才会进去wait状态。

实例

waitqueue在pipe中有调用,可以参考。等待队列的使用也比较简单,要注意condition为false才会阻塞。


#include <ipc/waitqueue.h>

rt_wqueue_t wqueue;

int waitqueue_test(void)
{
    int res;
    
    //void rt_wqueue_init(rt_wqueue_t *queue)
    rt_wqueue_init(&wqueue);
    
    rt_kprintf("wait. tick : %ld\n", rt_tick_get());
    
    //int  rt_wqueue_wait(rt_wqueue_t *queue, int condition, int timeout);
    //这里需要condition为false,或者timeout不为0时,才会阻塞。
    res = rt_wqueue_wait(&wqueue, 0, RT_WAITING_FOREVER);
    rt_kprintf("wqueue res : %d. tick : %ld\n", res, rt_tick_get());
    
    return res;
}

void wq_wakeup(void)
{
    int key = 0xaa;
    //void rt_wqueue_wakeup(rt_wqueue_t *queue, void *key);
    rt_wqueue_wakeup(&wqueue, &key);
     rt_kprintf("rt_wqueue_wakeup. tick : %ld\n", rt_tick_get());
}
MSH_CMD_EXPORT(wq_wakeup, wq_wakeup)

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值