RT-THREAD 线程同步与通讯:信号量、互斥量、事件、邮箱、队列、信号

线程同步包括:信号量、互斥量、事件
线程通讯包括:邮箱、队列、信号
rt-thread源文件说明:
ipc.c:信号量(sem)、互斥信号(mutex)、事件(event)、邮箱(mb)、消息队列(mq)、
signal.c:软中断(signal)

在这里插入图片描述

通讯方式说明生活场景类比函数原型: 获取 / 释放
信号量(sem)有限资源的使用数量控制停车场-车位rt_sem_take() / rt_sem_release()
互斥量(mutex)信号量+锁=优先级反转篮球运动-球权rt_mutex_take() / rt_mutex_release()
事件(event)事件告知,及事件触发机制。一对多 多对多,
逻辑方式:与; 或; 清除;
flag
新闻
rt_event_send() / rt_event_recv()
邮箱(mb)4字节数据,可以是变量或者指针
功能和消息队列重复,ucosiii邮箱取消
rt_mb_send() / rt_mb_recv()
消息队列(mq)邮箱的扩展,异步通讯,先进先出rt_mq_send() / rt_mq_recv()
信号(signal)信号本质是软中断,用来通知线程发生了异步事件。
用做线程之间的异常通知、应急处理。
线程不必等待信号的到达,也不知道信号什么时候到达.
紧急事件rt_thread_kill() / handler()

示例说明
1 事件

rt_err_t rt_event_recv(rt_event_t   event,	//event name
                       rt_uint32_t  set,	//flag 事件集合,每一 bit 表示 1 个事件,bit 位的值可以标记某事件是否发生
                       rt_uint8_t   option,	//RT_EVENT_FLAG_AND  RT_EVENT_FLAG_OR  RT_EVENT_FLAG_CLEAR
                       rt_int32_t   timeout,//RT_WAITING_FOREVER
                       rt_uint32_t *recved)//recved the received event, if you don't care, RT_NULL can be set.
                       
/*事件申明和初始化*/
struct rt_event event;
result = rt_event_init(&event, "event", RT_IPC_FLAG_FIFO);// RT_IPC_FLAG_FIFO 或 RT_IPC_FLAG_PRIO 先进先出 or 优先级

 /* 产生事件 */
rt_event_send(&event, EVENT_FLAG3);

 /* 事件 3 或事件 5 任意一个可以触发,接收完后清除事件标志 */
 rt_uint32_t e;  //用来接收显示目前时间
if (rt_event_recv(&event, (EVENT_FLAG3 | EVENT_FLAG5),
                  RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR,
                  RT_WAITING_FOREVER, &e) == RT_EOK)
                  
/* 事件 3 和事件 5 均发生时才可以触发线程 1,接收完后清除事件标志 */
if (rt_event_recv(&event, (EVENT_FLAG3 | EVENT_FLAG5),
                  RT_EVENT_FLAG_AND | RT_EVENT_FLAG_CLEAR,
                  RT_WAITING_FOREVER, &e) == RT_EOK)            

RT-Thread 线程通讯和同步-官网文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值