0
点赞
收藏
分享

微信扫一扫

FreeRTOS--队列管理

冶炼厂小练 2022-04-01 阅读 67
iotmcustm32

前言

通过阅读本文可以了解到:

  • 如何创建队列
  • 一个队列如何管理它包含的数据
  • 如何发送数据至队列
  • 如何从队列接收数据
  • 阻塞队列意味着什么
  • 如何阻塞多个队列
  • 如何覆盖队列中的数据
  • 如何清除一个队列
  • 读取和写入一个队列对任务优先级的影响

队列的特征

一个队列能保存有限数量的固定大小的数据单元,每个队列数据单元的长度与大小是在创建队列时设置的。
队列通常是一个先入先出(FIFO)的缓冲区,即数据在队列末尾被写入,在队列前部移除,也可以写入队列的前端,并覆盖已位于队列前端的数据。下图演示了队列的创建及使用:
在这里插入图片描述
有两种方法可以实现队列的数据通信:

  • 通过复制实现队列:复制队列是指将发送至队列的数据一个字节一个字节地复制到队列中。
  • 通过引用实现队列:引用队列意味着队列只持有指向发送到队列的数据的指针,而不是数据本身。
    FreeRTOS是通过使用复制方法实现队列。这是考虑到复制队列比引用队列更强大更容易使用:
  • 堆栈变量可以直接发送至队列,即使该变量将在声明它的函数退出后。
  • 可以将数据发送到队列,而无需先分配缓冲区来保存数据,然后将数据复制到分配的缓冲区。
  • 发送任务可以立即重用发送至队列的变量或缓冲区。
  • 发送任务和接受任务是完全解耦的,开发人员不需要关心哪个任务拥有数据或者负责发布数据。
  • 复制队列并不会阻止队列也被用于引用队列。例如,当正在排队的数据的大小使得数据复制到队列不切实际时,可以将指向数据的指针复制到队列中。
  • RTOS完全负责分配用于存储数据的内存。
  • 在受内存保护的系统中,任务可以访问的RAM将受到限制。这种情况下,只有当发送和接受任务都可以访问存储数据的RAM时,才可以使用引用队列。

多任务访问

队列本身就是对象,任何知道它们存在的任务或 ISR 都可以访问它们。任意数量的任务可以写入同一个队列,任意数量的任务也可以从同一个队列读取。在实践中,队列有多个写入者是非常常见的,但是队列有多个读取者就不那么常见了。

举报

相关推荐

0 条评论