FreeRTOS ~(五)队列的常规使用 ~ (1/5)队列解决同步缺陷

news2024/11/22 15:31:45

前情提要
FreeRTOS ~(四)同步互斥与通信 ~ (1/3)同步的缺陷
举例子说明:利用队列解决前述的"同步的缺陷"问题

static int sum = 0;						/* sum存放计算的结果 */
static volatile int flagCalcEnd = 0;	/* 标志位,用于逻辑分析仪抓取代码执行时长 */
static QueueHandle_t xQueueCalcHandle;	/* 队列句柄 */

void Task1Function(void * param)
{
	/* 这里故意加上 volatile 防止系统优化掉 */
	volatile int i = 0;
	while(1)
	{
		for(i = 0; i < 10000000; i++)
			sum++;
		/* 计算完成,将计算结果写入队列,传入的是地址
		   portMAX_DELAY的意思是阻塞的时长,下文介绍这个函数时会详解 */	
		xQueueSend(xQueueCalcHandle, &sum, portMAX_DELAY);
		/* 这里设置sum为1,想要说明的是,上面传入的sum值不会由于后面的赋值而更改 */
		sum = 1;
	}
}
void Task2Function(void * param)
{
	/* 用于接收sum的值 */
	int val;
	while(1)
	{
		/* 这里利用flag的目的是:利用逻辑分析仪查看Task2等待队列读取数据耗时
		   这个耗时也几乎是Task1完成那个复杂计算的时长,
		   FreeRTOS在这里优点就是:
		   使用了队列读取数据,当队列中有数据的时候,才会唤醒Task2来进行读取操作 */
		flagCalcEnd = 0;
		xQueueReceive(xQueueCalcHandle, &val, portMAX_DELAY);
		flagCalcEnd = 1;
		printf("sum = %d\r\n", val);
	}
}

int main( void )
{
	TaskHandle_t    xHandleTask1;
	prvSetupHardware();
	
	/* 创建队列,队列中有2个Item,每个Item的大小是sizeof(int)
	   具体以实际需要为准,这里由于sum是int类型的,队列想要传输的也是sum的值
	   这里的2并不是只能是2个,而是只要大于等于1个就可以,根据具体需求选择大小 */
	xQueueCalcHandle = xQueueCreate(2, sizeof(int));
	if (xQueueCalcHandle == NULL)
	{
		printf("can not create queue\r\n");
	}
	xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);
	xTaskCreate(Task2Function,"Task2",100,NULL,1,NULL);
	
	/* Start the scheduler. */
	vTaskStartScheduler();

	return 0;
}
逻辑分析仪抓取波形如下:

在这里插入图片描述

这里用到了三个函数:

1.创建队列 --- 动态分配内存
--- 函数原型:
QueueHandle_t xQueueCreate( UBaseType_t uxQueueLength, UBaseType_t uxItemSize );
--- 参数:
uxQueueLength :队列长度,最多能存放多少个数据(item).
uxItemSize	  :每个数据(item)的大小:以字节为单位.
--- 返回值:
非 0 :成功,返回句柄,以后使用句柄来操作队列.
NULL :失败,因为内存不足.

2.写队列
--- 函数原型:
BaseType_t xQueueSend( QueueHandle_t xQueue, const void *pvItemToQueue, TickType_t xTicksToWait );
--- 参数:
xQueue		  :队列句柄,要写哪个队列.
pvItemToQueue :数据指针,这个数据的值会被复制进队列,复制多大的数据?在创建队列时已经指定了数据大小.
xTicksToWait  :如果队列满则无法写入新数据,可以让任务进入阻塞状态,
                xTicksToWait 表示阻塞的最大时间(Tick Count).
                如果被设为 0,无法写入数据时函数会立刻返回;
                如果被设为 portMAX_DELAY,则会一直阻塞直到有空间可写.
--- 返回值	  :pdPASS		  :数据成功写入了队列.
                errQUEUE_FULL :写入失败,因为队列满了.
/* 等同于 xQueueSendToBack 往队列尾部写入数据,如果没有空间,阻塞时间为 xTicksToWait */

3.读队列
--- 函数原型:
BaseType_t xQueueReceive( QueueHandle_t xQueue,void * const pvBuffer,TickType_t xTicksToWait );
--- 参数:
xQueue		  :队列句柄,要读哪个队列.
pvBuffer      :bufer 指针,队列的数据会被复制到这个buffer,复制多大的数据?在创建队列时已经指定了数据大小.
xTicksToWait  :如果队列空则无法读出新数据,可以让任务进入阻塞状态,
                xTicksToWait 表示阻塞的最大时间(Tick Count).
                如果被设为 0,无法读取数据时函数会立刻返回;
                如果被设为 portMAX_DELAY,则会一直阻塞直到有数据可读.
--- 返回值	  :pdPASS		  :从队列读取数据成功.
                errQUEUE_EMPTY:读取失败,因为队列空了.


后面会把队列相关的函数统一做一个整理.

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

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

相关文章

哪款3D虚拟人物建模软件好用?

3D虚拟人物建模软件一直以来受到许多人的关注和追捧。现在&#xff0c;随着智能手机的普及&#xff0c;3D虚拟人物手机建模软件也开始走进大家的视野。那么&#xff0c;市面上3D虚拟人物建模软件这么多&#xff0c;究竟哪款3D虚拟人物建模软件是好用的呢&#xff1f; 首先&…

【聚类算法】OPTICS基于密度聚类

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 对DBSCAN的补充&#xff0c;OPTICS聚类 1. 正文 1.0 DBSCAN的存在问题 前面我们介绍了DBSCAN&#xff0c;其能根据密度进行聚类。 但其存在这样一个问…

cv2 安装问题, opencv

解决安装了opencv-python&#xff0c;但 import cv2 报错。 需要安装&#xff1a; pip install opencv-python-headless

VS 2022 修改应用程序选择目标框架为4.8

一、设置访问项目属性为True 打开工具菜单---选项---适用于Unity的工具 将这个访问项目属性一栏设置为True。之后要解决方案再重新打开即可生效。 二、设置应用程序选择目标框架 点击项目-->属性-->应用程序选择目标框架为.netfromwork4.8

Java入门程序——运算符

文章目录 赋值运算符算术运算符自增运算符自减运算符 比较&#xff08;关系&#xff09;运算符逻辑运算符逻辑运算符——快速运算&#xff08;短路运算&#xff09; 复合赋值运算符条件运算符字符串连接运算符三元运算符总结 赋值运算符 • 格式&#xff1a;变量名表达式&…

1.7 用户注册_判断用户是否存在和自定义响应数据结构

步骤1&#xff1a;在顶级pom.xml添加常用工具依赖。 <!-- apache 工具类 --> <dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.11</version> </dependency> <depen…

实现TCP通信(socket套接字)

一、TCP通信实现的过程 服务器端 socket函数 与 通信域 #include <sys/types.h> #include <sys/socket.h> int socket(int domain, int type, int protocol); -domain: 指定通信域&#xff08;通信地址族&#xff09;; -type: 指定套接字类型; -protocol: 指定协…

大象机器人myCobot 280 2023版全新功能展示

引言 机械臂是一种可编程的、自动化的机械系统&#xff0c;它可以模拟人类的动作&#xff0c;完成各种任务&#xff0c;例如装配、喷涂、包装、搬运、焊接、研磨等。由于其高度灵活性和多功能性&#xff0c;机械臂在现代社会中已经得到了广泛的应用。 myCobot 280 M5Stack 202…

项目需求管理

项目需求管理的五大过程 一、需求获取 编写项目视图 范围文档 用户群分类 选择用户代表 建立核心队伍 确定使用实例 召开联合会议 分析用户工作流程、 确定质量属性、 检查问题报告 需求重用 二、需求分析 1、绘制关联图&#xff0c;用于定义系统与系统外部实体间的边界和接口的…

多个六轴机械臂联合作业搬运仿真(机器人工具箱)

1、建立三个六轴机械臂、工作平台与货物 clear clc close all % theta d a alpha sigma L1Link([0 0 0 pi/2 0 ]);%连杆1参数 L2Link([0 -0.1455 0.4375 0 0 ]);L2.offsetpi/2;%连杆2参数 L3Link(…

Playwright自动化测试工具 java版本

Playwright 第一个程序 public static void main(String[] args) {Playwright playwright Playwright.create(); // Browser browser playwright.chromium().launch(new BrowserType.LaunchOptions().setHeadless(false));BrowserType.LaunchOptions launchOptions …

nginx+lua(openresty) lua-mongodb 安装及使用(四)

前言 前章已经讲述 ua-protobuf 安装及使用 这章主要讲述 openresty 环境下 lua-mongodb 安装及使用 1:环境 ubuntu16(18) mongodb 3.6 2:安装mongodb 3.6 sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 2930ADAE8CAF5059EE73BB4B58712A2291FA4AD5 #创…

MySQL的初步认识——【初识MySQL】第一节

MySQL的初步认识——【初识MySQL】第一节 文章目录 MySQL的初步认识——【初识MySQL】第一节MySQL简介简介版本MySQL 5.5MySQL 5.6MySQL 5.7MySQL 8.0 安装建议 MySQL的卸载补充操作详情 小技巧 MySQL5.7.17的下载教训 MySQL简介 简介 MySQL是一个开源的关系型数据库管理系统…

【MongoDB】

目录 MongoDB基本简介 MongoDB基本概念 MongoDB和关系数据库的对比 MongoDB数据类型 MongoDB元素命名规则 MongoDB安装部署 MongoDB配置管理 MongoDB服务管理 MongoDB 多实例配置 基本操作 集合 数据备份与恢复 MongoDB复制集集群部署及管理 MongoDB复制集ReplSe…

[PG]生成表注释SQL

由于PostgreSQL无论是表还是字段的注释是通过 comment on语句来处理的。 可通过如下语句生成表的注释SQL执行语句&#xff1a; SELECT CONCAT(COMMENT ON , "type", 模式., "name", IS ", "comment", ";) AS "comment_sql&q…

软考:中级软件设计师:存储管理,分区存储,页式存储,逻辑地址,物理地址

软考&#xff1a;中级软件设计师:存储管理&#xff0c;分区存储 提示&#xff1a;系列被面试官问的问题&#xff0c;我自己当时不会&#xff0c;所以下来自己复盘一下&#xff0c;认真学习和总结&#xff0c;以应对未来更多的可能性 关于互联网大厂的笔试面试&#xff0c;都是…

idea 启动项目 java: Compilation failed: internal java compiler error

1. 首先查看 项目的 编译的 JDK 版本是否是 匹配了或匹配的 2. 堆分配的内存不足导致&#xff0c;如下图位置 堆 构建程序的 堆大小调大

JMeter分布式压测连接Jenkins生成HTML报告时候报错No such file or directory

JMeter-master机器上没有该文件。从官网下载的JMeter都会有该文件&#xff0c;添加进去即可。

C++罕见的纯虚函数调用异常(_purecall abort)

现象 笔者最近遇到了一个诡异的BUG&#xff0c;析构函数执行期间crash&#xff08;VS2022调试器下表现为abort&#xff09;&#xff0c;调用堆栈最后一级是调用虚函数&#xff0c;所有指针变量正常。 更深层的原因和特征隐藏在虚函数表中。abort发生时&#xff0c;虚函数表中…

LNMP架构及部署、skyuc电影网站部署

目录 一、安装nginx 1、关闭防火墙 2.创建管理nginx用户 3.配置nginx 4.命令优化 5.创建nginx脚本 二、安装mysql数据库 三、安装PHP 1.上传php安装包 2.上传 zend-loader-hph5.6 3.创建用户 四、LNMP平台中部署skyuc电影网站 1.解压 SKYUC.v3.4.2.srouce 2.创建数据…