一、什么是队列
队列是任务到任务、任务到中断、中断到任务数据交流的一种机制。
在队列中可以存储数量有限、大小固定的数据。队列中的每一个数据叫做“队列项目”,队列能够存储“队列项目”的最大数量称为队列的长度。
在创建队列时要指定队列长度以及队列项目的大小。
二、队列特点
1、数据入队出队方式:队列通常采用”先进先出“(FIFO)先进入消息队列的消息先传给任务,
也可以配置为后进后出(LIFO)的方式。
2、数据传递方式:FreeRTOS消息队列传递的是实际数据即将数据拷贝到队列中进行传递,并不是数据地址,RTX,uCOS-II 和 uCOS-III 是传递的地址。FreeRTOS中可以通过传递指针地址方式来传递指针。
3、多任务访问:队列不属于某个任务,任何任务和中断都可以向队列发送或读取消息。
4、出队/入队阻塞:当任务向一个队列发送消息时可以指定一个阻塞时间。
- 若阻塞时间为0 :直接返回不会等待。
- 若为0~port_MAX_DELAY:等待设定的阻塞时间,超时后直接返回。
- 若为port_MAX_DELAY:一直等到可以入队。
当一个任务试图从一个空队列中读取时,该队列将 进入阻塞状态(因此它不会消耗任何 CPU 时间,且其他任务可以运行) 直到队列中的数据变得可用,或者阻塞时间过期。
当一个任务试图写入到一个满队列时,该队列将 进入阻塞状态(因此它不会消耗任何 CPU 时间,且其他任务可以运行) 直到队列中出现可用空间,或者阻塞时间过期。
如果同一个队列上有多个处于阻塞状态的任务, 那么具有最高优先级的任务将最先解除阻塞。
如果优先级相同,等待时间最长的任务最先解除阻塞。
三、队列的函数
1、xQueueCreate
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );
创建一个新队列并返回 可引用此队列的句柄。
configSUPPORT_DYNAMIC_ALLOCATION 必须在 FreeRTOSConfig.h 中被设置为 1,或保留未定义状态(此时,它默认 为 1) ,才能使用此 RTOS API 函数。
每个队列需要 RAM 用于保存队列状态和 包含在队列(队列存储区域)中的项目。 如果使用 xQueueCreate() 创建队列,则所需的 RAM 将自动 从 FreeRTOS 堆中分配。 如果使用 xQueueCreateStatic() 创建队列, 则 RAM 由应用程序编写者提供,这会产生更多的参数, 但这样能够在编译时静态分配 RAM 。
参数:
uxQueueLength | 队列可同时容纳的最大项目数 。 |
uxItemSize | 存储队列中的每个数据项所需的大小(以字节为单位)。 数据项按副本排队,而不是按引用排队, 因此该值为每个排队项目将被复制的字节数。队列中每个数据项 必须大小相同。 |
返回:
如果队列创建成功,则返回所创建队列的句柄 。 如果创建队列所需的内存无法 分配 ,则返回 NULL。
2、xQueueSend
这是一个调用 xQueueGenericSend() 的宏。
等同于 xQueueSendToBack()。
在队列中发布项目。不得从中断服务程序调用