03 FreeRTOS 同步互斥与通信

news2024/9/24 3:27:48

1、同步与互斥

        一句话理解同步与互斥:我等你用完厕所,我再用厕所。

        什么叫同步?就是:哎哎哎,我正在用厕所,你等会。

        什么叫互斥?就是:哎哎哎,我正在用厕所,你不能进来。

        同步与互斥经常放在一起讲,是因为它们之的关系很大,“互斥"操作可以使用“同步"来实现。我"等"你用完厕所,我再用厕所。这不就是用“同步"来实现“互斥吗?

        设置一段伪代码如下:

void 抢厕所(void)
{
    if(有人在用) 我眯一会;
    用厕所;
    喂,醒醒,有人要用厕所吗;
}

        假设有A、B两人早起抢厕所,A先行一步占用了;B慢了一步,于是就眯一会;当A用完后叫醒B,B也就愉快地上厕所了。

        在这个过程中,A、B是互斥地访问“厕所",“厕所'被称之为临界资源。我们使用了“休眠-唤醒"的同步机制实现了临界资源"的“互斥访问"。

        同一时间只能有一个人使用的资源,被称为临界资源。比如任务A、B都要使用串口来打印,串口就是临界资源。如果A、B同时使用串口,那么打印出来的信息就是A、B混杂,无法分辨。所以使用串口时,应该是这样:A用完,B再用;B用完,A再用。

2、自己实现同步例子:有缺陷

static int sum = 0;
static volatile int flagCalcEnd = 0;

void Task1Function( void * param)
{
	volatile int i = 0;	//使用volatile修饰,让系统不要去优化这个变量
	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);
		}
		//printf("2");
	}
}

        当任务一一直在累加时,任务二还一直在竞争cpu资源,此时完成10000000次累加用了4s。

        如果注释掉任务二,此时完成10000000次累加用了2s。

        因此可以看出在任务二中使用循环检测某个变量,来实现同步的方法是有缺陷的,如果在任务二中让其在等待的过程中,让任务二进入blocked状态,不要让其去抢占cpu资源,这个程序的运行效率就会大幅提高。

3、自己实现互斥例子:有缺陷

void TaskGenericFunction( void * param)
{
	while(1){
		printf("%s\r\n", (char *)param);
	}
}


//main函数中
xTaskCreate(TaskGenericFunction, "Task3", 100, "Task 3 is running", 1, NULL);
xTaskCreate(TaskGenericFunction, "Task4", 100, "Task 3 is running", 1, NULL);

        可以发现任务三和任务四打印的语句掺杂在一起,任务三的语句还没打印完就被打断了,没有能在打印的时候互斥的去独占整个串口

        在这基础上去做出改进,让打印信息时可以独占串口。但是从结果可以看出此时只有一个任务在一直执行,另一个任务抢不到cpu资源。

static volatile int flagUARTused = 0;

void TaskGenericFunction( void * param)
{
	while(1){
		if(!flagUARTused){
			flagUARTused = 1;
			printf("%s\r\n", (char *)param);
			flagUARTused = 0;
		}	
	}
}

        如果想要另一个任务也能抢到资源,可以在上面的基础上加个delay函数。 

void TaskGenericFunction( void * param)
{
	while(1){
		if(!flagUARTused){
			flagUARTused = 1;
			printf("%s\r\n", (char *)param);
			flagUARTused = 0;
			vTaskDelay(1);
		}	
	}
}

        至此,这个代码看似没问题,很好的完成了互斥的作用。 但是这个代码是有很大隐患的,因为在多任务系统中,使用全局变量来实现互斥是有隐患的。

        假如任务三执行到flagUARTused=1;时被调度切换出去了,那么此时任务四就过来执行了,如果任务四在运行到flagUARTused=1;时也被调度切换出去了,那么后面如果两个任务都恢复过来,那么这两个任务都可以执行之后的语句,此时就无法通过flagUARTused来实现互斥的作用了。

4、FreeRTOS的解决方案

4.1 队列(queue,FIFO)

        里面可以放任意数据,可以放多个数据

        任务、ISR都可以放入数据;任务、ISR都可以从中读出数据

4.2 事件组(event grtoup)

        一个事件用一bit表示,1表示事件发生了,0表示事件没发生

        可以用来表示事件、事件的组合发生了,不能传递数据

        有广播效果:事件或事件的组合发生了,等待它的多个任务都会被唤醒

4.3 信号量(semaphore)

        核心是"计数值"

        任务、ISR释放信号量时让计数值加1

        任务、ISR获得信号量时,让计数值减1

4.4 任务通知(task notification)

        核心是任务的TCB里的数值

        会被覆盖

        发通知给谁?必须指定接收任务

        只能由接收任务本身获取该通知

4.5 互斥量(mutex)

        数值只有0或1

        谁获得互斥量,就必须由谁释放同一个互斥量

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

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

相关文章

笔试强训week6

day1 Q1 难度⭐⭐ 小红的口罩_牛客小白月赛41 (nowcoder.com) 题目&#xff1a; 疫情来了&#xff0c;小红网购了 n 个口罩。 众所周知&#xff0c;戴口罩是很不舒服的。小红每个口罩戴一天的初始不舒适度为 ai​。 小红有时候会将口罩重复使用&#xff08;注&#xff1a;…

什么是死锁,如何解决?

一、问题解析 死锁是指两个或两个以上的进程&#xff08;或线程&#xff09;在执行过程中&#xff0c;由于竞争资源或者由于彼此通信而造成的一种阻塞的现象&#xff0c;若无外力作用&#xff0c;它们都将无法推进下去。此时称系统处于死锁状态或系统产生了死锁&#xff0c;这些…

网上有哪些正规的兼职副业赚钱平台?分享10类正规的网上兼职赚钱平台,让你在家也能赚钱~

在如今的快节奏社会中&#xff0c;越来越多的人开始寻求兼职副业来增加收入。而随着互联网的普及&#xff0c;网上赚钱平台成为了许多人选择的方式之一。然而&#xff0c;面对众多的网上赚钱平台&#xff0c;我们要如何辨别哪些是正规可靠的呢&#xff1f;在本文中&#xff0c;…

解读:Mint Blockchain 最新路线图,释放 NFT 生态重磅发展计划

作者&#xff1a;Mint Ecosystem 关于 Mint Blockchain&#xff1a;Mint Blockchain 是一个以太坊原生 L2 网络&#xff0c;核心是发展 NFT 生态和产业&#xff0c;促进 NFT 领域的 Mass Adoption 产生。MintCore 团队致力于将 Mint Blockchain 打造成一个围绕服务 NFT 资产的…

6万转高速主轴电机哪个品牌好?

近年来&#xff0c;随着全球科技的迅猛发展&#xff0c;各个工业领域对高精密零件加工的需求日益旺盛&#xff0c;特别是在医疗、航天航空、通讯技术等领域&#xff0c;对工件的精密性要求达到了前所未有的高度。在这样的背景下&#xff0c;高转速&#xff0c;高精密的高速电主…

yolo 算法 易主

标题&#xff1a;YOLOv10: Real-Time End-to-End Object Detection 论文&#xff1a;https://arxiv.org/pdf/2405.14458ethttps%3A//arxiv.org/pdf/2405.14458.zhihu.com/?targethttps%3A//arxiv.org/pdf/2405.14458 源码&#xff1a;https://github.com/THU-MIG/yolov10 分析…

哈夫曼树,哈夫曼编码和线索二叉树

前言 在数据压缩中,如电脑中的压缩软件,哈夫曼编码应用比较广泛,因此被称作最优二叉树。下面时哈夫曼树的一些定义。 哈夫曼树 定义 代码 下面时哈夫曼树的初始化和创建: #include "stdio.h"#define MAXSIZE 5 typedef struct {int weigth;int parent, lchi…

SSRS中使用QRCoder生成二维码

步骤 1.下载QRCoder.dll 下载地址&#xff1a;https://download.csdn.net/download/wjl7126180/89369398 2.使用gacutil.exe安装QRCoder.dll到GAC(Global Assembly Cache) gacutil.exe是全局程序集缓存工具&#xff0c;需要安装.NET Framework才会存在&#xff0c;如果没有…

质量人,你还在等什么?快来六西格玛培训公司充电吧!——张驰咨询

在竞争激烈的商业环境中&#xff0c;质量成为了企业生存和发展的关键。而六西格玛&#xff0c;作为一种全球公认的质量管理方法论&#xff0c;正在成为越来越多企业追求品质革命的重要工具。而六西格玛培训公司&#xff0c;则成为了这场品质革命中&#xff0c;质量人不可或缺的…

SSH秘钥对简化github项目管理(外加Tortoise配置)

文章目录 使用SSH秘钥对简化github项目管理为什么要用密钥对&#xff1f;如何使用SSH方式克隆版本库呢&#xff1f;补充&#xff1a;使用TortoiseGit&#xff08;小乌龟&#xff09;快速访问github远程仓库&#xff01;结尾&#xff1a;喜欢的小伙伴可以点点关注赞哦 使用SSH秘…

四大策略,五大优势!麒麟信安云助力用户实现VMware替换无忧

2023 年 12 ⽉ 11 ⽇&#xff0c;VMware 正式官宣“所有 VMware by Broadcom 解决⽅案向订阅许可证的过渡&#xff0c;并停⽌销售永久许可证、永久产品的⽀持和订阅&#xff08;SnS&#xff09;续订以及混合购买计划/订阅购买计划积分&#xff08;HPP/SPP&#xff09;”。 202…

根据一棵树的前序遍历与中序遍历构造二叉树(C++)

文章目录 1. 题目描述2. 题目解析 题目来源&#xff1a; 力扣…根据一棵树的前序遍历与中序遍历构造二叉树 1. 题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二…

python清洗苹果产量数据:从字符串到整型的转化

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、引言 二、使用普通方法清洗数据 1. 创建字典并遍历 2. 示例代码 3. 结果展示 三、使…

教你网站如何免费实现https

想要实现https访问最简单有效的的方法就是安装SSL证书。只要证书正常安装上以后&#xff0c;浏览器就不会出现网站不安全提示或者访问被拦截的情况。下面我来教大家怎么去获取免费的SSL证书&#xff0c;又如何安装证书实现https访问。 一、选择免费SSL证书提供商 有多家机构提…

计算机SCI期刊,中科院2区,IF=5+,收稿范围广泛!

一、期刊名称 CAAI Transactions on Intelligence Technology 二、期刊简介概况 期刊类型&#xff1a;SCI 学科领域&#xff1a;计算机科学 影响因子&#xff1a;5.1 中科院分区&#xff1a;2区 出版方式&#xff1a;开放出版 版面费&#xff1a;$2600 三、期刊简介 期…

在今日头条上写文章:ChatGPT完整使用教程

了解如何充分运用ChatGPT进行创作 简介 在今日头条上发布文章变得越来越方便。本文旨在详细解析如何运用ChatGPT来创作文章&#xff0c;并提供全方位的使用指南及常见问题的答疑。 第一步&#xff1a;基础准备 确保你已注册今日头条账号。 登录ChatGPT并与你的今日头条账号进…

质量源于设计QbD培训的内容有哪些?

质量源于设计QbD培训的内容丰富而深入&#xff0c;旨在帮助企业深入理解并应用QbD理念&#xff0c;提升产品质量和客户满意度。以下是质量源于设计QbD培训的主要内容&#xff1a; 首先&#xff0c;培训将详细介绍QbD的基本概念、核心内容和实施流程。QbD是一种集成的方法&#…

玻璃加工生产线液压比例控制器

玻璃加工生产线广泛应用于自动化中空玻璃的生产、清洗、磨边、上片、除膜、打胶等各个环节&#xff0c;体现了高度的专业化和自动化水平。在玻璃制造过程中&#xff0c;液压升降机用于玻璃板材的升降和定位&#xff0c;确保玻璃在加工过程中的稳定性。液压系统提供的强大而平稳…

基于直接二元搜索的片上偏振分束器设计 (Nature Photonics, 9, 6, (2015))案例复现

时间—2024.6.08 腾讯会议 智能算法驱动的光子学设计与应用

从零教你实现django的前后端分离模式文件上传下载功能实现(2024最新)

文章目录 项目初始化配置具体文件上传下载代码的实现数据库模型类建立 运行测试 项目初始化配置 1.使用pycharm编辑器新建一个django项目 2.Terminal终端下载需要的依赖包 # 和数据库建立连接的依赖包 pip install mysqlclient # 解决跨域问题的依赖包 pip install django-co…