队列常规使用

文章目录

  • 一、同步互斥改进方法
  • 二、队列实现同步
  • 三、队列实现互斥
  • 总结


一、同步互斥改进方法

在上一章同步互斥中,我们有两个实验。

同步实验: 我们创建了两个任务,任务1循环遍历一个比较大的数字,遍历完成后设置标志位置1。任务2等待任务1标志位置1后串口发送数据,但是在任务2等待过程中也参与CPU的调度,从而导致任务1计算时间增加。
既然任务2在等待,那如何配置才能让任务2不抢占CPU资源。

互斥实验: 两个任务交替使用一个函数发送串口数据。

原同步Demo
改进方案:任务1计算完数值后把数字写入队列,任务2去读取队列,当队列中没有数据任务2是阻塞状态,当队列中有数据他就打印出来。

void Task1Function(void * param)
{volatile int i = 0;while (1){for (i = 0; i < 10000000; i++)sum++;//printf("1");flagCalcEnd = 1;vTaskDelete(NULL);}
}
void Task2Function(void * param)
{while (1){if (flagCalcEnd)printf("sum = %d\r\n", sum);}
}

原互斥Demo
改进方案: 通过读队列写队列 来获得串口的使用权 和 释放使用权。


void TaskGenericFunction(void * param)
{while (1){printf("%s\r\n", (char *)param);}}
}
//任务调用伪代码xTaskCreate(TaskGenericFunction, "Task3", 100, "Task 3 is running", 1, NULL);xTaskCreate(TaskGenericFunction, "Task4", 100, "Task 4 is running", 1, NULL);

二、队列实现同步

//创建句柄

static QueueHandle_t xQueueCalcHandle;

创建队列

	xQueueCalcHandle = xQueueCreate(2, sizeof(int));//队列长度为2 每个数据sizeof(int)字节长度if (xQueueCalcHandle == NULL)//返回值非0返回句柄,返回NULL代表识别{printf("can not create queue\r\n");}

任务1往队列发送sum,拷贝地址数值到队列,所以在后面修改sum是不会影响队列中的sum数值。任务2读队列,读到数据存入val。

void Task1Function(void * param)
{volatile int i = 0;while (1){for (i = 0; i < 10000000; i++)sum++;//printf("1");//flagCalcEnd = 1;//vTaskDelete(NULL);xQueueSend(xQueueCalcHandle, &sum, portMAX_DELAY);sum = 1;}
}void Task2Function(void * param)
{int val;while (1){//if (flagCalcEnd)flagCalcEnd = 0;xQueueReceive(xQueueCalcHandle, &val, portMAX_DELAY);flagCalcEnd = 1;printf("sum = %d\r\n", val);}
}

结果:在2s时间flag置1,我们使用队列实现了同步
在这里插入图片描述

三、队列实现互斥

//创建句柄

static QueueHandle_t xQueueUARTcHandle;

初始化串口,创建队列

int InitUARTLock(void)
{	int val;xQueueUARTcHandle = xQueueCreate(1, sizeof(int));if (xQueueUARTcHandle == NULL){printf("can not create queue\r\n");return -1;}xQueueSend(xQueueUARTcHandle, &val, portMAX_DELAY);//队列里面有数据,表示别人可以读取数据return 0;
}

读队列和写队列

void GetUARTLock(void)
{	int val;xQueueReceive(xQueueUARTcHandle, &val, portMAX_DELAY);//去读队列,得到数据就说明得到串口的使用权
}void PutUARTLock(void)//释放
{	int val;xQueueSend(xQueueUARTcHandle, &val, portMAX_DELAY);//用完串口就往队列写一个数据,这说明用完串口了,把使用权释放掉
}

串口任务,这里加vTaskDelay(1);是因为当task3串口发送完成 写队列后,task4处于阻塞状态而task3是运行状态,这时task3能立刻读队列再次得到串口的使用权,所以要加一个阻塞状态给写队列的任务。

void TaskGenericFunction(void * param)
{while (1){GetUARTLock();printf("%s\r\n", (char *)param);// task 3 is waitingPutUARTLock(); /* task 3 ==> ready, task 4 is running  */vTaskDelay(1);}
}

任务创建

	xTaskCreate(TaskGenericFunction, "Task3", 100, "Task 3 is running", 1, NULL);xTaskCreate(TaskGenericFunction, "Task4", 100, "Task 4 is running", 1, NULL);

结果:任务3任务4交替写队列和读队列,实现了任务交替执行

在这里插入图片描述


总结

队列使用主要就是 创建队列、写队列、读队列。
传输的数据可以是地址 也可以是数据

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【极速前进】20240422:预训练RHO-1、合成数据CodecLM、网页到HTML数据集、MLLM消融实验MM1、Branch-Train-Mix

一、RHO-1&#xff1a;不是所有的token都是必须的 论文地址&#xff1a;https://arxiv.org/pdf/2404.07965.pdf 1. 不是所有token均相等&#xff1a;token损失值的训练动态。 ​ 使用来自OpenWebMath的15B token来持续预训练Tinyllama-1B&#xff0c;每1B token保存一个che…

ONLYOFFICE 协作空间 2.5 现已发布:公共房间改进、用户群组、储存空间管理、嵌入预设等更新

本次更新优化了 ONLYOFFICE 协作空间的多项功能&#xff0c;让您的工作能更加轻松、高效。阅读下文了解所有更新。 关于 ONLYOFFICE 协作空间 ONLYOFFICE 协作空间是一个文档办公&协作平台&#xff0c;自带文档编辑器&#xff0c;提供一整套用于文档储存、共享和协作的工具…

微电子领域常见概念(六)化学键合

微电子领域常见概念&#xff08;六&#xff09;化学键合 化学键合是化学中一个非常基础且重要的概念&#xff0c;它描述了原子之间通过电子的相互作用形成的连接。可以进行以下分类&#xff1a; 1. 离子键合&#xff08;Ionic Bonding&#xff09; • 定义&#xff1a;离子键合…

2024年Q1季度平板电视行业线上市场销售数据分析

Q1季度平板电视线上市场表现不如预期。 根据鲸参谋数据显示&#xff0c;2024年1月至3月线上电商平台&#xff08;京东天猫淘宝&#xff09;平板电视累计销量约360万件&#xff0c;环比下降12%&#xff0c;同比下降30%&#xff1b;累计销售额约99亿元&#xff0c;环比下降28%&a…

试用花生壳软件,实现外网访问内网web服务器

试用花生壳软件&#xff0c;实现外网访问内网web服务器。今天查看了一下家用的WiFi路由器和光猫。在wifi路由器里看到了DDNS&#xff0c;看到了花生壳。这时想到了花生壳软件能实现外网访问内网web服务器的功能。于是试用了一下。 先游览了贝锐花生壳公司网站&#xff0c;了解…

获取肖博数学全套视频+讲义

肖博数学是一个专业团队&#xff0c;教学方法非常颠覆&#xff0c;具有很多技巧&特殊的解题方法内容&#xff0c;能使得学生在高考时冲刺高分 hello&#xff0c;今天分享一下高中数学资料&#xff0c;肖博数学&#xff0c; 他们的教学方法与传统的教学方式有所不同&#…

pyCharm导入pyspark中的sparkconf和sparkcontext错误

背景&#xff1a;学习黑马程序员python课程的pyspark实战部分时按照下图导入pysark包时发现sparkconf和sparkcontext无法导入和运行。 首先想到是不是在CMD窗口下载的pySpark路径及安装是否正确&#xff1f; 通过下图发现第三方库都安装正确&#xff0c;然后就考虑库的路径&a…

竞赛报名赛事管理系统技术分析

竞赛报名赛事管理系统是一个复杂的应用&#xff0c;涉及到用户管理、赛事信息管理、报名管理、成绩管理等多个方面。使用PHP框架来开发这样的系统&#xff0c;可以大大提高开发效率&#xff0c;保证代码的可维护性和可扩展性。以下是对基于PHP框架的竞赛报名赛事管理系统进行功…

java中多线程的创建方式及常用的方法

目录 概述 继承Thread类&#xff1a; 实现Runnable接口&#xff1a; 实现Callable接口&#xff1a; 示例代码 继承Thread类示例 实现Runnable接口示例 实现Callable接口示例 调用三种线程测试示例 线程常用的成员方法 概述 常见的创建线程的方式包括&#xff1a;继承…

(八)Pandas窗口数据与数据读写 学习简要笔记 #Python #CDA学习打卡

一. 窗口数据(Window Functions) Pandas提供了窗口函数(Window Functions)用于在数据上执行滑动窗口操作&#xff0c;可以对数据进行滚动计算、滑动统计等操作。需要注意的是&#xff0c;在使用窗口函数时&#xff0c;需要根据实际需求选择合适的窗口大小和窗口函数&#xff0…

3D地图大屏 附源码(Three.js + Vue3)

目录 &#x1f44b; 前言 &#x1f680; 项目包 ⚒️ 字体制作 &#x1f310; 地图制作 &#x1f4a1; 参考视频 & 项目 开源项目&#xff08;Vue3tsWindcssEchartThree.js大屏案例&#xff09; 开源&#xff08;教程&#xff09; UI风格学习&#xff08; www.shuzixs.com …

深兰科技入选2024全国“人工智能+”行动创新案例TOP100

近日&#xff0c;中科院《互联网周刊》联合eNET研究院、德本咨询、中国社会科学院信息化研究中心共同发布了《2024全国“人工智能”行动创新案例TOP100》榜单。经评委会层层遴选&#xff0c;深兰科技专为洛阳市打造的“工业智能化洛阳中心”项目成功入围该榜单。一同入围的还包…