队列集简介
在使用队列进行任务之间的消息传递时,一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集(也就是多个队列的集合)。
作用: 队列集用于对多个队列进行“监听”,只要被监听的队列中有一个队列有有效的消息,都可以让任务退出阻塞。
以下是队列集的运行流程图,
队列集函数
队列集使用流程:创建队列集 --> 创建队列或信号量 --> 往队列集中添加队列或信号量 -->往队列发送消息或释放信号量 --> 获取队列集消息
创建队列集
xQueueCreateSet():
QueueSetHandle_t xQueueCreateSet(const UBaseType_t uxEventQueueLength)
参数:
- uxEventQueueLength:队列集可容纳的队列数量
返回值:如果队列集创建成功,则返回队列集句柄,否则返回NULL。
队列集添加队列
xQueueAddToSet():
BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore,
QueueSetHandle_t xQueueSet );
参数:
- xQueueOrSemaphore:待添加的队列句柄
- xQueueSet:待添加的队列集
返回值:如果队列集添加队列成功,则返回pdPASS,否则返回pdFAIL。
备注:队列在被添加到队列集之前,队列中不能有有效消息
队列集移除队列
xQueueRemoveFromSet():
BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore,
QueueSetHandle_t xQueueSet );
参数:
- xQueueOrSemaphore:待移除的队列句柄
- xQueueSet:队列集
返回值:如果队列集添加队列成功,则返回pdPASS,否则返回pdFAIL。
备注:队列在被移除队列集之前,必须没有有效消息
获取队列集有效消息的队列
xQueueSelectFromSet():
QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet,
TickType_t const xTicksToWait );
参数:
- xQueueSet:队列集
- xTicksToWait:阻塞超时时间
返回值:如果获取队列消息成功,则返回队列消息句柄,否则返回NULL。
事件标志组
事件标志组简介
事件标志位:用一个位,表示事件是否发送。
事件标志组是一组事件标志的集合,简单理解就是一个整数,类型是EventBites_t 。
EventBites_t的定义如下,
typedef TickType_t EventBits_t;
#if ( configUSE_16_BIT_TICKS == 1 )
typedef uint16_t TickType_t;
#else
typedef uint32_t TickType_t;
#endif
#define configUSE_16_BIT_TICKS 0
从上述定义可以看到,EventBites_t其实就是16位或者32位的无符号整数类型,STM32中是32位。
特点:
- 它的每一位表示一个事件(高8位不算)
- 每一位事件的含义,由我们自己绝对,1表示事件发送,0表示未发生
- 任何任务或中断都可以读写这些位
- 可以等待某一位处理,同样也可以选择等待多位同时成立
以下是EventBites_t的位使用情况的示意图,
虽然说使用了 32 位无符号的数据类型变量来存储事件标志,但是其中的高8位被用作存储事件标志组的一些控制信息,也就是说一个事件组最多可以存储 24 个事件标志。
以下是事件标志组和队列,信号量的区别,
总结来说就是,信号量和队列就是私法消息,而事件标志组就是@所有人。
事件标志组函数
创建事件标志组(动态)
xEventGroupCreate():
EventGroupHandle_t xEventGroupCreate(void);
该函数无输入参数,返回值为事件标志组的句柄。
清除事件标志位
xEventGroupClearBits():
EventBits_t xEventGroupClearBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToClear )
参数:
- xEventGroup:待操作的事件标志组
- EventBits_t uxBitsToClear:待清零的事件标志位
返回值为整数,表示的是清零事件标志位之前事件标志组中的事件标志位的值
设置事件标志位
xEventGroupSetBits():
EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet )
参数:
- xEventGroup:待操作的事件标志组
- EventBits_t uxBitsToSet:待设置的事件标志位
返回值为整数,表示的是函数返回时事件组中的事件标志位值
等待事件标志位
xEventGroupWaitBits():
EventBits_t xEventGroupWaitBits( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToWaitFor,
const BaseType_t xClearOnExit,
const BaseType_t xWaitForAllBits,
TickType_t xTicksToWait )
参数:
- xEventGroup:等待的事件标志组句柄
- uxBitsToWaitFor:等待的事件标志位,可以用逻辑或等待多个事件标志位
- xClearOnExit:成功等待到事件标志位后,清除事件组中对应的事件标志位,pdTRUE表示清除uxBitsToWaitFor的指定位,pdFALSE表示不清除。
- xWaitForAllBits:等待uxBitsToWaitFor中的所有事件标志位(逻辑与),pdTRUE表示等待的位全部位1,pdFALSE表示等待的位某个为1。
- xTicksToWait:等待阻塞时间。
返回值如果为等待的事件标志位的值,表示的是等待事件标志位成功,返回等待到的事件标志位;
如果返回其他值,则表示等待事件标志位失败,返回事件组中的事件标志位。
备注:该函数让我们可以等待某一位,也可以等待多位,并且在等待到期望的事件后还可以清除某些位。
同步函数
xEventGroupSync():
EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,
const EventBits_t uxBitsToSet,
const EventBits_t uxBitsToWaitFor,
TickType_t xTicksToWait )
参数:
- xEventGroup:等待事件标志所在群组
- uxBitsToSet:达到同步点后,要设置的事件标志
- uxBitsToWaitFor:等待的事件标志
- xTicksToWait:等待阻塞时间。
返回值如果为等待的事件标志位的值,表示的是等待事件标志位成功,返回等待到的事件标志位;
如果返回其他值,则表示等待事件标志位失败,返回事件组中的事件标志位。
备注:该函数主要进行同步,通过uxBitsToSet设置某个任务完成,再通过uxBitsToWaitFor设置要等待的任务,在两个任务都完成后再往下运行,实现任务的同步。