当前位置: 首页 > 文档资料 > YoC 编程基础 >

事件

优质
小牛编辑
115浏览
2023-12-01

概述

事件标志组是一种实现任务间通信的机制,可用于实现任务间的同步。事件标志组采用位来 表示一个事件,通常采用支持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);
}