线程同步包括:信号量、互斥量、事件
线程通讯包括:邮箱、队列、信号
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)