FreeRTOS--消息队列

2023-05-16

队列:

队列又称为消息队列,是一种用于任务间通信的数据结构,是一种异步通信方式,实现接收来自其他任务或者中断的不固定长度的消息,任务能够从队列中读取消息,当队列中消息是空的时,读取消息的任务被阻塞,用户可以指定阻塞任务的时间xTickToWait,当队列中有新消息,被阻塞的任务会被唤醒并处理消息。当等待的时间超过了指定的阻塞时间,即使队列中尚无有效数据,任务也会自动从阻塞态转为就绪态。遵守FIFO原则。

消息队列的运作机制:

   创建消息队列时,FreeRTOS先给消息队列分配一块内存空间,这块内存的大小等于消息队列控制块大小加上单个消息空间大小乘以消息队列长度,然后初始化消息队列,此时消息队列为空。当队列不再被使用,应该删除以释放系统资源,一旦操作完成,消息队列将被永久删除。

消息队列的阻塞机制:

   每个对消息读写的函数都有这种机制,称为阻塞机制,如果有任务A对某个队列进行读操作,发现没有消息,任务A有三种选择:第一个选择任务A不等,直接紧着运行,第二个选择,任务A等待一定的时间,等着消息的到来,第三种选择,任务A一直等,一直等到队列中有消息。在发送消息时为了保护数据,当且仅当队列允许入队时,发送者才能成功发送消息,队列中无效消息空间时,说明队列已经满了,系统根据用户指定的阻塞时间将任务阻塞,在指定的时间内,如果不能完成如对操作,发送消息的任务会收到一个错误码,然后接触阻塞状态。

消息队列的应用场景:

  用于发送不定长消息的场合,包括任务与任务之间的信息交换,发送到队列的消息是通过拷贝的方式实现的,意味着队列存储的是原始数据,不是原数据的引用。

消息队列常用函数:

消息队列创建函数 xQueueCreate():用于创建一个新的队列并返回这个队列的句柄。每创建一个队列就要为其分配RAM  一部分用于存储队列的状态 一部分用于作为消息队列的存储区域。使用该函数时  使用的是动态内存分配  使用该函数需要配置宏定义configSUPPORT_DYNAMIC_ALLOCATION为1

 消息队列的内存空间示意图:

 消息队列创建完成示意图:

//创建队列实例
 QueueHandle_t Test_Queue=NULL;
#define QUEUE_LEN 4 //队列长度
#define QUEUE_SIZE 4 //队列中每个消息的大小

BaseType_t xReturn=pdPASS;  //定义一个创建信息返回值  默认为pdPASS
taskENTER_CRITICAL() //进入临界区
 //创建test_queue
Test_Queue=xQueueCreate((UBaseType_t)QUEUE_LEN,(UBaseType_t)QUEUE_SIZE);
if(NULL!=Test_Queue)
    printf("创建成功!\n");
taskEXIT_CRITICAL  //退出临界区

消息队列删除函数:

    队列删除函数是根据消息队列句柄直接删除  删除之后这个消息队列的所有信息都会被系统回收清空 不能再次使用  消息队列删除函数的形参是消息队列的句柄

//队列删除实例
#define QUEUE_LENGTH 5
#define QUEUE_ITEM_SIZE 4
int main()
{
    QueueHandle_t xQueue;
    xQueue=xQueueCreate(QUEUE_LENGTH,QUEUE_ITEM_SIZE);
    if(xQueue==NULL){}
    else
    {
        vQueueDelete(xQueue);  //删除已创建的消息队列
    }
}

向消息队列发送消息函数:

  在中断服务程序或者任务中都可以给消息队列发送消息,如果队列未满,会将消息拷贝到消息队列的队尾,当发送紧急消息时,发送的位置时消息队列的对头而不是队尾,接受者就可以优先接收到紧急信息,从而即使进行消息处理。

//实用实例
static void Send_Task(void * parameter)
{
    BaseType_t xReturn=pdPASS;
    uint32_t send_data1=1;
    uint32_t send_data2=2;
    while(1)
     {
        if(Key_Scan(KEY1_GPIO_PORT,KET1_GPIO_PIN)==KEY_ON)
        {
                    xReturn=xQueueSend(Test_Queue,&send_data1,0);
                    if(pdPASS==xReturn)
                    {
                        printf("发送成功!\n");
                    }
        }
         if(Key_Scan(KEY2_GPIO_PORT,KET2_GPIO_PIN)==KEY_ON)
        {
                    xReturn=xQueueSend(Test_Queue,&send_data2,0);
                    if(pdPASS==xReturn)
                    {
                        printf("发送成功!\n");
                    }
        }
         vTask_Delay(20);
    }
}

   从消息队列中读取消息函数:

   xQueueReceive是一个宏定义,展开是调用函数xQueueGenericReceive,作用是从一个队列中接收消息并把消息从队列中删除,接受的消息以拷贝的形式进行,必须准备一个足够大的缓存空间。

 

//使用实例
static void Receive_Task(void *parameter)
{
    BaseType_t xReturn=pdTURE;
    uint32_t r_queue;  //接收消息的变量
    while(1)
    {
        xReturn=xQueueReceive(Test_Queue,&r_queue,portMAX_DELAY);
        if(pdTURE==xReturn)
            printf("本次接收到的消息是:\n");
         else
            printf("接收出错\n");

    }
}

消息队列使用注意事项:

1.使用xQueueSend,xQueueSendFromISR,xQueueReceive这些函数之前应该先创建消息队列 并根据句柄进行操作、

2.队列采用先进先出形式,会先读取存储在队列中的数据

3.在获取队列中的消息的时候  要定义一个存储数据的地方,并且该数据区域大小不小于消息大小

4.无论是发送或者是接收消息都是以拷贝的方式进行,如果消息过于庞大 可以将消息的地址作为消息进行发送和接收

5.队列是具有自己独立权限的内核对象  不属于任何任务 所有任务可以向同一队列中写入和独处

消息队列实验

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS--消息队列 的相关文章

  • 【FreeRTOS(三)】任务状态

    文章目录 任务状态 任务挂起 vTaskSuspend 取消任务挂起 vTaskResume 挂起任务调度器 vTaskSuspendAll 取消挂起任务调度器 xTaskResumeAll 代码示例 任务挂起 取消任务挂起 代码示例 挂起
  • Error: L6218E: Undefined symbol vApplicationGetIdleTaskMemory (referred from tasks.o).

    我用的是F103ZET6的板子 移植成功后 编译出现两个错误是关于stm32f10x it c 里 void SVC Handler void void PendSV Handler void 两个函数的占用问题 随后编译出现以下两个问题
  • FreeRTOS基础五:软件定时器

    软件定时器简介 软件定时器的作用 在指定的时间到来时执行指定的函数 或者以某个频率周期性地执行某个函数 被执行的函数叫做软件定时器回调函数 软件定时器由FreeRTOS内核实现 不需要硬件支持 软件定时器只有在软件定时器回调函数被调用时才需
  • FreeRTOS,串口中断接收中使用xQueueOverwriteFromISR()函数,程序卡死在configASSERT

    原因 UART的中断优先级设置的太高 高于了configMAX SYSCALL INTERRUPT PRIORITY宏定义的安全中断等级 UART的中断等级小于等于宏定义的优先等级即可
  • FreeRTOS笔记(一)简介

    这个笔记主要依据韦东山freertos快速入门系列记录 感谢韦东山老师的总结 什么是实时操作系统 操作系统是一个控制程序 负责协调分配计算资源和内存资源给不同的应用程序使用 并防止系统出现故障 操作系统通过一个调度算法和内存管理算法尽可能把
  • 啊哈C的简单使用

    打开啊哈C 新建一个程序输出hello world include
  • 基于STM32的FreeRTOS学习之中断测试实验(五)

    记录一下 方便以后翻阅 本章内容是接着上一章节进行的实际演练 1 实验目的 FreeRTOS可以屏蔽优先级低于configMAX SYSCALL INTERRUPT PRIORITY的中断 不会屏蔽高于其的中断 本次实验就是验证这个说法 本
  • Kafka实战——简单易懂的生产者消费者demo

    单线程版本适合本地调试 多线程版本适合做压测 1 引入maven依赖
  • Arduino IDE将FreeRTOS用于STM32

    介绍 适用于STM32F103C8的FreeRTOS STM32F103C是一种能够使用FreeRTOS的ARM Cortex M3处理器 我们直接在Arduino IDE中开始使用STM32F103C8的FreeRTOS 我们也可以使用K
  • FreeRTOS学习笔记(8)---- 软件定时器

    使用FreeRTOS软件定时器需要在文件FreeRTOSConfig h先做如下配置 1 configUSE TIMERS 使能软件定时器 2 configTIMER TASK PRIORITY 定时器任务优先级 3 configTIMER
  • RocketMQ 简介

    本文根据阿里云 RocketMQ产品文档整理 地址 https help aliyun com document detail 29532 html userCode qtldtin2 简介 RocketMQ是由阿里捐赠给Apache的一款
  • FreeRTOS轻量级同步--任务通知

    1 简介 在FreeRTOS的配置参数中的configUSE TASK NOTIFICATIONS宏打开 一般RTOS会默认打开 如图1所示 图1 notify宏开关 RTOS在创建任务时 会创建一个32位的通知值ulNotifiedVal
  • 关于rocketmq 中日志文件路径的配置

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 rocketmq 中的数据和日志文件默认都是存储在user home路径下面的 往往我们都需要修改这些路径到指定文件夹以便管理 服务端日志 网
  • kafka详解及集群环境搭建

    一 kafka详解 安装包下载地址 https download csdn net download weixin 45894220 87020758 1 1Kafka是什么 1 Kafka是一个开源消息系统 由Scala写成 是由Apac
  • RocketMQ-高级原理

    本节讲解下当MQ消息消费失败 或者发送不成功时如何处理消息 消息发送不成功一般存在于几种情况 网络原因 服务宕机 或者broker配置 消息发送失败 如果是由于broker配置原因 可以通过报错提示排查原因 无法查到路由信息 一般考虑到ro
  • RocketMQ第四篇 Rocket集群配置

    在实际开发中一般都会使用docker安装rocketMQ docker安装rocketmq如下 docker安装配置rocketmq docker安装rocketmq docker pull foxiswho rocketmq server
  • RabbitMQ(四):RabbitMQ高级特性

    消息队列在使用过程中 面临着很多实际问题需要思考 消息可靠性问题 如何确保发送的消息至少被消费 次 延迟消息问题 如何实现消息的延迟投递 消息堆积问题 如何解决数百万消息堆积 无法及时消费的问题 高可用问题 如何避免单点的MQ故障而导致的不
  • ESP32学习笔记05-串口事件方式读取数据

    串口中断方式处理数据 事件机构体 typedef struct uart event type t type lt UART event type size t size lt UART data size for UART DATA ev
  • 使用 GCC 编译器的 ARM 内核的堆栈回溯(当存在 MSP 到 PSP 切换时)

    核心 ARM Cortex M4 编译器 GCC 5 3 0 ARM EABI 操作系统 免费 RTOS 我正在使用 gcc 库函数 Unwind Reason Code Unwind Backtrace Unwind Trace Fn v
  • 如何将 void* 转换为函数指针?

    我在 FreeRTOS 中使用 xTaskCreate 其第四个参数 void const 是传递给新线程调用的函数的参数 void connect to foo void const task params void on connect

随机推荐

  • Zookeeper集群无法启动的原因分析

    Zookeeper集群无法启动的原因分析 xff1a centos7上搭建三台zookeeper xff0c 相关文件配置没有问题 问题描述 xff1a span class token punctuation span atguigu 6
  • 美女体验小米无人机4K版:直接解锁新手模式

    其实说实话 xff0c 这小米无人机4K版我们拿到手上已经挺长时间的了 但是奈何全北京禁飞 xff0c 所以一直没有机会飞飞看 xff0c 于是我们就在解禁之后的第一时间 xff0c 跑到了六环外为大家带来试飞 就让我们从开箱开始 xff0
  • intel realsense摄像头标定教程(win10环境)

    intel realsense摄像头标定教程 准备工具 Intel RealSense D400 Series Dynamic Calibration Toolsprint target fixed width pdf或者对应手机app I
  • TCP网络编程例子(C语言实现)

    说明 xff1a 之前在CSDN上找TCP编程时 xff0c 发现有各种版本 不同版本之间写法不一 xff0c 所以自己写了个C语言版本的 xff0c 记录下来 服务端代码 xff1a span class token comment TC
  • D435i相机的标定及VINS-Fusion config文件修改

    引言 当我们想使用D435i相机去跑VINS Fusion时 xff0c 如果不把标定过的相机信息写入config文件中就运行 xff0c 这样运动轨迹会抖动十分严重 xff0c 里程计很容易漂 接下来将介绍如何标定D435i相机 xff0
  • 【C语言】--- while(1)语句内的if(i--)的无限循环

    例子 span class token macro property span class token directive keyword include span span class token string lt stdio h gt
  • uC/OS-III移植后发现程序停在空闲任务出不来

    今天移植了一下UCOS III的源码到STM32F103RCT6的板子上 xff0c 然后发现在所有任务都初始化完成后 xff0c 使用OSTimeDlyHMSM函数进行延时后就再也跳不出空闲任务了 xff0c 当时还以为是在移植程序的时候
  • 对uC/OS-III时钟节拍运转机制的一点理解

    目录 如何产生时基信号系统时钟中断管理时基任务时基列表更新写在最后 我在初学uC OS III的时候 xff0c 时基产生后到底是如何去驱动操作系统运转的 xff0c 对于这个问题一直有很多疑问 xff0c 最后读了手册并且仔细推敲源码后终
  • Altium Designer 常见的问题和解决办法,常更!

    本人的Altium Designer 版本是18 1 8 问题1 xff1a AD左上角有一个坐标显示框 xff0c 今天按键盘不小心弄没了 xff0c 然后弄出来后发现又会随着鼠标移动跟着移动 xff0c 不再固定到左上角了 相关解释 x
  • 推荐一款串口调试助手(win10,无广告,功能齐全,操作简单)

    目录 1 安装2 打开软件3 测试功能4 使用脚本功能5 波形显示功能6 升级专业版 作为一个搞嵌入式软件的 xff0c 串口是我们经常需要使用的一个外设资源 xff0c 对应的我们在调试的时候就需要用到一些工具 xff0c 本人也用过目前
  • STM32L1单片机的ADC必须开启HSI才能工作

    之前玩过F1和F4的板子 xff0c 这段时间 xff0c 接个项目需要用低功耗 xff0c 所以就整了STM32L151单片机 xff0c 然后今天在写ADC的时候 xff0c 发现了一个问题 xff0c 就是STM32L151MCU必须
  • 深入理解Linux文件系统与日志文件,快来看!

    目录 一 inode与block1 1 inode和block概述1 2 inode的内容 1 11 3 inode的内容 1 21 4 inode的内容 1 31 5 inode的号码1 6 文件存储小结1 7 inode的大小1 8 i
  • AT 指令集详解

    AT 指令集详解 1 AT的历史与应用1 1 AT的历史1 2 AT的优点1 3 AT命令与ppp协议的关系 2 AT的命令格式3 DCE的状态切换与AT的命令拨号流程3 1 初始化DCE的Modem设备3 2 拨号连接3 3 数据传输及处
  • 幽暗的廊桥,热烈的遗梦:火了25年的中年“杰克苏”童话

    廊桥是一种有遮盖的桥梁 路人经过一段幽暗隐蔽的空间后 xff0c 已身在彼岸 廊桥遗梦 的作者罗伯特 詹姆斯 沃勒于2017年3月10日凌晨 xff0c 在美国德克萨斯州弗雷德里克斯堡的家中去世 xff0c 享年77岁 作者当年如有神助 x
  • STM32L152 实现电源电压采集 基于HAL库实现

    CudeMX中对相关ADC的配置 这里用ADC1的通道17 keil中 自己编写 ADC Getvalue的值的函数 在主函数中调用 在debug模式下 可以在watch窗口中看见相关值 单位为mv
  • 基本共射放大电路的动态分析以及放大电路Q点的稳定

    求解静态 xff1a 直流通路 xff1a VCC 61 Ubeq 43 Ibq Rb gt Ibq gt Ieq 2 动态分析 xff1a 交流通路 xff1a H参数等效 xff1a 在放大过程中 xff1a 动态的Ube秉承动态的Ib
  • FreeRTOS 创建任务

    用已经移植好的工程模板 创建一个简单的任务 xff08 电量LED灯 xff09 1 硬件初始化 需要用到开发板上的LED灯小江LED灯相关的函数初始化 xff0c 在main c中创建一个Init xff08 xff09 函数 xff0c
  • 差分放大电路及动态分析

    由温度引起的零点漂移成为温漂 xff0c 引入负反馈 加入Re电阻 从抑制温度漂移的角度来说 希望Re越大越好 但是会导致放大倍数变小 加一个镜像的电路可以让两边一起浮动 但是两个Re可以共用一个 于是改成下面的 形式 Re电阻现在的作用变
  • FreeRTOS的启动流程

    目前的RTOS中有两种比较流行的启动方式 万事俱备 只欠东风 xff1a 在main函数中将硬件初始化 xff0c rtos系统初始化 xff0c 所有任务的创建都完成 再启动RTOS的调度器 xff08 在刚刚创建的的任务中选择一个优先级
  • FreeRTOS--消息队列

    队列 xff1a 队列又称为消息队列 xff0c 是一种用于任务间通信的数据结构 xff0c 是一种异步通信方式 xff0c 实现接收来自其他任务或者中断的不固定长度的消息 xff0c 任务能够从队列中读取消息 xff0c 当队列中消息是空