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

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

RT-THREAD 线程同步与通讯:信号量、互斥量、事件、邮箱、队列、信号_第1张图片

通讯方式 说明 生活场景类比 函数原型: 获取 / 释放
信号量(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 线程通讯和同步-官网文档

你可能感兴趣的:(rt-thread)