在实际项目中常常会遇到一个任务和另一个任务进行沟通交流的情况(即任务与任务之间的数据传递)通常我们会考虑通过全局变量来完成任务间的数据传递但是全局变量数据无保护导致数据不安全当多个任务同时对该变量操作时数据易受损无法追踪全局变量被谁使用或被谁更改 FreeRTOS对此提供一个叫做队列的机制

队列中可以存储有限的大小固定的数据项目任务与任务任务与中断之间要交流的数据保存在队列中叫做队列项目队列所能保存的最大数据项目数量叫做队列的长度创建队列的时候会指定数据项目的大小和队列的长度由于队列用来传递消息的所以也称为消息队列FreeRTOS 中的信号量的也是依据队列实现的


队列的特点

数据入队出队方式
先进先出FIFO: 往队列发送数据入队是发送到队列的尾部的从队列提取数据出队是从队列的头部提取的
数据存放位置
入队发送消息
数据被存放到队列的尾部队列当前可用位置
队列的尾部位置通过一个内部的写指针writeIndex记录
如果尾部到达缓冲区的末尾队列会使用循环逻辑将数据存放到缓冲区的开头

数据传递方式

  • 值传递-传递的是数据

    • 值传递的优点
      ​ 在数据发送到队列后原先存储数据的缓冲区可以被删除或者覆写这样的话缓冲区就可以一直被重复使用
    • 值传递的缺点
      ​ 如果需要传送大量的数据需要进行数据拷贝那么势必会消耗很多时间
  • 引用传递-传递的是指针

    • 引用传递的优点
      ​ 因为传递的数据存放的地址不需要进行数据拷贝到队列中会大大引用传递的优点

    • 引用传递的缺点
      ​ 采用引用传递的消息就必须保持可见性也就是消息内容必须有效如此的话例如函数的局部变量就存在
      会被随时删除的情况