FreeRTOS实时操作系统(十一)队列集

news2024/11/26 0:54:31

系列文章目录


文章目录

  • 系列文章目录
  • 队列集简介
  • 相关API函数
    • 队列集创建函数
    • 队列集中移除函数
    • 队列集中获取有消息的队列
  • 实验测试:


队列集简介

队列只允许传递一种数据类型,队列集可以传递多种消息。

作用:用于对多个队列或信号量进行“监听”,其中不管哪一个消息到来,都可让任务退出阻塞状态

相关API函数

函数描述
xQueueCreateSet()创建队列集
xQueueAddToSet()队列添加到队列集中
xQueueRemoveFromSet()从队列集中移除队列
xQueueSelectFromSet()获取队列集中有有效消息的队列
xQueueSelectFromSetFromISR()在中断中获取队列集中有有效消息的队列

队列集创建函数

BaseType_t xQueueAddToSet( QueueSetMemberHandle_t  xQueueOrSemaphore , QueueSetHandle_t  xQueueSet); 

往队列集中添加队列,在被添加到队列集之前,队列中不能有有效的消息。

形参:
xQueueOrSemaphore:待添加的队列句柄
xQueueSet :队列集

返回值:
pdPASS :队列集添加队列成功
pdFAIL :队列集添加队列失败

队列集中移除函数

BaseType_t   xQueueRemoveFromSet( QueueSetMemberHandle_t  xQueueOrSemaphore ,QueueSetHandle_t  xQueueSet ); 

从队列集中移除队列,在从队列集移除之前,必须没有有效的消息

形参:
xQueueOrSemaphore:待移除的队列句柄
xQueueSet :队列集

返回值:
pdPASS :队列集移除队列成功
pdFAIL :队列集移除队列失败

队列集中获取有消息的队列

QueueSetMemberHandle_t     xQueueSelectFromSet( QueueSetHandle_t xQueueSet,TickType_t const xTicksToWait )

用于在任务中获取队列集中有有效消息的队列

形参:
xQueueSet:队列集
xTicksToWait:阻塞超时时间

返回值:
NULL:获取消息失败
其他值 :获取到消息的队列句柄

实验测试:

将宏configUSE_QUEUE_SETS置1
在这里插入图片描述

#include "semphr.h"
int fputc(int ch,FILE *f)
{
	HAL_UART_Transmit(&huart1,(uint8_t *)&ch,1,0xffff);
	return ch;
}

TaskHandle_t    task1_handler;

#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128
TaskHandle_t    task1_handler;
void task1( void * pvParameters );

/* TASK2 任务 配置
 * 包括: 任务句柄 任务优先级 堆栈大小 创建任务
 */
#define TASK2_PRIO         3
#define TASK2_STACK_SIZE   128
TaskHandle_t    task2_handler;
void task2( void * pvParameters );

QueueSetHandle_t queueset_handle;
QueueHandle_t    queue_handle;
QueueHandle_t    semphr_handle;


void vTaskCode( void * pvParameters )
 {	 
    taskENTER_CRITICAL();               /* 进入临界区 */
    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();                /* 退出临界区 */
 }
 
QueueHandle_t mutex_semphore_handle;

 // Function that creates a task.
 void vOtherFunction( void )
 {
	 
	 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( vTaskCode, "tak1", 128, NULL, 1, &task1_handler );
	vTaskStartScheduler();
 }
 
 //实现队列发送和信号量释放
void task1( void * pvParameters )
{
    BaseType_t err = 0;
	BaseType_t err1 = 0;
	uint8_t key=1;
	err = xQueueSend( queue_handle, &key, portMAX_DELAY );
	if(err == pdPASS)
	{
		printf("往队列queue_handle写入数据成功!!\r\n");
	}
	 err1 = xSemaphoreGive(semphr_handle);
	if(err1 == pdPASS)
	{
		printf("释放信号量成功!!\r\n");
	}
	
	
    while(1) 
    {
        vTaskDelay(100);
    }
}

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");
        }
		vTaskDelay(10);
    }
}

在这里插入图片描述
实验说明:由于task1的优先级比task2低,所以先执行task2,获取任务列中有消息的队列,此时没有,进入等待消息阻塞,之后task1执行,先写入队列1,之后回到task2进行了数据获取,之后才回到task1去printf(“往队列queue_handle写入数据成功!!\r\n”);,之后信号量是因为task2进入vTaskDelay阻塞,所以task1才能全部运行完

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PicoNeo neo入门教程2 SDK

目前在使用的是Unity XR SDK V2.x, 当前版本2.2.0版本 查看文档,有更新日志。 api接口:API 接口函数 - PICO 开发者平台

Pytorch TensorRT 安装使用流程

1.安装GPU驱动与Cudnn(注意版本对应) 2.安装TensorRT 安装流程1 安装流程2 3. 权值.pth文件转为Onnx 3.Onnx 文件本地化 .engine 文件(与本机算力有关) 执行命令: trtexec --onnx./resnet.onnx --saveEngineresn…

MongoDB【MongoDB应用实战】(四)-全面详解(学习总结---从入门到深化)

目录 MongoDB应用实战 多键索引 多键索引用于为数组中的元素创建索引 先创建集合inventory,使用下面的数据来创建多键索引 [{ _id: 5, type: "food", item: "aaa", ratings:[ 5, 8, 9 ] }, { _id: 6, type: "food", item: "b…

2023年7月4日 星期二 linux驱动作业

Linux内核驱动开发板的灯的实验 头文件 #ifndef __HEAD_H__ #define __HEAD_H__#define PHY_LED1_MODER 0X50006000 #define PHY_LED1_ODR 0X50006014 #define PHY_RCC 0X50000A28#define PHY_LED2_MODER 0X50007000 #define PHY_LED2_ODR 0x50007014#define PHY_LED…

LK409.最长回文字符串

题目描述 给定一个包含大写字母和小写字母的字符串 s ,返回 通过这些字母构造成的 最长的回文串 。 在构造过程中,请注意 区分大小写 。比如 “Aa” 不能当做一个回文字符串。 解题思路 有两种情况可以构成回文字符串: 1.全部字符呈偶数对出现 2.一…

simulink 仿真时间 求解器 数据类型 delay模块

仿真时间,模型运行的时长 显示数据类型,改完数据类型后要run一次才能正常显示更改后的类型 delay模块,延时步长 综合训练 搭建一个累加器,每次调用1 //c语言 static int a 0; a;

一次搞懂ArrayBuffer和Unit8Array(TypedArray)和Array!

实现入职第三天,用到了公司自研框架里面的网络请求,返回的数据会被自动改成ArrayBuffer类型,研究了半天没明白ArrayBuffer怎么转成字符串数据,看了mentor发来的示例代码,经过一番研究也是明白了ArrayBuffer和它相关的东…

Python基础教程:读写文件IO操作

Python 是一门优秀的开发语言,它不仅是一种动态的脚本语言,还支持多种应用场景。在 Python 中,我们可以使用文件和 I/O 操作来读取和写入文件。它比起其他编程语言,使用更加方便。 1.读写文本文件 在 Python 中,读写…

【轴承RUL预测代码】基于DRSN(深度残差收缩网络)

DRSN(深度残差收缩网络)和完整Transformer(encoderdecoder) DRSN(深度残差收缩网络)模型的代码模型的打印训练与预测训练集的可视化:测试集的可视化: DRSN-TCN的效果 DRSN&#xff0…

贝叶斯与认知——读《贝叶斯的博弈》有感

关于对贝叶斯与认知问题的相关思考 一、贝叶斯定理二、贝叶斯与认知的本质三、经验的偏见四、总结 自古以来,人们就在思考知识来自何处,“冯翼惟象,何以识之?”,对此的思考逐渐发展成哲学的认识论分支。德国哲学家康德…

二十三种设计模式第十六篇--观察者模式

观察者模式是一种行为型设计模式,它建立了一种对象间的一对多依赖关系,使得当一个对象的状态发生变化时,所有依赖于它的对象都会得到通知并自动更新。这种模式可以实现对象间的松耦合通信,提高系统的可扩展性和灵活性。 观察者模…

开源白盒 静态代码分析对比

背景 源代码安全检测是安全开发流程(SDL)中非常重要的一部分,在58集团的CI/CD流程里面临每天几千数量级的构建及发布,白盒检测的自动化能力显得极为重要。白盒扫描从漏洞发现的需求转变为了需要适应企业CI/CD流程的白盒建设需求&…

Win2008 IIS TLS1.0升级到TLS1.2或TLS1.3

最近chrome和Edege浏览器已经把TLS 1.0标记为不安全了。 如果是开发网站,而使用的TLS 1.0,则直接打开不网站,也没有醒目的提示,你很难知道问题所在,总以为是SSL安装失败了,其实是TSL版本太低了。 如果是开…

密码学学习笔记(六):Hash Functions - 哈希函数2

哈希函数是怎么构成的? Merkle–Damgrd结构 哈希函数需要能够处理任意长度的输入。许多散列函数,例如MD5、SHA-1、SHA-2,都是由构建块(称为压缩函数)组成的,这些构建块可以处理特定的块大小,并…

SSM 整合 Shiro 安全框架【快速入门】

一、搭建ssm工程&#x1f349; 1.创建工程&#x1f95d; 更改web路径 创建所需目录 2.引入依赖&#x1f95d; <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"h…

LVS+Keepalived负载均衡高可用群集

目录 一、Keepalived高可用详解 1.应用场景 2.介绍和原理简介 3.主要模块和作用 二、LVSkeepalived配置实例&#xff08;抢占模式&#xff09; 1.配置NFS共享存储器 2.配置节点web服务&#xff08;两台的配置相同&#xff09; 3.配置主备LVSkeepalived负载调度器 三、非…

JAVA判断当前时间是否为节假日、周末、工作日,简单有效!

JAVA判断当前时间是否为节假日、周末、工作日 需求 有这么个需求&#xff0c;需要判断拿到的这个日期是否为节假日&#xff0c;周末&#xff0c;工作日&#xff0c;然后做剩下的操作。 话不多说&#xff0c;上代码 1.首先需要拿到节假日api 节假日API地址 2.拿到接口&…

Open3d计算点云切片

computePlane()给出三个点计算平面方程参数 设通过P1&#xff0c;P2&#xff0c;P3三点的平面方程为A(x - x1) B(y - y1) C(z - z1) 0 。化简为一般式&#xff1a;Ax By Cz D 0。 将P1(x1,y1,z1)点数值代入方程Ax By Cz D 0。 即可得到&#xff1a;Ax1 By 1 Cz1 D…

css之文字宽度自适应、width、fit、content

文章目录 效果图htmlcss解析width 效果图 html <div><div class"width_600"><div class"d_f ai_c bc_1296db padding_7 radius_8 cursor_pointer" style"width: fit-content;"><img class"width_26 height_26" …

ps通道抠图

相信我们在抠图的时候都遇到过这种问题&#xff1a; 在扣取一些像树木、毛发等类似图像的时候&#xff0c;用魔棒或者快速选择工具根本抠不完整&#xff08;图1&#xff09;&#xff0c;而且就算抠出来也是毛毛刺刺的&#xff0c;使用效果很拉跨。而通道抠图&#xff08;图2&a…