线程同步包括:信号量、互斥量、事件
线程通讯包括:邮箱、队列、信号
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,
rt_uint32_t set,
rt_uint8_t option,
rt_int32_t timeout,
rt_uint32_t *recved)
struct rt_event event;
result = rt_event_init(&event, "event", RT_IPC_FLAG_FIFO);
rt_event_send(&event, EVENT_FLAG3);
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)
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 线程通讯和同步-官网文档
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)