【正点原子FreeRTOS学习笔记】————(13)队列集

这里写目录标题

  • 一、队列集简介(了解)
  • 二、队列集相关API函数介绍(熟悉)
  • 三、队列集操作实验(掌握)

一、队列集简介(了解)

一个队列只允许任务间传递的消息为同一种数据类型,如果需要在任务间传递不同数据类型的消息时,那么就可以使用队列集 !
作用:用于对多个队列或信号量进行“监听”,其中不管哪一个消息到来,都可让任务退出阻塞状态
假设:有个接收任务,使用到队列接收和信号量的获取,如下:
在这里插入图片描述

二、队列集相关API函数介绍(熟悉)

在这里插入图片描述

QueueSetHandle_t xQueueCreateSet( const UBaseType_t uxEventQueueLength );

此函数用于创建队列集。
在这里插入图片描述

BaseType_t xQueueAddToSet( QueueSetMemberHandle_t xQueueOrSemaphore ,
QueueSetHandle_t xQueueSet );

此函数用于往队列集中添加队列,要注意的是,队列在被添加到队列集之前,队列中不能有有效的消息
在这里插入图片描述

BaseType_t xQueueRemoveFromSet( QueueSetMemberHandle_t xQueueOrSemaphore , QueueSetHandle_t xQueueSet );

此函数用于从队列集中移除队列, 要注意的是,队列在从队列集移除之前,必须没有有效的消息
在这里插入图片描述

QueueSetMemberHandle_t xQueueSelectFromSet( QueueSetHandle_t xQueueSet, TickType_t const xTicksToWait )

此函数用于在任务中获取队列集中有有效消息的队列
在这里插入图片描述

三、队列集操作实验(掌握)

1、实验目的:学习 FreeRTOS 的队列集相关API的使用。
2、实验设计:将设计三个任务:start_task、task1、task2
三个任务的功能如下:
在这里插入图片描述

QueueSetHandle_t queueset_handle;
QueueHandle_t    queue_handle;
QueueHandle_t    semphr_handle;

void start_task( void * pvParameters )
{
    taskENTER_CRITICAL();                               /* 进入临界区 */
    queueset_handle = xQueueCreateSet( 2 );             /* 创建队列集,可以存放2个队列 */
    if(queueset_handle != NULL)
    {
        printf("队列集创建成功!!\r\n");
    }
    
    queue_handle = xQueueCreate( 1, sizeof(uint8_t) );  /* 创建队列 */ 
    semphr_handle = xSemaphoreCreateBinary();           /* 创建二值信号量 */
    
    xQueueAddToSet( queue_handle,queueset_handle);
    xQueueAddToSet( semphr_handle,queueset_handle);
    
    xTaskCreate((TaskFunction_t         )   task1,
                (char *                 )   "task1",
                (configSTACK_DEPTH_TYPE )   TASK1_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK1_PRIO,
                (TaskHandle_t *         )   &task1_handler );
                
    xTaskCreate((TaskFunction_t         )   task2,
                (char *                 )   "task2",
                (configSTACK_DEPTH_TYPE )   TASK2_STACK_SIZE,
                (void *                 )   NULL,
                (UBaseType_t            )   TASK2_PRIO,
                (TaskHandle_t *         )   &task2_handler );
                             
    vTaskDelete(NULL);
    taskEXIT_CRITICAL();                /* 退出临界区 */
}

/* 任务一,实现队列发送以及信号量释放 */
void task1( void * pvParameters )
{
    uint8_t key = 0;
    BaseType_t err = 0;
    while(1) 
    {
        key = key_scan(0);
        if(key == KEY0_PRES)
        {
            err = xQueueSend( queue_handle, &key, portMAX_DELAY );
            if(err == pdPASS)
            {
                printf("往队列queue_handle写入数据成功!!\r\n");
            }
        }else if(key == KEY1_PRES)
        {
            err = xSemaphoreGive(semphr_handle);
            if(err == pdPASS)
            {
                printf("释放信号量成功!!\r\n");
            }
        }
        vTaskDelay(10);
    }
}

/* 任务二,获取队列集的消息 */
void task2( void * pvParameters )
{
    QueueSetMemberHandle_t member_handle;
    uint8_t key;
    while(1)
    {
        member_handle = xQueueSelectFromSet( queueset_handle,portMAX_DELAY);
        if(member_handle == queue_handle)
        {
            xQueueReceive( member_handle,&key,portMAX_DELAY);
            printf("获取到的队列数据为:%d\r\n",key);
        }else if(member_handle == semphr_handle)
        {
            xSemaphoreTake( member_handle, portMAX_DELAY );
            printf("获取信号量成功!!\r\n");
        }
    }
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/492547.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙开发之了解ArkTS

鸿蒙开发者官网 : https://developer.huawei.com/consumer/cn/ 开发鸿蒙要用的软件是 DevEco Studio ArkTS建立在JS和TS的基础之上,扩展了声明式UI开发范式和状态管理,提供更简洁和自然的开发方式。 ArkTS引入了渲染引擎的增强&#xff0c…

centos7 linux下yum安装redis

安装redis 1.检查是否有redis yum 源 yum install redis2.下载fedora的epel仓库 yum install epel-release3.安装redis数据库 yum install redis4.安装完毕后,使用下面的命令启动redis服务 # 启动redis service redis start# 停止redis service redis stop# 查…

UOS、Linux下的redis的详细部署流程(适用于内网)

提示:适用于Linux以及UOS等内外网系统服务器部署。 文章目录 一.上传离线包二.部署基本环境三.解压并安装redis四.后台运行redis五.uos系统可能遇到的问题六.总结 一.上传离线包 1.自己去Redis官网下载适配自己部署系统的redis安装包。 2.通过文件传输工具&#xf…

精酿啤酒屋:畅饮与文化的交汇点

在城市的繁华之中,Fendi Club啤酒屋犹如一颗璀璨的明珠,吸引着无数寻求文化与享受的人们。它不仅仅是一个提供美酒佳肴的地方,更是一个文化和社交的交汇点。 走进Fendi Club,你会被它与众不同的环境所吸引。暗色调的装饰风格&…

Python机器学习赋能GIS:地质灾害风险评价的新方法论

地质灾害是指全球地壳自然地质演化过程中,由于地球内动力、外动力或者人为地质动力作用下导致的自然地质和人类的自然灾害突发事件。由于降水、地震等自然作用下,地质灾害在世界范围内频繁发生。我国除滑坡灾害外,还包括崩塌、泥石流、地面沉…

NO11 蓝桥杯单片机之DS18B20数字温度计

DS18B20数字温度计这个模块和以往单片机学习的模块可能不同,这里还要知道其头文件(.h)和.c文件代码的理解。 具体这个温度计是怎么实现检测温度的,呃呃呃呃呃这可能就要去查阅专业资料,涉及的知识体系应该很庞大&…

ABNDP: Co-optimizing Data Access and Load Balance in Near-Data Processing——论文泛读

ASPLOS 2023 Paper 论文阅读笔记整理 问题 近数据处理(NDP)是一种很有前途的体系结构范式,可以解决数据密集型应用程序的内存墙挑战。基于3D堆叠存储器的典型NDP系统包含大量并行处理单元,每个并行处理单元都可以访问其本地存储…

YOLOv9改进策略:block优化 | SEAM提升小目标遮挡物性能

💡💡💡本文改进内容:SEAM提升小目标遮挡物性能,在多个数据集得到很好的验证 改进结构图如下: YOLOv9魔术师专栏 ☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️☁️ ☁️☁️☁️…

Github实现push触发自动构建(包括提交代码到另一个仓库中和发布npm)

将指定内容自动更新到另一个代码仓库中 登录https://github.com,创建Personal access token: (1)github右上角,点击头像,进入Settings > Developer settings > Personal access tokens 下面的Tokens …

一名00后程序员初次使用低代码开发平台的感受

前言 大家好,我是小代,一名00后的Java后端开发工程师。我热爱编程,希望通过写博客来分享我的学习经验和心得。最近,我加入了一家专注于低代码开发平台的公司,这里的技术挑战和新颖性让我决定开始我的博客之旅。 工作…

3.1 SQL概述

SQL(Structured Query Language) 结构化查询语言,是关系数据库的标准语言 SQL是一个通用的、功能极强的关系数据库语言 功能:查询,数据库模式创建,数据库数据的插入与修改,数据库完整性、安全…

影响欧美货币对因素?fpmarkets提醒如何避免陷阱

欧元兑美元汇率不仅取决于美国经济数据,还取决于欧洲央行的报告。 美国经济数据不仅包括美联储利率和美国就业报告,还有美国石油储备、汽油储备和页岩油钻井平台数量的报告。fpmarkets发现更谨慎的投资者还会分析失业数据、平均时薪变化这些更细致的数据…

1.使用eNSP绘制拓扑图实训

1.实训目的 掌握使用eNSP绘制拓扑图的方法。 2.应用环境 某企业需要提升自己的网络环境,为了保证项目顺利的实施,需要使用eNSP事先绘制拓扑图。 3.实训设备 安装有eNSP的计算机。 4.实训内容 按照设…

矿场设备远程监控解决方案

矿场设备远程监控解决方案 在现代工业智能化进程中,针对矿场设备远程监控的解决方案显得尤为重要。这一方案旨在通过集成先进的信息技术与物联网技术,实现对矿场各类设备的实时、精准、高效的远程监控和管理,从而优化生产效率,降…

WHM中启用FTP功能

WHM面板上FTP功能默认是禁用的,我们在创建完cPanel账户之后,用到FTP去登录的时候会发现登录受限,这个时候可以去WHM面板上启用,这边以Hostease的独立服务器并且购买了cPanel面板为例,步骤如下: 1.先登陆WH…

what is apache?

Apache 通常指 Apache Software Foundation (ASF) 或 Apache HTTP Server,两者都是计算机软件领域的重要实体。 Apache 软件基金会 (ASF):Apache 软件基金会是一个开发开源软件项目的非营利组织。它为涵盖软件开发各个方面的广泛项目提供支持&#xff0c…

01背包-动态规划

01背包 易知状态转移方程为: dp[i][j] max(dp[i-1][j],dp[i-1][j-v[i]]w[i]) 代码 N,V map(int,input().split()) v, w [0],[0] # 体积v,价值w for i in range(N):a list(map(int,input().split()))v.append(a[0]) # 体积viw.append(a[1]) # 价值w…

【牛客】【刷题节】美团2024届秋招笔试第一场编程真题

1.小美的外卖订单【简单题】 题意理解: 这道题是简单题,主要是一个逻辑实现和判断的问题。但是简单题一般喜欢加一点小障碍,所以读题的时候就要比较注意一些约束条件。就比如这道题:过了15/20个测试用例,出现error, 当…

基于ssm的社区文化宣传网站论文

摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,社区文化宣传网站当然也不能排除在外。社区文化宣传网站是以实际运用为开发背景,运用软件工程开发方法&…

奇舞周刊第523期:来自 rust 生态的强烈冲击?谈谈 Leptos 在语法设计上的精妙之处...

奇舞推荐 ■ ■ ■ 来自 rust 生态的强烈冲击?谈谈 Leptos 在语法设计上的精妙之处 过去很长一段时间,前端框架们都在往响应式的方向发展。同时又由于 React hooks 的深远影响,函数式 响应式成为了不少前端心中最理想的前端框架模样。Solid …