4.2 FreeRTOS----队列的特点

数据存储

        队列可以容纳有限数量的固定大小的数据项。 队列可以容纳的最大项目数称为“长度”。 当创建队列时,都会设置每个数据项的长度和大小。
       队列通常用作先进先出(FIFO)缓冲区,其中数据被写入队列的结尾(尾部),并从队列的前端(头)中移除。  也可以写入队列的前面,并覆盖已经在队列前面的数据。

       有两种方式可以实现队列行为:

  • 复制队列
        复制队列意味着发送到队列的数据被按字节复制到队列中。

  • 引用队列
        引用队列意味着队列只保存指向发送到队列的数据的指针,而不是数据本身。

        FreeRTOS通过复制方式使用队列。 通过副本排队被认为同时比通过引用排队更强大和更简单,因为:
  • 堆栈变量可以直接发送到队列,即使该变量在声明的函数已经退出后已不存在。
  • 可以将数据发送到队列,而无需首先分配缓冲区来保存数据,然后将数据复制到分配的缓冲区中。
  • 发送任务可以立即重新使用发送到队列的变量或缓冲区。
  • 发送任务和接收任务完全解耦 - 应用程序设计人员不需要关心哪个任务拥有数据,哪个任务负责释放数据。
  • 通过副本进行排队并不会阻止队列通过引用被排队。 例如,当排队的数据的大小使得将数据复制到队列中是不切实际的,则可以将指向数据的指针复制到队列中。
  • RTOS完全负责分配用于存储数据的内存。
  • 在内存保护系统中,任务可以访问的RAM将受到限制。 在这种情况下,仅当发送和接收任务都可以访问存储数据的RAM时,才能使用引用排队。 通过副本排队不施加该限制; 内核始终以完全权限运行,允许使用队列将数据传输到内存保护边界。

多任务访问

        队列是他们自己的权利对象,可以被知道它们存在的任何任务或ISR访问。 任何数量的任务都可以写入同一个队列,任何数量的任务都可以从同一个队列读取。 在实践中,队列具有多个写入器是非常普遍的,但是对于具有多个读取器的队列来说,这不常见。

阻止队列读取

        当任务尝试从队列中读取时,它可以可选地指定“阻止”时间。 这是任务将被保留在阻塞状态以等待数据从队列中可用的时间,如果队列已经为空。 当另一个任务或中断将数据放入队列时,处于阻塞状态的等待数据从队列中使用的任务将自动移动到就绪状态。 如果指定的阻塞时间到期,数据可用之前,任务也将自动从阻塞状态移动到就绪状态。
        队列可以被多个任务读取,因此单个队列可以在其上等待数据时阻止其中一个以上的任务。 在这种情况下,当数据可用时,只有一个任务将被解除阻塞。 解除阻塞的任务将始终是等待数据的最高优先级任务。 如果被阻止的任务具有相同的优先级,则等待数据最长的任务将被解除阻塞。

阻止队列写入

        就像从队列读取一样,任务可以选择在写入队列时指定一个块时间。 在这种情况下,阻塞时间是任务应处于阻塞状态的最长时间,以便等待队列上的空间可用。
        队列可以被多个任务写入,所以有一个完整的队列可以阻止多个任务等待完成发送操作。 在这种情况下,当队列上的空间可用时,只有一个任务将被解除阻塞。 解除阻塞的任务将始终是等待空间的最高优先级任务。 如果被阻止的任务具有相同的优先级,则等待空间最长的任务将被解除阻塞。

阻塞多个队列

        队列可以分组成一组,允许任务进入阻塞状态,等待数据在集合中的任何队列中可用。 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值