freeRTOS-消息队列
Comment在实际项目中,常常会遇到一个任务和另一个任务进行“沟通交流”的情况(即任务与任务之间的数据传递),通常我们会考虑通过全局变量来完成任务间的数据传递,但是全局变量数据无保护,导致数据不安全,当多个任务同时对该变量操作时,数据易受损,无法追踪全局变量被谁使用或被谁更改。 FreeRTOS对此提供一个叫做队列的机制。
队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存在队列中,叫做队列项目。队列所能保存的最大数据项目数量叫做队列的长度,创建队列的时候会指定数据项目的大小和队列的长度。由于队列用来传递消息的,所以也称为消息队列。FreeRTOS 中的信号量的也是依据队列实现的
队列的特点
数据入队出队方式
先进先出(FIFO): 往队列发送数据(入队)是发送到队列的尾部的。从队列提取数据(出队)是从队列的头部提取的。
数据存放位置
入队(发送消息):
数据被存放到队列的尾部(队列当前可用位置)。
队列的尾部位置通过一个内部的写指针(writeIndex)记录。
如果尾部到达缓冲区的末尾,队列会使用循环逻辑,将数据存放到缓冲区的开头。
数据传递方式
-
值传递-传递的是数据
- 值传递的优点
在数据发送到队列后,原先存储数据的缓冲区可以被删除或者覆写,这样的话缓冲区就可以一直被重复使用。 - 值传递的缺点
如果需要传送大量的数据,需要进行数据拷贝,那么势必会消耗很多时间
- 值传递的优点
-
引用传递-传递的是指针
-
引用传递的优点
因为传递的数据存放的地址,不需要进行数据拷贝到队列中,会大大引用传递的优点 -
引用传递的缺点
采用引用传递的消息就必须保持可见性,也就是消息内容必须有效,如此的话,例如函数的局部变量就存在
会被随时删除的情况
-