1.前言

freeRTOS中所有任务的通信和同步机制都是基于队列来实现。

2.队列的特点

图 队列的读写操作

  • 队列的数据存储

(1)队列可以保存有限个具有确定长度的数据单元,队列可以保存的最大单元数目称为队列的深度;

(2)队列创建时需要设定队列深度和每个单元的大小;

(3)队列先进先出

  • 多任务存取

队列是内核中具有独立权限的对象,不属于任何任务,可以有多个任务进行读写

  • 读队列阻塞

(1)任务读取队列数据时可以指定一个阻塞超时时间;

(2)未超过阻塞超时时间,队列为空,任务将保持阻塞状态;

(3)队列中写入数据,任务将由阻塞态转为就绪态;或者阻塞时间超过了阻塞超时时间,任务也将由阻塞态转为就绪态;

(4)可能会有多个任务处于阻塞态等待读取队列中的数据;

(5)队列数据有效,优先级最高的任务会解除阻塞,相同优先级则等待时间最长的任务会解除阻塞

  • 写队列阻塞

(1)任务写入队列数据时可以指定一个阻塞超时时间;

(2)未超过阻塞超时时间,队列满,任务将保持阻塞状态;

(3)队列有空闲,任务将由阻塞态转为就绪态;或者阻塞时间超过了阻塞超时时间,任务也将由阻塞态转为就绪态;

(4)可能会有多个任务处于阻塞态等待向队列中的写入数据;

(5)队列有空闲,优先级最高的任务会解除阻塞,相同优先级则等待时间最长的任务会解除阻塞

3. 使用队列传递复合数据类型

图 结构体用于队列传递举例

一般是通过传递复合数据类型的指针来实现

4.使用队列传递指针

  • 如果队列存储的数据单元尺寸较大,那最好是利用队列来传递数据的指针
  • 利用队列传递指针时,一定要十分小心地做到以下两点

(1)指针指向的内存空间的所有权必须明确

不会有任意两个任务同时修改共享内存中的数据 .原则上,共享内存在其指针发送到队列之前,其内容只允许被发送任务访问;

共享内存指针从队列中被读出之后,其内容亦只允许被接收任务访问

(2)指针指向的内存空间必须有效

如果指针指向的内存空间是动态分配的,只应该有一个任务负责对其进行内存释放。当这段内存空间被释放之后,就不应该有任何一个任务再访问这段空间

注:切忌用指针访问任务栈上分配的空间。因为当栈帧发生改变后,栈上的数据将不再有效

5.队列操作API

API原型 函数说明 参数说明 返回值
xQueueCreate( uxQueueLength, uxItemSize ) 用于创建一个队列,并返回一个 xQueueHandle 句柄以便于对其创建的队列进行引用 。当创建队列时, FreeRTOS 从堆空间中分配内存空间。分配的空间用于存储队列数据结构本身以及队列中包含的数据单元。如果内存堆中没有足够的空间来创建队列,xQueueCreate()将返回 NULL

  • uxQueueLength

队列能够存储的最大单元数目,即队列深度。

  • uxItemSize

队列中数据单元的长度,以字节为单位

NULL 表示没有足够的堆空间分配给队列而导致创建失败。
非 NULL 值表示队列创建成功。此返回值应当保存下来,以作为
操作此队列的句柄
xQueueSendToBack( xQueue, pvItemToQueue, xTicksToWait ) xQueueSendToBack()用于将数据发送到队列尾
  • xQueue

目标队列的句柄

  • pvItemToQueue

发送数据的指针

  • xTicksToWait

阻塞超时时间。如果在发送时队列已满,这个时间即是任务处于阻塞态等待队列空间有效的最长等待时间

 
xQueueSendToFront( xQueue, pvItemToQueue, xTicksToWait ) 用于将数据发送到队列首  

pdPASS
返回 pdPASS 只会有一种情况,那就是数据被成功发送到队列

errQUEUE_FULL
如 果 由 于 队 列 已 满 而 无 法 将 数 据 写 入 , 则 将 返 回
errQUEUE_FULL

xQueueSendToFrontFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) 用于在中断服务中实现相同的功能    
xQueueSendToBackFromISR( xQueue, pvItemToQueue, pxHigherPriorityTaskWoken ) 用于在中断服务中实现相同的功能     

xQueueReceive

xQueuePeek

用于从队列中接收(读取)数据单元。接收到的单元同时会从队列中删除

也是从从队列中接收数据单元,不同的是并不从队列中删出接收到的单元

注:切记不要在中断服务例程中调用 xQueueRceive()和 xQueuePeek()

   
xQueueReceiveFromISR      
 uxQueueMessagesWaiting

用于查询队列中当前有效数据单元个数

切记不要在中断服务例程中调用 uxQueueMessagesWaiting()

   
 uxQueueMessagesWaitingFromISR      

6. 执行流程举例

send1和sender2负责写队列,receiver负责读队列:

freeRTOS中文实用教程2--队列的更多相关文章

  1. freeRTOS中文实用教程5--内存管理

    1.前言 不同的嵌入式系统具有不同的内存配置和时间要求.所以单一的内存分配算法只可能适合部分应用程序. FreeRTOS 将内存分配作为可移植层面(相对于基本的内核代码部分而言).这使得不同的应用程序 ...

  2. freeRTOS中文实用教程4--资源管理互斥

    1.前言 访问一个被多任务共享,或是被任务与中断共享的资源时,需要采用”互斥”技术以保证数据在任何时候都保持一致性.这样做的目的是要确保任务从开始访问资源就具有排它性,直至这个资源又恢复到完整状态 F ...

  3. freeRTOS中文实用教程6--错误排查

    1.前言 本章主要是为刚接触FreeRTOS 的用户指出那些新手通常容易遇到的问题.这里把最主要的篇幅放在栈溢出以及栈溢出侦测上 2.printf-stdarg.c 当调用标准C 库函数时,栈空间使用 ...

  4. freeRTOS中文实用教程4--资源管理概述

    1.前言 多任务系统中存在一种潜在的风险.当一个任务在使用某个资源的过程中,即还没有完全结束对资源的访问时,便被切出运行态,使得资源处于非一致,不完整的状态 2.并发抢占导致错误的场景 (1)访问外设 ...

  5. freeRTOS中文实用教程3--中断管理之中断嵌套

    1.前言 最新的 FreeRTOS 移植中允许中断嵌套.中断嵌套需要在 FreeRTOSConfig.h 中设置configKERNEL_INTERRUPT_PRIORITY 和configMAX_S ...

  6. freeRTOS中文实用教程1--任务

    1.前言 FreeRTOS是小型多任务嵌入式操作系统,硬实时性.本章主要讲述任务相关特性及调度相关的知识. 2. 任务的总体特点 任务的状态 (1)任务有两个状态,运行态和非运行态 (2)任务由非运行 ...

  7. freeRTOS中文实用教程3--中断管理之中断服务例程中使用队列

    1.前言 消息队列不仅可以用于事件通信,还可以用来传递数据 2.实例说明消息队列的执行过程 3.主要API API名称 说明 参数 返回值 xQueueSendFromISR()完全等同于 xQueu ...

  8. freeRTOS中文实用教程3--中断管理之计数信号量

    1.前言 在中断不频繁的系统中,使用二值信号量没有问题,但是中断频繁发生时,则会有中断丢失的问题. 因为中断发生时延迟任务执行,延迟任务执行的过程中,如果又来了两次中断,则只会处理第一次,第二次将会丢 ...

  9. freeRTOS中文实用教程3--中断管理之延迟中断处理

    1.前言 嵌入式实时操作系统需要对整个系统环境产生的事件作出响应.可以采用中断方式也可以采用轮询方式来进行处理.如果采用中断方式,则希望ISR(中断服务例程)的处理时间越短越好. 注:必须说明的是,只 ...

随机推荐

  1. Nginx多进程高并发、低时延、高可靠机制在缓存(redis、memcache)twemproxy代理中的应用

    1. 开发背景 现有开源缓存代理中间件有twemproxy.codis等,其中twemproxy为单进程单线程模型,只支持memcache单机版和redis单机版,都不支持集群版功能. 由于twemp ...

  2. 架构师成长之路2.3-PXE+Kickstart无人值守大量部署Linux

    点击返回架构师成长之路 架构师成长之路2.3-PXE+Kickstart无人值守大量部署Linux 所谓的无人值守,就是自动应答,当安装过程中需要人机交互提供某些选项的答案时(如如何分区),自动应答文 ...

  3. 洛谷 P1381 单词背诵 解题报告

    P1381 单词背诵 题目描述 灵梦有\(n\)个单词想要背,但她想通过一篇文章中的一段来记住这些单词. 文章由\(m\)个单词构成,她想在文章中找出连续的一段,其中包含最多的她想要背的单词(重复的只 ...

  4. sklearn 的train_test_split

    train_test_split函数用于将矩阵随机划分为训练子集和测试子集,并返回划分好的训练集测试集样本和训练集测试集标签. 格式: from sklearn.model_selection imp ...

  5. 文件拷贝, 使用 BIO,NIO的对比,四种写法性能分析。

    测试环境: jdk 1.7 +  2G内存 测试代码基本上复制了: http://blog.csdn.net/tabactivity/article/details/9317143 1 2 3 4 5 ...

  6. 最短路算法模板--SPFA

    初见SPFA时,直接认成了优先队列优化的Dijkstra,经过几位大佬的指点,我终于明白了他们的差异. Dijkstra是保证已经出队过的点不再入队,SPFA是已经在队列中不再入队.比较起来,SPFA ...

  7. 线程Thread类

    进程:资源分配与调动的基本单位.如QQ.迅雷等每个独立运行的程序就是一个进程. 每一个进程可以有多个线程,如QQ可以收发信息.下载上传文件等. 多线程同时工作时,由CPU分配处理. public cl ...

  8. 初探VBScript

    初探VBScript 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.VBScript简介 VBScript ,Visual Basic Script的简称,是微软公司出品的脚本 ...

  9. Linux shell 自启动脚本写法

    直接上脚本内容 #!/bin/bash #chkconfig: 2345 80 90 #description:sniffer #第一行,告诉系统使用的shell,所以的shell脚本都是这样. #第 ...

  10. 函数和常用模块【day04】:函数式编程(六)

    本节内容 1.概述 2.介绍 3.定义 一.概述 每当提到函数式编程,很多人都以为就是我们经常写的函数.其实不然. 函数:是定义一段代码的执行过程 函数式编程:输入是确定的,输出也是确定的 二.介绍 ...