事件
概述
事件标志组是一种实现任务间通信的机制,可用于实现任务间的同步。事件标志组采用位来 表示一个事件,通常采用支持32位的变量,其中每一位表示一种事件类型(0表示该事件类型未发生、1表示该事件类型已经发生)。事件标志组具备以下特点:
- 可以是任意一个事件发生时唤醒任务进行事件处理,也可以是几个事件都发生后才唤醒任 务进行事件处理
- 多次向任务发送同一事件类型,等效于只发送一次
- 允许多个任务对同一事件进行读写操作
- 事件仅用于任务间的同步,不提供数据传输功能
接口定义
动态创建一个事件
int aos_event_new(aos_event_t *event, unsigned int flags)
动态创建一个事件,并且把事件标志初始化成flag的值
参数:
- event:事件句柄
- flags:事件标志初始值
返回值:
- 类型:0 返回成功 小于0返回失败
删除事件
void aos_event_free(aos_event_t *event)
删除事件
参数:
- event:事件句柄
返回值:
- 无
获取事件标志位
int aos_event_get(aos_event_t *event, unsigned int flags, unsigned char opt, unsigned int *actl_flags, unsigned int timeout)
获取事件的标志位。 如果事件标志位被设置了,则立即返回; 如果timeout参数设置为RHINO_NO_WAIT,则也会立即返回 如果事件标志位没有被设置并且timeout参数设置为RHINO_WAIT_FOREVER,调用的task会被挂起直到事件标志位被置起。
参数:
- event:事件句柄
- flags:需要获取的事件标志
- opt:操作类型,比如AND,OR,AND_CLEAR,OR_CLEAR
- actl_flags:原始的事件标志
- timeout:超时时间
返回值:
- 类型:0 返回成功 小于0返回失败
设置事件标志
int aos_event_set(aos_event_t *event, unsigned int flags, unsigned char opt)
设置事件标志,并唤醒被相应事件阻塞的任务
参数:
- event:事件句柄
- flags:需要设置的事件标志
- opt:操作类型,比如AND,OR
返回值:
- 类型:0 返回成功 小于0返回失败
判断事件是否有效
int aos_event_is_valid(aos_event_t *event)
判断一个事件是否有效
参数:
- event:事件句柄
返回值:
- 类型:0 返回成功 小于0返回失败
示例代码
#define EVENT_FLAG_3 0x000000F0
aos_event_t test_event;
static void task1_entry(void *arg)
{
aos_msleep(3000); // 任务休眠3000ms
printf("task1 send event\n");
/*设置事件标志(0x000000F0), 或操作*/
aos_event_set(&test_event, EVENT_FLAG_3, AOS_EVENT_OR);
}
static void task2_entry(void *arg)
{
uint32_t actl_flags;
printf("task2 wait event\n");
/* 获取事件标志(0x000000F0),或操作 */
aos_event_get(&test_event, EVENT_FLAG_3, AOS_EVENT_OR, &actl_flags, 0);
/*
* try to get flag EVENT_FLAG_3(0x000000F0) with OR operation should wait here,
* task1 will set the flags with 0x000000F0, and then task2 will continue
*/
aos_event_get(&test_event, EVENT_FLAG_3, AOS_EVENT_OR, &actl_flags, AOS_WAIT_FOREVER);
printf("event test successfully!\n");
/*删除事件*/
aos_event_free(&test_event);
}
void test_event_start(void)
{
int ret = -1;
uint32_t flags = 0;
aos_msleep(1000); // 任务休眠1000ms
/*当前任务:创建事件*/
ret = aos_event_new(&test_event, flags);
if (ret != 0) {
printf("event create failed\n");
return;
}
/*判断事件是否可用*/
ret = aos_event_is_valid(&test_event);
if (ret == 0) {
printf("event is invalid\n");
}
aos_task_new("task1", task1_entry, NULL, 512);
aos_task_new("task2", task2_entry, NULL, 512);
}