(一)简介
队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递)。任务和ISR统称为进程,任务与任务之间,或任务与ISR之间有时需要进行通讯或同步,称为进程间通信。
在创建队列时,就要指定队列长度以及队列项目的大小!
(二)FreeRTOS队列特点
1、入队阻塞:队列满了,此时无法继续写入数据
2、出队阻塞:队列为空,此时无法读出数据
3、入队阻塞解除,有多个任务等待时,哪一个会进入就绪态?
- 优先级最高的任务
- 如果优先级相同,那等待时间最久的任务会进入就绪态
4、队列操作
队列操作的过程:包括创建队列、往队列中写入消息、从队列中读取消息等操作
(1)创建队列
创建了一个用于任务 A 与任务 B 之间“沟通交流”的队列,这个队列最大可容纳 5 个队列项目,即队列的长度为 5。刚创建的队列是不包含内容的,因此这个队列为空。
(2)写入队列
任务 A 将一个私有变量写入队列的尾部。由于在写入队列之前,队列是空的,因此新写入的消息,既是是队列的头部,也是队列的尾部。
任务 A 改变了私有变量的值,并将新值写入队列。现在队列中包含了队列 A写入的两个值,其中第一个写入的值在队列的头部,而新写入的值在队列的尾部。 这时队列还有 3 个空闲的位置。
(3)读取队列
任务 B 从队列中读取消息,任务 B 读取的消息是处于队列头部的消息,这是任务 A 第一次往队列中写入的消息。在任务 B 从队列中读取消息后,队列中任务 A 第二次写入的消息,变成了队列的头部,因此下次任务 B 再次读取消息时,将读取到这个消息。此时队列中剩余 4 个空闲的位置。