本文介绍队列的基本知识,具体源代码分析见《FreeRTOS高级篇5---FreeRTOS队列分析

1.FreeRTOS队列

队列是基本的任务间通讯方式。能够在任务与任务间、中断和任务间传送信息。大多数情况下,队列用于具有线程保护的FIFO(先进先出)缓冲区:新数据放在队列的后面。当然。数据也能够放在队列的前面,在下一篇讲队列API函数时,会涉及到数据的存放位置。

图1-1:读写队列

图1-1所看到的的队列中。最多能保存5个项目,而且假设队列永远不会满。任务A使用API函数xQueueSendToBack()向队列发送数据。每次发送一个数据。新入队的数据置于上一次入队数据的后面。

任务B使用API函数xQueueReceive()将数据从队列取出,先入队的数据先出队。

2.使用模型:最简单、最灵活

通常情况下,鱼和熊掌是不可兼得的。但FreeRTOS的队列用户模型管理却兼顾简单和灵活。发送到队列的消息是通过拷贝实现的,这意味着队列存储的数据是原数据,而不是原数据的引用。

FreeRTOS队列具有下面特性:

  • C变量(整形、简单结构体等等)中的简单信息能够直接传送到队列。这样就不须要为信息分配缓存也不须要再进行什么拷贝工作。

    相同的。信息能够直接从队列读取到C变量中。用直接拷贝的方法入队,能够同意任务马上覆写已经入队的变量或者缓存,实际上队列中已经保存了这些变量或缓冲区携带的信息。由于变量中的数据内容是以拷贝的方式入队的,所以变量自身是同意反复使用的。发送信息的任务和接收信息的任务并不须要就哪个任务拥有信息、哪个任务释放信息(当信息不再使用时)而达成一致。

  • 队列是通过拷贝传递数据的,但这并最好还是碍队列通过引用来传递数据。

    当信息的大小到达一个临界点后,逐字节拷贝整个信息是不实际的,能够定义一个指针队列,仅仅拷贝指向消息的指针来取代整个信息拷贝。

    FreeRTOS+UDP IP栈例程正是使用这样的方法向FreeRTOS协议栈传递大量网络数据的。

  • 队列内存区域分配由内核完毕。

  • 变长消息能够通过定义保存一个结构体变量的队列实现。结构体一个成员指向要入队的缓存。还有一个成员保存缓存数据的大小。
  • 单个队列能够接收不同类型信息,而且信息能够来自不同的位置。

    通过定义保存一个结构体变量的队列来实现。结构体的一个成员保存信息类型。还有一个成员保存信息数据(或者指向信息数据的指针)。数据怎样解读取决于信息类型。

    管理FreeRTOS+UDP IP栈的任务正是使用单个队列接收ARP定时器时间通知、以太网硬件传送来的数据包、从应用层传送来的数据包、网络关闭事件等等。

  • 天生适用于那些内存保护(MPU)场合。一个具有内存区域保护的任务能够向还有一个具有内存区域保护的任务传递数据,由于调用队列发送函数会引起RTOS提升微控制器特权级别。仅仅有RTOS(具有全部特权)才干够訪问队列存储区域。
  • 在中断函数中使用独立的API。将RTOS任务API和中断服务例程API分来实现意味着能够避免执行时的上下文调用检查开销,还意味着在大多数情况下。与其他RTOS产品相比。用户创建中断服务例程会更简单。
  • API函数非常easy。

3.队列堵塞

API函数同意指定堵塞时间。

每当任务企图从一个空的队列读取数据时,任务会进入堵塞状态(这样任务不会消耗不论什么CPU时间而且还有一个任务能够执行)直到队列中出现有效数据或者堵塞时间到期。

每当任务企图向一个满的队列写数据时,任务会进入堵塞状态,直到队列中出现有效空间或者堵塞时间到期。

假设多个任务堵塞在一个队列上。那么最高优先级别的任务会第一个解除堵塞。

注:中断程序中绝不能够使用不带“FromISR”结尾的API函数!

总结一下队列的基本使用方法:

  1. 定义一个队列句柄变量,用于保存创建的队列:xQueueHandle xQueue1;
  2. 使用API函数xQueueCreate()创建一个队列。
  3. 假设希望使用先进先出队列,使用API函数xQueueSend()或xQueueSendToBack()向队列投递队列项。假设希望使用后进先出队列。使用API函数xQueueSendToFront()向队列投递队列项。假设在中断服务程序中。切记使用它们的带中断保护版本号。

  4. 使用API函数xQueueReceive()从队列读取队列项,假设在中断服务程序中,切记使用它们的带中断保护版本号。

      以上使用的API函数将在下一篇文章中介绍。

FreeRTOS系列第17篇---FreeRTOS队列的更多相关文章

  1. FreeRTOS系列第2篇---FreeRTOS入门指南【转】

    转自:http://blog.csdn.net/zhzht19861011/article/details/49819309 版权声明:本文为博主原创文章,未经博主允许不得转载.联系邮箱:zhzhch ...

  2. FreeRTOS系列第14篇---FreeRTOS任务通知

    注:本文介绍任务通知的基础知识,具体源代码分析见<FreeRTOS高级篇8---FreeRTOS任务通知分析> 每一个RTOS任务都有一个32位的通知值,任务创建时,这个值被初始化为0.R ...

  3. FreeRTOS系列第20篇---FreeRTOS信号量API函数

    FreeRTOS的信号量包括二进制信号量.计数信号量.相互排斥信号量(以后简称相互排斥量)和递归相互排斥信号量(以后简称递归相互排斥量).我们能够把相互排斥量和递归相互排斥量看成特殊的信号量. 信号量 ...

  4. FreeRTOS系列第13篇---FreeRTOS内核控制

    内核控制的一些功能须要移植层提供,为了方便移植.这些API函数用宏来实现,比方上下文切换.进入和退出临界区.禁止和使能可屏蔽中断.内核控制函数还包含启动和停止调度器.挂起和恢复调度器以及用于低功耗模式 ...

  5. spring 5.x 系列第17篇 —— 整合websocket (xml配置方式)

    源码Gitub地址:https://github.com/heibaiying/spring-samples-for-all 一.说明 1.1 项目结构说明 项目模拟一个简单的群聊功能,为区分不同的聊 ...

  6. java高并发系列 - 第17天:JUC中的循环栅栏CyclicBarrier常见的6种使用场景及代码示例

    这是java高并发系列第17篇. 本文主要内容: 介绍CyclicBarrier 6个示例介绍CyclicBarrier的使用 对比CyclicBarrier和CountDownLatch Cycli ...

  7. 【Flutter 实战】17篇动画系列文章带你走进自定义动画

    老孟导读:Flutter 动画系列文章分为三部分:基础原理和核心概念.系统动画组件.8篇自定义动画案例,共17篇. 动画核心概念 在开发App的过程中,自定义动画必不可少,Flutter 中想要自定义 ...

  8. Mysql高手系列 - 第9篇:详解分组查询,mysql分组有大坑!

    这是Mysql系列第9篇. 环境:mysql5.7.25,cmd命令中进行演示. 本篇内容 分组查询语法 聚合函数 单字段分组 多字段分组 分组前筛选数据 分组后筛选数据 where和having的区 ...

  9. java高并发系列 - 第26篇:学会使用JUC中常见的集合,常看看!

    这是java高并发系列第26篇文章. 环境:jdk1.8. 本文内容 了解JUC常见集合,学会使用 ConcurrentHashMap ConcurrentSkipListMap Concurrent ...

随机推荐

  1. Android 网络请求框架Retrofit

    Retrofit是Square公司开发的一款针对Android网络请求的框架,Retrofit2底层基于OkHttp实现的,OkHttp现在已经得到Google官方认可,大量的app都采用OkHttp ...

  2. hibernate 多对多单向

    多对多会利用中间表做外键的形式关联   package com.bjsxt.hibernate; import javax.persistence.Entity; import javax.persi ...

  3. 数据库表syscolumns 各个字段含义 select * from syscolumns where name='textA'

    每个数据库创建后都会有一些系统表用来存储该数据库的一些基本信息 每个表和视图中的每列在表中占一行,存储过程中的每个参数在表中也占一行.该表位于每个数据库中. 列名 数据类型 描述 name sysna ...

  4. https://github.com/CocoaPods/CocoaPods/search?q=No+such+file+or+directory报错解决方式

    ――― MARKDOWN TEMPLATE ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― ### Command ``` /U ...

  5. Lintcode---线段树构造||

    线段树是一棵二叉树,他的每个节点包含了两个额外的属性start和end用于表示该节点所代表的区间.start和end都是整数,并按照如下的方式赋值: 根节点的 start 和 end 由 build  ...

  6. Springboot读取配置文件的两种方法

    第一种: application.yml配置中的参数: zip: Hello Springboot 方法读取: @RestController public class ControllerTest ...

  7. django源码分析----Related继承结构

    在django中关联关系大概可以分成many-to-one(foriegnkey).one-to-one.many-to-many 这三种.它们有如下的类结构 class RelatedField(F ...

  8. unity5, assert

    assert可以实现“三步一岗五步一哨”可以说是保证代码正确性(安全编程)的最有力工具.在用c++写程序的时候assert语句总是要占整个程序的大部分篇幅. 但是转到unity c#,一开始没找到as ...

  9. app store上传图片显示错误:未能创建 屏幕快照

    在iTunes Connect中加入一个app后.加入屏幕快照时,依照要求的尺寸上传照片成功,可是在保存的时候提示"未能创建Screenshots for 4-inch iPhone5 an ...

  10. MapReduce编程(七) 倒排索引构建

    一.倒排索引简单介绍 倒排索引(英语:Inverted index),也常被称为反向索引.置入档案或反向档案,是一种索引方法,被用来存储在全文搜索下某个单词在一个文档或者一组文档中的存储位置的映射. ...