事件
优质
小牛编辑
135浏览
2023-12-01
事件接口
结构体 | |
struct | rt_event |
事件控制块 更多... | |
宏定义 | |
#define | RT_EVENT_FLAG_AND 0x01 |
逻辑与参数 | |
#define | RT_EVENT_FLAG_OR 0x02 |
逻辑或参数 | |
#define | RT_EVENT_FLAG_CLEAR 0x04 |
清除参数 | |
类型定义 | |
typedef struct rt_event * | rt_event_t |
事件类型指针定义 | |
函数 | |
rt_err_t | rt_event_init (rt_event_t event, const char *name, rt_uint8_t flag) |
初始化事件集 | |
rt_err_t | rt_event_detach (rt_event_t event) |
脱离事件集 | |
rt_event_t | rt_event_create (const char *name, rt_uint8_t flag) |
创建事件集 | |
rt_err_t | rt_event_delete (rt_event_t event) |
删除事件集 | |
rt_err_t | rt_event_send (rt_event_t event, rt_uint32_t set) |
发送事件 | |
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) |
接收事件 | |
详细描述
事件接口
事件主要用于线程间的同步,与信号量不同,它的特点是可以实现一对多,多对多的同步。 事件另外一个特性是,接收线程可等待多种事件,即多个事件对应一个线程或多个线程。 同时按照线程等待的参数,可选择是 “逻辑或” 触发还是 “逻辑与” 触发。
RT-Thread 定义的事件有以下特点:
- 事件只与线程相关,事件间相互独立:每个线程拥有 32 个事件标志,采用一个 32 bit 无符号整型数进行记录,每一个 bit 代表一个事件。若干个事件构成一个事件集;
- 事件仅用于同步,不提供数据传输功能;
- 事件无排队性,即多次向线程发送同一事件 (如果线程还未来得及读走),其效果等同于只 发送一次。
函数说明
rt_err_t rt_event_init | ( | rt_event_t | event, |
const char * | name, | ||
rt_uint8_t | flag | ||
) |
初始化事件集
该函数将初始化事件集对象,并加入到系统对象容器中进行管理。
- 参数
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 | ) |
脱离事件集
该函数将把一个事件从内核管理器中脱离
- 参数
event 事件对象的句柄
- 返回
- RT_EOK
rt_event_t rt_event_create | ( | const char * | name, |
rt_uint8_t | flag | ||
) |
创建事件集
调用该函数接口时,系统会从对象管理器中分配事件对象,然后进行对象的初始化, 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() 创建的事件集对象时,通过调用该函数删除事件集对象 控制块来释放系统资源。
- 参数
event 事件集对象的句柄
- 返回
- RT_EOK
rt_err_t rt_event_send | ( | rt_event_t | event, |
rt_uint32_t | set | ||
) |
发送事件
使用该函数接口时,通过参数 set 指定的事件标志来设定 event 事件集对象的事件标志值, 然后遍历等待在event事件集对象上的等待线程链表,判断是否有线程的事件激活要求与当前 event对象事件标志值匹配,如果有,则唤醒该线程。
- 参数
event 事件集对象的句柄 set 发送的一个或多个事件的标志值
- 返回
- RT_EOK
- 示例:
- event_sample.c.
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 | ||
) |
接收事件
当用户调用这个接口时,系统首先根据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.