0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看威廉希尔官方网站 视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

FreeRTOS消息队列介绍

麦辣鸡腿堡 来源:嵌入式Linux系统开发 作者:嵌入式Linux系统开 2023-07-06 16:58 次阅读

队列是为了任务与任务、任务与中断之间的通信而准备的,可以在任务与任务、任务与中断之间传递消息,队列中可以存储有限的、大小固定的数据项目。任务与任务、任务与中断之间要交流的数据保存在队列中,叫做队列项目。队列所能保存的最大数据项目数量叫做队列的长度,创建队列的时候会指定数据项目的大小和队列的长度。

通常队列采用先进先出(FIFO)的存储缓冲机制,也就是往队列发送数据的时候(也叫入队)永远都是发送到队列的尾部,而从队列提取数据的时候(也叫出队)是从队列的头部提取的。但是也可以使用

LIFO 的存储缓冲,也就是后进先出,FreeRTOS 中的队列也提供了 LIFO 的存储缓冲机制。

数据发送到队列中会导致数据拷贝,也就是将要发送的数据拷贝到队列中,这就意味着在队列中存储的是数据的原始值,而不是原数据的引用(即只传递数据的指针),这个也叫做值传递。UCOS

的消息队列采用的是引用传递,传递的是消息指针。采用引用传递的话消息内容就必须一直保持可见性,也就是消息内容必须有效,那么局部变量这种可能会随时被删掉的东西就不能用来传递消息,但是采用引用传递会节省时间啊!因为不用进行数据拷贝。

采用值传递的话虽然会导致数据拷贝,会浪费一点时间,但是一旦将消息发送到队列中原始的数据缓冲区就可以删除掉或者覆写,这样的话这些缓冲区就可以被重复的使用。FreeRTOS中使用队列传递消息的话虽然使用的是数据拷贝,但是也可以使用引用来传递消息啊,我直接往队列中发送指向这个消息的地址指针不就可以了!这样当我要发送的消息数据太大的时候就可以直接发送消息缓冲区的地址指针,比如在网络应用环境中,网络的数据量往往都很大的,采用数据拷贝的话就不现实。

1、多任务访问

队列不是属于某个特别指定的任务的,任何任务都可以向队列中发送消息,或者从队列中提取消息。

2、出队阻塞

当任务尝试从一个队列中读取消息的时候可以指定一个阻塞时间,这个阻塞时间就是当任务从队列中读取消息无效的时候任务阻塞的时间。出队就是就从队列中读取消息,出队阻塞是针对从队列中读取消息的任务而言的。

比如任务 A 用于处理串口接收到的数据,串口接收到数据以后就会放到队列 Q 中,任务 A 从队列 Q 中读取数据。但是如果此时队列 Q

是空的,说明还没有数据,任务 A 这时候来读取的话肯定是获取不到任何东西,那该怎么办呢?任务 A

现在有三种选择,一:二话不说扭头就走,二:要不我在等等吧,等一会看看,说不定一会就有数据了,三:死等,死也要等到你有数据!选哪一个就是由这个阻塞时间决定的,这个阻塞时间单位是时钟节拍数。阻塞时间为

0 的话就是不阻塞,没有数据的话就马上返回任务继续执行接下来的代码,对应第一种选择。如果阻塞时间为 0~

portMAX_DELAY,当任务没有从队列中获取到消息的话就进入阻塞态,阻塞时间指定了任务进入阻塞态的时间,当阻塞时间到了以后还没有接收到数据的话就退出阻塞态,返回任务接着运行下面的代码,如果在阻塞时间内接收到了数据就立即返回,执行任务中下面的代码,这种情况对应第二种选择。当阻塞时间设置为portMAX_DELAY

的话,任务就会一直进入阻塞态等待,直到接收到数据为止!这个就是第三种选择。

3、入队阻塞

入队说的是向队列中发送消息,将消息加入到队列中。和出队阻塞一样,当一个任务向队列发送消息的话也可以设置阻塞时间。比如任务 B 向消息队列 Q

发送消息,但是此时队列 Q 是满的,那肯定是发送失败的。此时任务 B 就会遇到和上面任务 A 一样的问题,这两种情况的处理过程是类似的,只不过一个是向队列 Q

发送消息,一个是从队列 Q 读取消息而已。

4、队列操作过程图示

图片图片图片图片图片

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5085

    文章

    19138

    浏览量

    305731
  • 数据
    +关注

    关注

    8

    文章

    7067

    浏览量

    89116
  • FreeRTOS
    +关注

    关注

    12

    文章

    484

    浏览量

    62216
收藏 人收藏

    评论

    相关推荐

    基于FreeRTOS的STM32F103系统—队列

    FreeRTOS中,队列是实现任务之间同步、互斥和通信的一种重要方法(其他的实现方法有:任务通知、事件组、信号量、互斥量)。
    的头像 发表于 11-10 11:37 1153次阅读
    基于<b class='flag-5'>FreeRTOS</b>的STM32F103系统—<b class='flag-5'>队列</b>

    转:第20章 FreeRTOS消息队列

    第20章FreeRTOS消息队列 本章节为大家讲解FreeRTOS的一个重要的通信机制----消息队列,初学者要熟练掌握,因为消息队列在实际
    发表于 09-04 14:41

    FreeRTOS创建消息队列问题如何解决

    刚开始学习FreeRTOS,用的是STM32F103RCT6,目前创建了三个任务,运行指示灯、按键、显示。其中显示任务里是暂时还没有具体的代码,按键任务准备使用队列传递按键值。现在的问题是这样
    发表于 07-19 08:03

    FreeRTOS中的队列如何使用?

    FreeRTOS中的队列如何使用?
    发表于 12-09 06:24

    FreeRTOS消息队列有何作用

    FreeRTOS消息队列 & ESP32实战FreeRTOS消息队列FreeRTOS的消息队列
    发表于 01-27 06:53

    FreeRTOS源码介绍

    。而且一些常用的功能,队列,内存管理,信号量之类的,都有,基本上彻底弄懂一个,对以后理解别的也有帮助。1. FreeRTOS介绍FreeRTOS其实不用再多
    发表于 02-14 07:42

    FreeRTOS消息队列和RT-Thread消息队列的使用注意事项介绍

    一、FreeRTOS消息队列1.1 创建消息队列xQueueHandle xQueueCreate( unsigned portBASE_TYPE uxQueueLength, // 队列
    发表于 05-25 15:32

    FreeRTOS消息队列 & ESP32使用

    FreeRTOS消息队列 & ESP32实战FreeRTOS消息队列FreeRTOS的消息队列
    发表于 12-03 17:51 1次下载
    <b class='flag-5'>FreeRTOS</b>消息<b class='flag-5'>队列</b> & ESP32使用

    FreeRTOS学习(五)消息队列和二值信号量 xQueue / xSemaphore

    消息队列可以和中断 人物间发送和接受不定长的消息,在消息队列中会使任务进入阻塞。 可以在调度器开始前,创建消息队列。#include "FreeRTOS.h"#include
    发表于 12-04 20:06 7次下载
    <b class='flag-5'>FreeRTOS</b>学习(五)消息<b class='flag-5'>队列</b>和二值信号量 xQueue / xSemaphore

    FreeRTOS消息队列 传递结构体指针和结构体异同

    FreeRTOS消息队列 传递结构体指针和结构体异同
    发表于 12-08 12:06 6次下载
    <b class='flag-5'>FreeRTOS</b>消息<b class='flag-5'>队列</b> 传递结构体指针和结构体异同

    FreeRTOS 队列 信号量 互斥量

    文章目录前言Queue 队列semaphore 信号量Mutex 互斥量微信公众号前言FreeRTOS STM32CubeMX配置 内存管理 任务管理上节介绍了用STM32CubeMX生成带
    发表于 12-09 09:51 0次下载
    <b class='flag-5'>FreeRTOS</b> <b class='flag-5'>队列</b> 信号量 互斥量

    FreeRTOS高级篇5---FreeRTOS队列分析

    FreeRTOS提供了多种任务间通讯方式,包括:任务通知(版本V8.2以及以上版本)队列二进制信号量计数信号量互斥量递归互斥量其中,二进制...
    发表于 01-26 17:40 9次下载
    <b class='flag-5'>FreeRTOS</b>高级篇5---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>队列</b>分析

    FreeRTOS系列第18篇---FreeRTOS队列API函数

    FreeRTOS为操作队列提供了非常丰富的API函数,包括队列的创建、删除,灵活的入队和出队方式、带中断保护的入队和出队等等。下面就来详细...
    发表于 01-26 17:44 11次下载
    <b class='flag-5'>FreeRTOS</b>系列第18篇---<b class='flag-5'>FreeRTOS</b><b class='flag-5'>队列</b>API函数

    FreeRTOS的消息队列

    基于 FreeRTOS 的应用程序由一组独立的任务构成——每个任务都是具有独立权限的程序。这些独立的任务之间的通讯与同步一般都是基于操作系统提供的IPC通讯机制,而FreeRTOS 中所有的通信与同步机制都是基于队列实现的。
    的头像 发表于 02-14 09:56 901次阅读
    <b class='flag-5'>FreeRTOS</b>的消息<b class='flag-5'>队列</b>

    FreeRTOS消息队列结构体

    有一个结构体用于描述队列,叫做 Queue_t,这个结构体在文件 queue.c 中定义。 3、队列创建 在使用队列之前必须先创建队列,有两种创建
    的头像 发表于 07-06 17:03 1116次阅读
    <b class='flag-5'>FreeRTOS</b>消息<b class='flag-5'>队列</b>结构体