本节需要掌握以下内容:
1,队列集简介(了解)
2,队列集相关API函数介绍(熟悉)
3,队列集操作实验(掌握)
一、队列集简介(了解)
一个队列值允许任务间传递的消息为同一数据类型,如果需要在任务间传递不同数据类型消息时,那么就可以使用队列集!
作用:用于对多个队列或信号量进行“监听”,其中不管哪一个消息到来,都可以让任务退出阻塞状态。
假设:有个接收任务,使用到队列接收和信号量的获取,如下:
二,队列集相关API函数介绍(熟悉)
函数 | 描述 |
xQueueCreateSet() | 创建队列集 |
xQueueAddToSet() | 队列添加到队列集中 |
xQueueRemoveFromSet() | 从队列集中移除队列 |
xQueueSelectFromSet() | 获取队列集中有有效消息的队列 |
xQueueSelectFromSetFromISR() | 在中断中获取队列集中有有效消息的队列 |
2.1 创建队列集函数
QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength );
此函数用于创建队列集。
形参 | 描述 |
uxEventQueueLength | 队列集可容纳的队列数量 |
返回值 | 描述 |
NULL | 队列集创建失败 |
其他值 | 队列集创建成功,返回队列集句柄 |
2.2 队列添加到队列集中
BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore ,
QueueSetHandle_t xQueueSet );
此函数用于往队列集中添加队列,要注意的时,队列在被添加到队列集之前,队列中不能有有效的消息
形参 | 描述 |
xQueueOrSemaphore | 待添加的队列句柄 |
xQueueSet | 队列集 |
返回值 | 描述 |
pdPASS | 队列集添加队列成功 |
pdFAIL | 队列集添加队列失败 |
2.3 队列集中移除队列
BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore ,
QueueSetHandle_t xQueueSet );
此函数用于往队列集中添加队列,到注意的是,队列在被添加到队列集之前,队列中不能有效的消息
形参 | 描述 |
xQueueOrSemaphore | 待移除的队列句柄 |
xQueueSet | 队列集 |
返回值 | 描述 |
pdPASS | 队列集移除队列成功 |
pdFAIL | 队列集移除队列失败 |
2.4 获取队列集中有有效消息的队列
QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet,
TickType_t const xTicksToWait )
此函数用于从队列集中移除队列,要注意的是,队列在队列集移除之前,必须没有有效的消息
形参 | 描述 |
xQueueOrSemaphore | 待移除的队列句柄 |
xQueueSet | 队列集 |
返回值 | 描述 |
pdPASS | 队列集移除队列成功 |
pdFAIL | 队列集移除队列失败 |
2.5 获取队列集中有有效消息的队列
QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet,
TickType_t const xTicksToWait )
此函数用于在任务中获取队列集中有效消息的队列
形参 | 描述 |
xQueueSet | 队列集 |
xTicksToWait | 阻塞超时时间 |
返回值 | 描述 |
NULL | 获取消息失败 |
其他值 | 获取到消息的队列句柄 |
三、 队列集使用流程
1、启用队列集功能需要将宏configUSE_QUEUE_SETS 配置为1
2、创建队列集
3、创建队列或信号量
4、往队列集中添加队列或信号量
5、往队列发送信息或释放信号量
6、获取队列集的消息
四、队列集操作实验(掌握)
3.1、实验目的:
学习 FreeRTOS 的队列集相关API的使用。
3.2、实验设计:
将设计三个任务:start_task、task1、task2
三个任务的功能如下:
- start_task:用来创建其它任务,并创建队列集,队列/信号量,将队列/信号量添加到队列集中
- task1:用于扫描按键,当KEY0按下,往队列写入数据,当KEY1按下,释放二值信号量
- task2:读取队列集中的消息,并打印
3.3 实验代码
demo.c
代码明天更,今天太晚了