Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务间的通讯-信号量【入门三】

继续上一篇任务创建

【Linux下基于最新稳定版ESP-IDF5.3.2开发esp32s3入门任务创建【入门二】-CSDN博客】

今天要实现再创建一个任务。【二值和互斥都进行测试】

①、通过任务A发送一个信号量,另一个任务得到信号量后再发送helloworld。

②、两个任务通过互斥信号量打印消息。

一、创建任务。

这和上一篇一样,我们再创建一个同样优先级的任务SendSemTask

	xTaskCreatePinnedToCore(SendSemTask,
							"SendSemTask",
							2048,
							NULL,
							4,
							NULL,
							1);

二、先来看下我们要用到的API

1、xSemaphoreCreateBinary()创建二值信号量

2、xSemaphoreTake(xSemaphore, xBlockTime)等待一个信号量【形参:xSemaphore信号量句柄,xBlockTime等等时间】【返回:pdTRUE才是获取到】

3、xSemaphoreGive(xSemaphore)发送一个信号量

注意:我们这里是任务间的通讯所以使用以上的三个API,如果你要在中断中使用需要使用带FromISR结尾的API。

如:xSemaphoreTakeFromISR。

三、创建二值信号量【因为参数有句柄->所以我们需要先定义一个信号量句柄】

SemaphoreHandle_t s_tSem;

创建信号量,这个信号量创建需要再任务创建前就创建好。因为任务中要用。

s_tSem = xSemaphoreCreateBinary();

四、任务中发送信号量

1000ms发送一个信号量

xSemaphoreGive(s_tSem);

五、获取信号量,获取到信号量打印get semaphore

获取信号量,我们等等时间使用一直等等。也就是得到一个信号量才往下执行输出

xSemaphoreTake(s_tSem, portMAX_DELAY)

注意:我这里是使用一直等等,所以没有vTaskDelay。如果你使用0。那就必须要等等,否则优先级比该任务低的任务都不能得到执行。

六、编译下载验证【和预期的一样1000ms打印一次】

===========================以下测试互斥信号量===============================

为什么我们要使用互斥信号量?

实际项目中我们的系统往往是多个任务运行的,而且各个任务优先级是不一样的,如果多个任务刚好又需要用到同一资源的时候,这时候多个任务调用这共有资源的时刻是不确定的。

假如:低优先级的任务先使用资源的时候,如果还没有使用完,高优先级的任务也使要用这共有资源就会打断低优先级的任务,这时候可能:低优先级执行异常甚至系统奔溃。

所以我们希望的是等低优先级任务使用完这资源后,这资源再被其他任务使用。

一、重新cp一份刚才的工程【可以修改下文件名,我修改如下】

二、先来看下我们要用到的API

创建互斥锁:xSemaphoreCreateMutex()也可以用上面的信号量创建函数。

三、定义一个打印函数,这里增加延迟是为了模拟出效果。

void testPrintf(char *param)
{

    printf("%s starting\r\n", param);
    printf("1======2345678\r\n");
        vTaskDelay(100 / portTICK_PERIOD_MS);
    printf("2======2345678\r\n");
        vTaskDelay(100 / portTICK_PERIOD_MS);
    printf("3======2345678\r\n");
        vTaskDelay(100 / portTICK_PERIOD_MS);
    printf("4======2345678\r\n");
        vTaskDelay(100 / portTICK_PERIOD_MS);
    printf("5======2345678\r\n");
        vTaskDelay(100 / portTICK_PERIOD_MS);
    printf("6======2345678\r\n");
        vTaskDelay(100 / portTICK_PERIOD_MS);
    printf("7======2345678\r\n");
        vTaskDelay(100 / portTICK_PERIOD_MS);
    printf("8======2345678\r\n");
        vTaskDelay(100 / portTICK_PERIOD_MS);
    printf("9======2345678\r\n");
        vTaskDelay(100 / portTICK_PERIOD_MS);
    printf("1======2345678\r\n");
        vTaskDelay(100 / portTICK_PERIOD_MS);
    printf("%s end\r\n", param);
}

四、创建两个任务,两个任务的优先级需要不一样。【这里一个优先级3,一个优先级4】

	//	创建一个互斥信号量
	s_tMux = xSemaphoreCreateMutex();


	xTaskCreatePinnedToCore(TaskA,
							"TaskA",
							2048,
							NULL,
							3,
							NULL,
							1);

	xTaskCreatePinnedToCore(TaskB,
							"TaskB",
							2048,
							NULL,
							4,
							NULL,
							1);

五、两个任务都打印testPrintf【我们先不使用互斥信号量看下效果】

void TaskA(void *param)
{
	while(1)
	{
		testPrintf("TaskA");
		vTaskDelay(1000 / portTICK_PERIOD_MS);
	}
}

void TaskB(void *param)
{
	while(1)
	{
		testPrintf("TaskB");
		vTaskDelay(900 / portTICK_PERIOD_MS);
	}
}

六、下载验证。看下效果

七、增加互斥信号量看下效果【这里的互斥信号量和前面的信号量是一样的】

void TaskA(void *param)
{
	while(1)
	{
		xSemaphoreTake(s_tMux, portMAX_DELAY);
		testPrintf("TaskA");
		xSemaphoreGive(s_tMux);
		vTaskDelay(1000 / portTICK_PERIOD_MS);
	}
}

void TaskB(void *param)
{
	while(1)
	{
		xSemaphoreTake(s_tMux, portMAX_DELAY);
		testPrintf("TaskB");
		xSemaphoreGive(s_tMux);
		vTaskDelay(900 / portTICK_PERIOD_MS);
	}
}

这里申请一个信号量后,等使用完了,再释放。

八、下载验证。【最后的1是打印任务是1-9-1打印】

至此,实现了互斥锁。下一篇我们一起看下消息队列。

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

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

相关文章

windows安装Elasticsearch及增删改查操作

1.首先去官网下载Elasticsearch 下载地址 我这里选择的是7.17.18 选择windows版本 下载完成后解压是这样的 下载完成后点击elasticsearch.bat启动elasticsearch服务 输入http://localhost:9200看到如下信息说明启动成功。 还有记得修改elasticsearch.yml文件,…

虚拟机VMware的安装问题ip错误,虚拟网卡

要么没有虚拟网卡、有网卡远程连不上等 一般出现在win11 家庭版 1、是否IP错误 ip addr 2、 重置虚拟网卡 3、查看是否有虚拟网卡 4、如果以上检查都解决不了问题 如果你之前有vmware 后来卸载了,又重新安装,一般都会有问题 卸载重装vmware: 第一…

户籍管理系统的设计与实现【源码+文档+部署讲解】

目 录 摘 要 Abstract 1 系统大概 1.1 系统背景 1.2 研究意义 1.3 本文结构 1.4 开发平台简介 1.4.1 Java语言的特点 1.4.2 J2EE概述 1.4.3 B/S结构概述 1.4.4 MySQL 1.4.5 Tomcat 1.4.6 JSP.NET 1.4.7 开发流程 1.4.8 Eclipse简介 1.4.9 of…

【Rust自学】5.1. 定义并实例化struct

喜欢的话别忘了点赞、收藏加关注哦,对接下来的教程有兴趣的可以关注专栏。谢谢喵!(・ω・) 5.1.1. 什么是struct struct的中文意思为结构体,它是一种自定义的数据类型,它允许程序为相关联的值命名和打包&am…

【自动驾驶】单目摄像头实现自动驾驶3D目标检测

🍑个人主页:Jupiter. 🚀 所属专栏:传知代码 欢迎大家点赞收藏评论😊 目录 概述算法介绍演示效果图像推理视频推理 核心代码算法处理过程使用方式环境搭建下载权重文件pytorch 推理(自动选择CPU或GPU&#x…

Python+OpenCV系列:AI看图识人、识车、识万物

在人工智能风靡全球的今天,用 Python 和 OpenCV 结合机器学习实现物体识别,不仅是酷炫技能,更是掌握未来的敲门砖。本篇博文手把手教你如何通过摄像头或图片输入,识别人、动物、车辆及其他物品,让你的程序瞬间具备 AI …

永磁同步电机负载估计算法--自适应扩张状态观测器

一、 原理介绍 在线性扩张观测器中,LESO观测器增益ω0 决定了观测器的跟踪速度,ω0 越大,观测器估计精度越高, 抗干扰能力越强,瞬态响应速度加快,过大则会引入高频噪声使系统不稳定。为使观测器在全速域内…

【Spring事务】深入浅出Spring事务从原理到源码

什么是事务 保证业务操作完整性的一种数据库机制 (driver 驱动)事务特定 ACID A 原子性 (多次操作 要不一起成功 要不一起失败 (部分失败 savepoint)) C 一致性 (事务开始时数据状态&#xff0c…

Apache解析漏洞(apache_parsingCVE-2017-15715)

apache_parsing 到浏览器中访问网站 http://8.155.8.239:81/ 我们写一个木马 1.php.jpg 我们将写好的木马上传 会得到我们上传文件的路径 我们访问一下 发现上传成功 发现木马运行成功,接下来使用蚁剑连接我们的图片马 获取 shell 成功 CVE-2013-454 我们还是到…

CCF-GESP 等级考试 2023年9月认证C++二级真题解析

2023年9月真题 一、单选题(每题2分,共30分) 正确答案:D 解析:考察知识点:计算机基础 本题属于考察计算机基础知识。中国第一台计算机通用数字电子计算机于 1958 年 6 月由中科院计算所研制成功。那时候的逻…

linux环境使用yum方式安装nginx

linux环境使用yum方式安装nginx 一、nginx官网 二、nginx安装 点击首页的 Docs 或者 install 都可以,最终都是进入到Installing nginx页面 因为安装的服务器环境是linux centos 所以选择 Installation on Linux下面 packages 跳转链接 点击packages后 最终会跳转…

CS 144 check6: buiding an IP router

Lecture Notes Exercises 路由器的任务是根据路由表转发接收到的数据报:路由表是一系列规则,用于指导路由器针对任何给定的数据报应如何进行转发。 发送出什么接口。下一跳的IP地址。 这个check的工作是实现一个路由器,它可以为任何给定的…

Android Studio IDE环境配置

​需要安装哪些东西: Java jdk Java Downloads | OracleAndroid Studio 下载 Android Studio 和应用工具 - Android 开发者 | Android DevelopersAndroid Sdk 现在的Android Studio版本安装时会自动安装,需要注意下安装的路径Android Studio插件…

时钟周期、机器周期及指令周期是什么关系?

组成原理中,时钟周期、机器周期和指令周期是三个至关重要的概念,它们共同定义了计算机执行指令的基本时间框架。本文将对这三个周期进行详细介绍,并展示它们的工作原理。 一、时钟周期(Clock Cycle) 定义与作用 主…

YOLOv8改进,YOLOv8引入Hyper-YOLO的MANet混合聚合网络+HyperC2Net网络

摘要 理论介绍 MANet 的目标是通过多种卷积操作的协同作用,提高特征提取能力,并加强梯度流动,从而提升模型在不同层次的特征表示和语义深度。MANet 结合了三种卷积变体,通过混合使用它们来提高视觉特征的多样性和信息流动性。 HyperC2Net 的主要目标是通过超图结构对多层次…

挑战一个月基本掌握C++(第六天)了解函数,数字,数组,字符串

一 C函数 函数是一组一起执行一个任务的语句。每个 C 程序都至少有一个函数,即主函数 main() ,所有简单的程序都可以定义其他额外的函数。 您可以把代码划分到不同的函数中。如何划分代码到不同的函数中是由您来决定的,但在逻辑上&#xff…

vue的ElMessage的css样式不生效

我使用elementplus,是使用的用哪个单独引入的,然后表单校验时候警告的css不生效,就是这个效果 反复看视频的引入也没发现问题,后来才知道需要这个引入 import { ElMessage } from "element-plus"; import element-pl…

PromptGIP:Unifying lmage Processing as Visual Prompting Question Answering

“Unifying Image Processing as Visual Prompting Question Answering” 文章提出了一种名为 PromptGIP 的通用模型,将图像处理任务统一为视觉提示问答范式,在多个图像处理任务上展现出良好性能,为通用图像处理提供了新的思路和方法。 confe…

Windows服务器修复SSL/TLS协议信息泄露漏洞等...

为了保证生产环境的安全, 我们会定期对服务器进行漏洞扫描, 一般情况下我们都是使用Linux服务器, 某些情况会用到Windows服务器 出现SSL/TLS协议信息泄露漏洞问题一般情况下是远程连接使用了不安全的加密算法, 需要禁用这些加密算法 修复方法 从网络中查询修复方法又很多, 大…

基于AT89C52单片机的6位电子密码锁设计

点击链接获取Keil源码与Project Backups仿真图: https://download.csdn.net/download/qq_64505944/90166684?spm1001.2014.3001.5503 14 部分参考设计如下: 目 录 摘要 1 abstract 2 1 绪论 3 1.1 课题背景 3 1.2 课题的目的和意义 3 1.3 电子密码…