FreeRtos队列,队列集合学习使用

2023-11-09

我们都知道队列可以进行消息的管理,比如在一个task中发消息,另一个task监听队列中是否有消息,这样比读flag的效率要高很多,更好的利用资源。

一、介绍一下接下来需要使用到的接口函数:
 

创建队列:使用的是xQueueCreate(uxQueueLength, uxItemSize)

@para1(参数1) uxQueueLength是队列长度(应该叫做队列元素个数items number),
@para2(参数2) uxItemSize元素的大小,一般直接填写sizeof(Type)。

@return 它会返回一个QueueHandle_t 类型的句柄, 如果句柄为NULL 说明创建失败。


发送消息:xQueueSend(xQueue, pvItemToQueue, xTicksToWait)

@para xQueue队列的句柄,pvItemToQueue 消息的指针(也就是变量地址),xTicksToWait 等待时间

如果超过了等待时间就会往下执行,单位是Tick。为什么会等待?因为有可能队列满了需要等

@return  0失败   1成功


接收消息:xQueueReceive(xQueue, pvBuffer, xTicksToWait)

@para xQueue队列的句柄,pvBuffer 接收消息的指针(也就是变量地址),xTicksToWait 等待时间

如果超过了等待时间就会往下执行,单位是Tick。为什么会等待?因为有可能队列是空的

@return  0失败   1成功


创建队列集合:QueueSetHandle_t xQueueCreateSet(const UBaseType_t uxEventQueueLength)

@para   uxEventQueueLength  时间的长度(也就是个数,简单了讲就是这个集合放多个队列)

@return  0失败  非0 成功  返回集合的handle(我比较喜欢说为指针或者地址)

将队列添加到集合:BaseType_t xQueueAddToSet(QueueSetMemberHandle_t xQueueOrSemaphore, QueueSetHandle_t xQueueSet)

@para xQueueOrSemaphore队列句柄,xQueueSet队列集合句柄

@return  0失败  1成功

从集合中取出队列:QueueSetMemberHandle_t xQueueSelectFromSet(QueueSetHandle_t xQueueSet, TickType_t const xTicksToWait)
类似Linux的selec 但是它遍历的方式是交叉遍历和线性遍历,肯定是,没有linux epoll高效,如果是中断中取出的话得用xQueueSelectFromSetFromISR
@para  xQueueSet  集合的句柄,xTicksToWait等待时间

@return  0失败    其它返回有效队列句柄

二、具体流程

/*1.创建两个队列*/

/*2.创建一个队列集合*/ 

/*3.将队列放入队列集合*/

/*4.第三个task 读取队列集合*/

代码如下:

/******************************************/

QueueHandle_t  Qhandle1,Qhandle2;
QueueSetHandle_t QueueSet;
static int SunFlag = 0;
unsigned int sun = 0;
void Task1Function()
{
	volatile int i = 0;
	while(1)
	{
		i++;
		xQueueSend(Qhandle1,&i, portMAX_DELAY);
		vTaskDelay(100);
	}

}

void Task2Function()
{
	int j = 0;
	while(1)
	{
		j--;
		xQueueSend(Qhandle2, &j, portMAX_DELAY);
		vTaskDelay(200);
	}
}



void Task3Function()
{
	int temp;
	QueueSetMemberHandle_t handle;
	while(1)
	{
		handle = xQueueSelectFromSet(QueueSet, portMAX_DELAY);

		xQueueReceive(handle, &temp, 0);

		printf("set read :%d\n", temp);
	}
}

/*************************************************/
void myTask()
{
	printf("EEEENNNNNNNNN\n");
	/*1.创建两个队列*/
	Qhandle1 = xQueueCreate(2, sizeof(int));
	if(Qhandle1 == NULL )
	{
		printf("Q1 Create Fail \n");
	}

	Qhandle2 = xQueueCreate(2, sizeof(int));
	if(Qhandle2 == NULL )
	{
		printf("Q2 Create Fail \n");
	}
	/*2.创建一个队列集合*/  //可以存放3个队列
	QueueSet = xQueueCreateSet(3);
 	/*3.将队列放入队列集合*/
	xQueueAddToSet(Qhandle1, QueueSet);
	xQueueAddToSet(Qhandle2, QueueSet);

	/*4.第三个task 读取队列集合*/


	xTaskCreate(Task1Function, "task1", 100, NULL, 19, NULL);//statc para handle
	xTaskCreate(Task2Function, "task2", 100, NULL, 19, NULL);
	xTaskCreate(Task3Function, "task3", 100, NULL, 19, NULL);
}

三、效果

set read :3
set read :-2
set read :4
set read :5
set read :-3
set read :6
set read :7
set read :-4
set read :8
set read :9
set read :-5
set read :10
set read :11
set read :-6
set read :12
  
set read :13
set read :-7
set read :14
set read :15
set read :-8
set read :16
set read :17
set read :-9
set read :18
set read :19
set read :-10
set read :20
set read :21
set read :-11
set read :22
  
set read :23
set read :-12
set read :24
set read :25
set read :-13
set read :26
set read :27
set read :-14

可以看出一个周期里task1 写入两次task2写入一次。 

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

FreeRtos队列,队列集合学习使用 的相关文章

  • 2016去哪儿编程题:5-血型遗传检测

    题目描述 血型遗传对照表如下 父母血型 子女会出现的血型 子女不会出现的血型 O与O O A B AB A与O A O B AB A与A A O B AB A与B A B AB O A与AB A B AB O B与O B O A AB B与
  • shell 数组(字符串下标)

    现在游戏开的服务器越来越多了 每次用ssh操作都要写ip地址 很烦 也容易出错 所以要自己搞个服务器名到ip的映射 map anahost count 0 temp cat home linwencai sh HOST while read
  • ubuntu18.04合并pdf文件

    以前使用pdftk比较常见 但是pdftk的更新似乎没有跟上 改用pdfunite轻松解决 pdftk原来使用apt安装 现在改成用snap安装pdftk sudo snap install pdftk pdftk合并命令为 pdftk p
  • 洛谷 P1200 [USACO1.1]你的飞碟在这儿Your Ride Is Here

    题目链接 https www luogu com cn problem P1200 include
  • C++函数基础

    一 函数的定义和使用 1 函数的定义 类型说明符 函数名 含类型说明的形参表 语句序列 如 int GetSum int a int b return a b 2 形式参数 形式参数的作用是实现主函数与被调函数之间的联系 3 函数的返回值和
  • 【ubuntu】ubuntu实体机与windows互传文件(两台电脑)

    先记录一些命令 dpkg list 查看软件列表 sudo apt get purge remove 包名 purge是可选项 写上这个属性是将软件及其配置文件一并删除 如不需要删除配置文件 可执行sudo apt get remove 包
  • Python列表操作中extend和append的区别

    1 用法 append 用于在列表末尾添加新的对象 输入参数为对象 extend 用于在列表末尾追加另一个序列中的多个值 输入对象为元素队列 2 相同点 两个都是对列表即list进行的操作 具体句法可以写为 list1 append obj
  • 解决EXPLORER应用程序错误,桌面出不来

    打开运行 输入CMD 输入for 1 in windir system32 dll do regsvr32 exe s 1 意思是注册所有DLL组件 一般都能解决问题 转载于 https blog 51cto com feifei888 4
  • word文件doc、docx转pdf

    综合类管理系统不管是自研还是外包项目都会被客户或者产品经理要求 实现word导出 excel导出 pdf导出等功能 其实pdf导出呢 有很多种方式 我实现过的就有两种 接下来呢 就说说其中的一种 就是当你已经实现了word导出 或有明确的要

随机推荐

  • 粉丝文化:抖音广告短视频美妆营销中,男明星比女明星更带货?

    1996年 木村拓哉为佳丽宝拍摄了一支口红广告 这条广告轰动一时 代言的口红两个月就卖出了300万支 从此 男明星就成了美妆品牌的宠儿 众多美妆品牌开始启用男明星代言人 男明星为何有如此强力的带货潜力 美妆品牌如何在短视频时代占得先机 抖音
  • 阿里天池比赛——街景字符编码识别

    文章目录 前言 一 街景字符编码识别 1 目标 2 数据集 3 指标 总结 前言 之前参加阿里天池比赛 好久了 一直没有时间整理 现在临近毕业 趁论文外审期间 赶紧把东西整理了 5月底学校就要让我们滚蛋了 哭哭哭 大运会的牺牲品 一 街景字
  • 赛马游戏的java设计_赛马游戏源码

    0 Intro pos g setClip 10 10 HorseMidlet imgIntro 0 getWidth HorseMidlet i mgIntro 0 getHeight g drawImage HorseMidlet im
  • 面试题记1

    希望各位看客们能积极提供答案 1 125874和它的两倍251748 包含着同样的数字 只是顺序不同 找出最小的正整数x 使得2x 3x 4x 5x 和6x都包含有相同的数字 2 求100 各位数之和 3 是用从1到9所有数字 将其任意的连
  • Notion?Roam?OneNote? 不要再用这些垃圾做笔记啦

    双向链接 最近因为Roam Research 双向链接在笔记圈子里火了起来 Notion也在准备做了 那么双向链接是什么呢 我用我的我关于管道的一则笔记给大家讲明白 管道的实现 Linux里 管道实现的原理是 Shell进程先调用pipe创
  • 浅谈 qmake 之 shadow build

    shadow build shadow build 是什么东西 就是将源码路径和构建路径分开 也就是生成的makefile文件和其他产物都不放到源码路径 以此来保证源码路径的清洁 这不是qmake独创的东西 cmake中早就使用这个东西了
  • 性能测试_Day_10(负载测试-获得最大可接受用户并发数)

    目录 如何理解负载测试 如何实现负载测试 jpgc Standard Set插件安装 jpgc Standard Set使用方法 负载测试分析指标 获得最大可接受用户并发数 区间值 负载测试分析指标 获得最大可接受用户并发数 真实值 负载测
  • 阅读论文《Deep Bilateral Learning for Real-Time Image Enhancement》

    这是2017 siggraph的一篇论文 寒假boss让我看这篇论文我没怎么看懂 最近在公司实习 发现该论文的成果已经移到手机端上了 效果还非常不错 这里我重新温习了一下这篇论文 发现有许多可以借鉴的地方 是一篇非常不错的论文 这里重新叙述
  • 我碰到avs错误

    1 写好的avs脚本用播发器不能播放 并且报unexpected chatacter 错误 解决办法 1 尽管avs支持汉语文件路径 但是仍要确认标点符号是否为英文状态下 2 将AVS脚本用记事本打开 重新存为并把编码格式修改成ASNI格式
  • 数值计算方法python实现

    包括 泰勒级数展开 差分逼近微分 二分法求解 试位法求解 迭代法求根 牛顿法求根 正割法 贝尔斯托法多项式求跟 多项式回归 牛顿差商插值 拉格朗日插值法 三次样条插值法 二次样条插值法 高斯消元法 求解线性代数方程组 代码在我的github
  • 事件循环与线程 一

    初次读到这篇文章 译者感觉如沐春风 深刻体会到原文作者是花了很大功夫来写这篇文章的 文章深入浅出 相信仔细读完原文或下面译文的读者一定会有收获 由于原文很长 原文作者的行文思路是从事件循环逐渐延伸到线程使用的讨论 译者因时间受限 暂发表有关
  • SnowFlake 算法

    SnowFlake 算法 1 介绍 是 Twitter 开源的分布式 id 生成算法 核心思想 使用一个 64 bit 的 long 型的数字作为全局唯一 id 2 结构 0 0001000000 0000010000 0001000100
  • KVM架构与原理详解

    1 KVM架构 KVM 基本上有两个组件构成 1 kvm 驱动 现在已经是Linux内核的一个模块了 它的作用主要是负责虚拟机的创建 虚拟内存的分配 虚拟CPU寄存器的读写和虚拟cpu的运行 2 另一个组件是 Qemu QEMU是一个通用的
  • Wsl2 Ubuntu18.04图形化界面,亲测成功

    Wsl2 Ubuntu18 04图形化界面 亲测成功 Windows端 Linux端 最后 抖抖索索搞了两天 差点Windows系统都重装 终于搞成功了 参考文献 一定要看 非常感谢这个哥们 成功搞出来了 Windows端 powershe
  • ThreadLoacl

    目录 三 ThreadLoacl 基础 二 InheritableThreadLocal 三 TransmittableThreadLocal 三 ThreadLoacl 基础 在Java的多线程编程中 为保证多个线程对共享变量的安全访问
  • 数据库配置时useUnicode=true&characterEncoding=UTF-8

    数据库连接时经常会写到 jdbc url jdbc mysql localhost 3306 db1 useUnicode true characterEncoding UTF 8 添加的作用是 指定字符的编码 解码格式 例如 mysql数
  • mvvm设计模式总结

    要了解mvvm 首先要了解mvc和mvp 我们也先简单说一下mvc和mvp MVC MVC全名是Model View Controller 是模型 model 视图 view 控制器 controller 的缩写 一种软件设计典范 用一种业
  • HyperLedger Fabric实战(一):基础环境构建

    1 简介 本文档说明了HyperLedger Fabric 1 4 0版本的区块链网络搭建所需的基本环境组件以及安装流程 最后再记录了安装过程中可能会遇到的一些问题 采用的操作系统为ubuntu 18 04 具有参考价值的网站 Hyperl
  • PAT初级1015德才论(C++)

    PAT初级1015德才论 C 代码 include
  • FreeRtos队列,队列集合学习使用

    我们都知道队列可以进行消息的管理 比如在一个task中发消息 另一个task监听队列中是否有消息 这样比读flag的效率要高很多 更好的利用资源 一 介绍一下接下来需要使用到的接口函数 创建队列 使用的是xQueueCreate uxQue