一、简介
1、 队列是任务到任务、任务到中断、中断到任务数据交流的一种机制(消息传递)
2、 在OS中如果使用全局变量存在弊端:数据无保护,导致数据不安全,当多个任务同时
对该变量操作时,数据易受损
3、队列:读写队列做好了保护,防止多任务同时访问冲突;我们只需要直接调用API函数
即可,简单易用
4、FreeRTOS基于队列, 实现了多种功能,其中包括队列集、互斥信号量、计数型信号量、二值信号量、 递归互斥信号量,因此很有必要深入了解 FreeRTOS 的队列
5特点:
(1、队列通常采用“先进先出”(FIFO)的数据存储缓冲机制,即先入队的数据会先从队 列中
被读取,FreeRTOS中也可以配置为“后进先出”LIFO方式;
(2、FreeRTOS中队列采用实际值传递,即将数据拷贝到队列中进行传递, FreeRTOS采用拷贝数据传递,也可以传递指针,所以在传递较大的数据的时候采用指针传递
(3、队列不属于某个任务,任何任务和中断都可以向队列发送消息 以及 读取消息
(4、当任务向一个队列发送消息时,可以指定一个阻塞时间,假设此时当队列已满无法入队(0~port_MAX_DELAY:不等待~死等)
二、使用
1.使用队列的主要流程:创建队列 -->写队列 --> 读队列
2.创建队列API函数
(1、动态方式创建队列:xQueueCreate()
(2、静态方式创建队列:xQueueCreateStatic() ps:此方法需手动分配队列空间
动态和静态创建队列之间的区别:队列所需的内存空间由 FreeRTOS 从 FreeRTOS 管
理的堆中分配,而静态创建需要用户自行分配内存。
3.写队列API函数
往队列的尾部写入消息:xQueueSend()
往队列的尾部写入消息:xQueueSendToBack()
往队列的头部写入消息:xQueueSendToFront()
覆写队列消息(只用于队列长度为 1 的情况):xQueueOverwrite()
4.读队列API函数
从队列头部读取消息,并删除消息:xQueueReceive()
从队列头部读取消息:xQueuePeek()
在中断中从队列头部读取消息,并删除消息:xQueueReceiveFromISR()
在中断中从队列头部读取消息:xQueuePeekFromISR()
笔记内容来自正点原子