详细描述
事件接口
事件主要用于线程间的同步,与信号量不同,它的特点是可以实现一对多,多对多的同步。 事件另外一个特性是,接收线程可等待多种事件,即多个事件对应一个线程或多个线程。 同时按照线程等待的参数,可选择是 “逻辑或” 触发还是 “逻辑与” 触发。
RT-Thread 定义的事件有以下特点:
事件只与线程相关,事件间相互独立:每个线程拥有 32 个事件标志,采用一个 32 bit 无符号整型数进行记录,每一个 bit 代表一个事件。若干个事件构成一个事件集;
事件仅用于同步,不提供数据传输功能;
事件无排队性,即多次向线程发送同一事件 (如果线程还未来得及读走),其效果等同于只 发送一次。
函数说明
初始化事件集
该函数将初始化事件集对象,并加入到系统对象容器中进行管理。
参数
event |
事件集对象的句柄 |
name |
事件集的名称 |
flag |
事件集的标志,它可以取值:RT_IPC_FLAG_FIFO或RT_IPC_FLAG_PRIO |
返回
RT_EOK
示例:
event_sample.c.
rt_err_t rt_event_detach |
( |
rt_event_t |
event |
) |
|
脱离事件集
该函数将把一个事件从内核管理器中脱离
参数
返回
RT_EOK
创建事件集
调用该函数接口时,系统会从对象管理器中分配事件对象,然后进行对象的初始化, IPC对象初始化,并把set设置成0。
参数
name |
事件集的名称 |
flag |
事件集的标志,它可以取值:RT_IPC_FLAG_FIFO或RT_IPC_FLAG_PRIO |
返回
返回创建的事件对象的句柄,创建失败返回 RT_NULL
rt_err_t rt_event_delete |
( |
rt_event_t |
event |
) |
|
删除事件集
系统不再使用rt_event_create() 创建的事件集对象时,通过调用该函数删除事件集对象 控制块来释放系统资源。
参数
返回
RT_EOK
发送事件
使用该函数接口时,通过参数 set 指定的事件标志来设定 event 事件集对象的事件标志值, 然后遍历等待在event事件集对象上的等待线程链表,判断是否有线程的事件激活要求与当前 event对象事件标志值匹配,如果有,则唤醒该线程。
参数
event |
事件集对象的句柄 |
set |
发送的一个或多个事件的标志值 |
返回
RT_EOK
示例:
event_sample.c.
接收事件
当用户调用这个接口时,系统首先根据set参数和接收选项option来判断它要接收的事件是否发生, 如果已经发生,则根据参数option上是否设置有 RT_EVENT_FLAG_CLEAR 来决定是否重置事件的相应 标志位,然后返回(其中recved参数返回收到的事件);如果没有发生,则把等待的set和option 参数填入线程本身的结构中,然后把线程挂起在此事件上,直到其等待的事件满足条件或等待时间 超过指定的超时时间。如果超时时间设置为零,则表示当线程要接受的事件没有满足其要求时就不 等待,而直接返回-RT_ETIMEOUT。
参数
event |
事件集对象的句柄 |
set |
接收线程感兴趣的事件 |
option |
接收选项,应设置接收选项RT_EVENT_FLAG_AND或RT_EVENT_FLAG_OR。 |
timeout |
指定超时时间 |
recved |
指向收到的事件,如果不感兴趣,可以设置为 RT_NULL。 |
返回
RT_EOK 成功;-RT_ETIMEOUT 超时;-RT_ERROR 错误
示例:
event_sample.c.
原作者:RT-Thread API参考手册
|