FreeRTOS ~(四)同步互斥与通信 ~ (1/3)同步的缺陷

news2024/12/23 10:59:42

举例子说明:同步的缺陷

首先创建两个任务:Task1和Task2;
让Task1执行一个比较耗时的计算,计算完成之后,通知Task2;
Task1:求和,sum++,累加10000000,然后标志位置1
Task2:检测到标志位置1,打印sum值
为了可以在逻辑分析仪上更准确看到波形变化,这里将Task1任务执行完就删除掉
static int sum = 0;
static volatile int flagCalcEnd = 0;

void Task1Function(void * param)
{
	/* 这里故意加上 volatile 防止系统优化掉 */
	volatile int i = 0;
	while(1)
	{
		for(i = 0; i < 10000000; i++)
			sum++;
		flagCalcEnd = 1;
		vTaskDelete(NULL);
	}
}
void Task2Function(void * param)
{
	while(1)
	{
		if(flagCalcEnd)
			printf("sum = %d\r\n",sum);
	}
}

int main( void )
{
	TaskHandle_t    xHandleTask1;
	/* 硬件初始化 */
	prvSetupHardware();
	
	xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);
	xTaskCreate(Task2Function,"Task2",100,NULL,1,NULL);
	
	/* Start the scheduler. */
	vTaskStartScheduler();

	return 0;
}
分析一下:
1.由于两个任务的优先级都是1,不是0,因此空闲任务不会参与调度执行;
2.Tick中断一次1ms,1个Tick中断,发生一次任务调度事件,切换Task1与Task2;
3.逻辑分析仪抓取flagCalcEnd由初始化为0开始执行到置为1的整个过程耗时其实是Task1与Task2两个任务的耗时总和
4.甚至可以猜测Task1与Task2两个任务分别耗时应该是一致的

在这里插入图片描述

上图表明Task1与Task2两个任务耗时总和为6s
那么,如果只有Task1在运行呢?
我们可以修改程序,取消Task2的任务创建,如下:
int main( void )
{
	TaskHandle_t    xHandleTask1;
	/* 硬件初始化 */
	prvSetupHardware();
	
	xTaskCreate(Task1Function,"Task1",100,NULL,1,&xHandleTask1);
	//xTaskCreate(Task2Function,"Task2",100,NULL,1,NULL);
	
	/* Start the scheduler. */
	vTaskStartScheduler();

	return 0;
}
下图图表明Task1只需要3S即可完成计算。

在这里插入图片描述

在上述例子中,Task1与Task2属于同步,因为Task2需要等待Task1输出标志位为1这个信号,才能去做自己的事情;
但是Task2在等待的过程中也依然占用了CPU的资源,这不符合RTOS的逻辑;
在这里这个例子的表现甚至没有优于裸机开发的效果。
这是同步的一个缺陷,那么FreeRTOS怎么能够忍受呢?它一定有相应的策略去解决这个问题。
继续往后看...

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

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

相关文章

Kibana的对索引库的操作(2)

使用Kibana对文档操作 1.新增文档 新增文档并随机生成id: POST /索引库名/类型名{"key","value"} 新增文档并自定义id:POST /索引库名/类型名/id值 {"key","value"} 2.查看文档 如果查询的文档不存在则返回false 3.修改文档 这里需…

【Telephony】SIM单卡到双卡的变化

1、注册观察者 --> PhoneFactory.makeDefaultPhones() --> TelephonyComponentFactory.makeSubscriptionInfoUpdater() --> new SubscriptionInfoUpdater() --> PhoneConfigurationManager.registerForMultiSimConfigChange(this, EVENT_MULTI_SIM_CONFIG_CHAN…

linux下载安装jdk

1、一般linux系统会自带jdk&#xff0c;执行搜索命令&#xff0c;会查询到不同版本jdk。 2、执行yum install java-1.8.0-openjdk 命令下载对应版本jdk 3、java -version 验证

charles 如何获取电脑端微信小程序接口

安装证书 设置代理端口 即可抓取美团酒店小程序的数据 从charles 可以抓取出header 请求&#xff0c;没有所谓的通过遍历循环能简单的得到数据&#xff0c;请求包含加密信息 随便改下数据就是 所以如果要得到这些数据&#xff0c;还非得通过小程序模拟人滑动获取数据&…

Mysql数据库(五) Mysql命令行客户端:内连接查询、左连接查询、右连接查询、自连接查询、子查询

目录 一、 连接查询 对多个表进行查询 1.0 数据准备 1.1 连接查询 1.2 内连接 INNER JOIN 1.3 左连接 LEFT JOIN 1.4 右连接 RIGHT JOIN 1.5 FULL OUTER JOIN 1.6 自连接查询 1.7 子查询-嵌套在查询中 一、 连接查询 对多个表进行查询 1.0 数据准备 在之前的文章当中…

20-Linux 上搭建 Java Web 环境

目录 1.搭建 JDK 运行环境 ①查看所有的 Java 安装包&#xff1a; ②安装&#xff08;安装 Java 1.8 相关的软件包&#xff09;&#xff1a; PS&#xff1a;卸载使用 ③验证是否安装成功&#xff1a; 2.安装并运行 Tomcat ①去官网下载Tomcat压缩包至本地&#xff0c;再…

4.Nginx缓存设置和CDN

文章目录 Nginx缓存设置设置缓存取消不需要内容的缓存查看nginx缓存数据 CDN概念工作原理 Nginx缓存设置 设置缓存 ##在yum配置文件中添加nginx在线源vim /etc/yum.repos.d/nginx.repo[nginx-stable] namenginx stable repo baseurlhttp://nginx.org/packages/centos/7/$base…

28-大文件上传(了解)

一、是什么&#xff1f; &#x1f697;&#x1f697;&#x1f697;不管怎样简单的需求&#xff0c;在量级达到一定层次时&#xff0c;都会变得异常复杂。 文件上传简单&#xff0c;文件变大就复杂 上传时&#xff0c;以下几个注意点会影响用户体验 服务器处理数据的能力请求超…

AI PPT 一句话搞定PPT讲演搞

相信大家在职场中&#xff0c;一定会接触过写PPT&#xff0c;经常会把你搞得焦头烂额。在大部分的公司里&#xff0c;写PPT汇报又是不可能逃避的事情。但随着AI时代的到来&#xff0c;有很多AI帮你写PPT的工具也逐渐崭露头角&#xff0c;可以自动帮助你制作出华丽的PPT&#xf…

HOT47-从前序与中序遍历序列构造二叉树

leetcode原题链接&#xff1a;从前序与中序遍历序列构造二叉树 题目描述 给定两个整数数组 preorder 和 inorder &#xff0c;其中 preorder 是二叉树的先序遍历&#xff0c; inorder 是同一棵树的中序遍历&#xff0c;请构造二叉树并返回其根节点。 示例 1: 输入: preorder …

攻防演练中红队常用的攻击方法之横向移动(上)

横向移动&#xff0c;是攻击者侵入企业系统时&#xff0c;获取相关权限及重要数据的常见攻击手法。了解横向移动的原理有助于个人和企业更好地维护网络安全。 中安网星特此推出了横向移动科普系列&#xff0c;本系列共有三篇文章。 近年来&#xff0c;随着网络攻击、勒索事件…

B. Number Factorization - 数论

分析&#xff1a; 可以将n分解成质因数&#xff0c;要求是加和尽可能大&#xff0c;那么可以让所有的指数都是1&#xff0c;a*b>ab一定成立&#xff0c;所以要尽可能地将质因数乘在一起组成更大的数&#xff0c;加在一起得到最后的解。 代码&#xff1a; #include <bit…

Matlab中解常微分方程(组)的命令

常微分方程组求解命令与示例 线性常微分方程&#xff08;组&#xff09; ode45 4 order 龙格库塔法example odefun (t, y) [-2*y(1) y(2); y(1) - 2*y(2)]; tspan [0 10]; y0 [1; 0]; [t, y] ode45(odefun, tspan, y0); ode23 使用二三阶Bogacki-Shampine方法求解非刚性…

Devops系列二(使用helm chart,将java应用发布部署至k8s的示例)

一、接着上一篇的话 docker镜像已经有了&#xff0c;本文我们将接着演示如何使用helm部署应用到k8s。 分为两大部分&#xff1a; 制作helm chart&#xff0c;推送到私有仓库nexushelm拉取chart&#xff0c;部署到k8s 二、制作helm chart 要求你先安装helm&#xff0c;随便一…

Rust 第四天—Rust进阶1

上一篇介绍了Rust的所有权特性,今天就把剩下一些之前没介绍但项目中常用的内容总结一下. 结构体泛型trait 1 结构体 和c语言一样,Rust使用struct关键字来定义一个结构体,结构体可以将不同的类型数据进行整合,加快内存访问速度. 1.1 结构体定义 struct Test{username:Strin…

【第四天学习】决策分支,判断语录

决策分支 If语句 If语句是对基础的一种选择结构语句&#xff0c;它主要有三种形式&#xff0c;分别是if语句&#xff0c;if else语句和if else If else多分支语句。 int nCheck 0; if(nNum4) { nCheck4; } else { nCheck8; }If语句其实就是一个判断语句&#xff0c;它会判断…

详细解释lvs的工作原理

vsl用于集群中的直接路由它的原理如下 如果在公司并发太高了怎么解决 1.加配置cpu 内存 带宽 ssd高效硬盘 2.加服务器 为用户提供服务 横向扩展 集群是什么 由的多台主机构成,相当于一台大型计算机,只提供一个访问入口(域名与ip地址) 集群用在那个场景 高并发场景 vrrp是…

linux下删除ARP缓存表【网络工程】(保姆级图文)

目录 linux下删除ARP缓存表总结 欢迎关注 『网络工程专业』 系列&#xff0c;持续更新中 欢迎关注 『网络工程专业』 系列&#xff0c;持续更新中 温馨提示&#xff1a;对虚拟机做任何设置&#xff0c;建议都要先快照备份&#xff01; linux下删除ARP缓存表 这里老师的命令ip…

docker的安装和使用

1.新建一个项目 比如vue init vuelatest完事之后运行打包到build目录下 2.在项目根目录下通过执行命令 touch Dockerfile 3.拉取nginx镜像 首先打开你的Docker&#xff0c;默认会启动。控制台拉取 Nginx 镜像&#xff1a;运行 docker pull nginx4.在根目录创建Nginx配置文件…

【多线程】锁策略

1. 说在前面 这里的锁策略内容&#xff0c;属于典型的面试八股文&#xff01;如果未来工作&#xff0c;需要实现一把锁&#xff0c;那么得好好研究下锁策略&#xff0c;但基本上不会让我们自己设计一把锁的。 而这里的锁策略内容不局限于 Java&#xff0c;任何 "锁" …