前面章节我们学习了如何使用信号量来实现同步,但是使用信号量来同步的 话任务只能与单个的任务进行同步。有时候某个任务可能会需要与多个任务进行 同步,此时信号量就无能为力。FreeRTOS 为此提供了一个可选的解决方法,那 就是事件标志组。本章要实现的功能是:主要创建了两个任务,一个是设置事件 任务,一个是等待事件任务,两个任务独立运行,设置事件任务通过检测按键的 按下情况设置不同的事件标志位,等待事件任务则获取这两个事件标志位,并且 判断两个事件是否都发生,如果是则输出相应信息,LED 进行翻转。等待事件任 务的等待时间是 portMAX_DELAY,一直在等待事件的发生,等待到事件之后清除 对应的事件标记位。本章分为如下几部分内容: 9.1 事件简介 9.2 常用事件 API 函数 9.3 硬件设计 9.4 软件设计 9.5 实验现象
9.1 事件简介
事件是一种实现任务间通信的机制,主要用于实现多任务间的同步,但事件 通信只能是事件类型的通信,无数据传输。与信号量不同的是,它可以实现一对 多,多对多的同步。即一个任务可以等待多个事件的发生:可以是任意一个事件 发生时唤醒任务进行事件处理;也可以是几个事件都发生后才唤醒任务进行事件 处理。同样,也可以是多个任务同步多个事件。 每一个事件组只需要很少的 RAM 空间来保存事件组的状态。事件组存储在 一个 EventBits_t 类型的变量中,该变量在事件组结构体中定义。如果宏 configUSE_16_BIT_TICKS 定义为 1,那么变量 uxEventBits 就是 16 位的,其 中有 8 个位用来存储事件组;而如果宏 configUSE_16_BIT_TICKS 定义为 0, 那么变量 uxEventBits 就是 32 位的,其中有 24 个位用来存储事件组。在 STM32 中,我们一般将 configUSE_16_BIT_TICKS 定义为 0,那么 uxEventBits 是 32 位的,有 24 个位用来实现事件标志组。每一位代表一个事件,任务通过“逻辑 与”或“逻辑或”与一个或多个事件建立关联,形成一个事件组。事件的“逻辑 或”也被称作是独立型同步,指的是任