目录
2.2 函数 xEventGroupCreateStatic()
3.2 函数 xEventGroupClearBitsFromISR()
3.4 函数 xEventGroupSetBitsFromISR()
4.2 函数 xEventGroupGetBitsFromISR()
信号量可以来完成同步,但是使用信号量来同步的话任务只能与单个的事件或任务进行同步。但是有时候某个任务可能会需要与多个事件或任务进行同步,此时信号量就无能为力了。FreeRTOS 为此提供了一个解决方法,就是事件标志组。
1. 事件标志组简介
事件位(事件标志):
事件位用来表明某个事件是否发生,事件位通常用作事件标志,比如下面这几个例子:
- 当收到一条消息并且把这条消息处理掉以后就可以将某个位(标志)置 1,当队列中没有消息需要处理的时候就可以将这个位(标志)置 0。
- 当把队列中的消息通过网络发送输出以后就可以将某个位(标志)置 1,当没有数据需要从网络发送出去的话就将这个位(标志)置 0.
- 现在需要向网络中发送一个心跳信息,将某个位(标志)置 1,现在不需要向网络中发送心跳信息,这个位(标志)置 0.
事件组:
一个事件组就是一组的事件位,事件组中的事件位通过位编号来访问,同样,以上面列出的三个例子为例:
- 事件标志组的 bit0 表示队列中的消息是否处理掉。
- 事件标志组的 bit1 表示是否有消息需要从网络中发送出去。
- 事件标志组的 bit2 表示现在是否需要向网络发送心跳信息。
事件标志组和事件位的数据类型:
事件标志组的数据类型为 EventGroupHandle_t ,当 configUSE_16_BIT_TICKS 为 1 的时候事件标志组可以存储 8 个事件位,当 configUSE_16_BIT_TICKS 为 0 的时候事件标志组存储 24 个事件位。
事件标志组中的所有事件位都存储在一个无符号的 EventBits_t 类型的变量中,EventBits_t 在 event_groups.h 中有如下的定义:
typedef TickType_t EventBits_t;
数据类型 TickType_t 在文件 portmacro.h 中有如下定义:
#if( configUSE_16_BIT_TICKS == 1 )
typedef uint16_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffff
#else
typedef uint32_t TickType_t;
#define portMAX_DELAY ( TickType_t ) 0xffffffffUL
#define portTICK_TYPE_IS_ATOMIC 1
#endif
通过该程序可以看出:
当 configUSE_16_BIT_TICKS 等于 0 的时候,0xffffffffUL 表示TickType_t 是一个 32 位的数据
类型,因此 EventBits_t 也是一个 32 位的数据类型。
EventBits_t 类型的变量可以存储 24 个事件位,另外的那高 8 位有其他用处。
事件 0 存放在这个变量的 bit0 上,变量的 bit1 就是事件位 1,以此类推。
对于 STM32 来说一个事件标志组最多可以存储 24 个事件位。

2. 创建事件标志组
FreeRTOS 提供了两个用于创建事件标志组的函数。
函数:
xEventGroupCreate() 使用动态方法创建事件标志组。
xEventGroupCreateStatic() 使用静态方法创建事件标志组。
2.1 函数 xEventGroupCreate()
此函数用来创建一个事件标志组,所需要的内存通过动态内存管理方法分配。由于内部处理的原因,事件标志组可用的 bit 数取决于 configUSE_16_BIT_TICKS,当 configUSE_16_BIT_TICKS 为 1 的时候事件标志组有 8 个可用的位(bit 0 ~ bit 7),当 configUSE_16_BIT_TICKS 为 0 的时候事件标志组有 24 个可用的位(bit 0 ~ bit 23)。EventBits_t 类型的变量用来存储事件标志位组中的各个事件位,函数原型如下:
EventGroupHandle_t xEventGroupCreate(void)
参数:
无
返回值:
NULL: 事件标志组创建失败。
其他值: 创建成功的事件标志组句柄。
2.2 函数 xEventGroupCreateStatic()
此函数用于创建一个事件标志组,所需要的内存需要由用户自行分配,此函数原型如下:
EventGroupHandle_t xEventGroupCreateStatic(StaticEventGroup_t *pxEventGroupBuffer)
参数:
pxEventGroupBuffer: 参数指向一个 StaticEnentGroup_t 类型的变量,用来保存事件标志组结构体。
返回值:
NULL: 事件标志组创建失败。
其他值: 创建成功的事件标志组句柄。
3. 设置事件位
FreeRTOS 提供了 4 个函数用来设置事件标志组中事件位(标志),事件位(标志)的设置包括清零和置 1 两种操作。
函数:
xEventGroupClearBits() 将指定的事件位清零,用在任务中。
xEventGroupClearBitsFromISR() 将指定的事件位清零,用在中断服务函数中。
xEventGroupSetBits() 将指定的事件位置 1 ,用在任务中。
xEventGroupSetBitsFromISR() 将指定的事件位置 1,用在中断服务函数中。
3.1 函数 xEventGroupClearBits()
将事件标志组中的指定事件位清零,此函数只能用在任务中,不能用在中断服务函数中!中断服务函数中有其他的 API 函数。函数原型如下:
EventBits_t xEventGroupClearBits(EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToClear);
参数:
&nb

最低0.47元/天 解锁文章
672

被折叠的 条评论
为什么被折叠?



