FreeRtos----------- 同步互斥

news2024/11/15 17:53:40

一、同步的缺陷:全局变量协同两个任务

1.建立两个任务:CalcTask 、LcdPrintTask

  xTaskCreate(CalcTask, "task1", 128, NULL, osPriorityNormal, NULL);
  xTaskCreate(LcdPrintTask, "task2", 128, &g_Task2Info, osPriorityNormal, NULL);
  1. LcdPrintTask:

    • 类型TaskFunction_t
    • 含义: 任务的入口函数,也就是任务的执行代码的起点。在这个例子中,LcdPrintTask 是一个函数指针,指向任务的实现函数。
  2. "task2":

    • 类型const char *
    • 含义: 任务的名称,用于调试和管理。这里 task2 是任务的名字。
  3. 128:

    • 类型uint16_t
    • 含义: 为任务分配的堆栈大小(以字节为单位)。这里 128 表示任务的堆栈大小为 128 字节。
  4. &g_Task2Info:

    • 类型void *
    • 含义: 传递给任务的参数。在这个例子中,&g_Task2Info 是一个指向任务参数的指针,任务运行时可以通过这个指针来获取任务相关的数据。
  5. osPriorityNormal:

    • 类型UBaseType_t
    • 含义: 任务的优先级。osPriorityNormal 是任务的优先级,这个值决定了任务在系统中的调度优先级。
  6. NULL:

    • 类型TaskHandle_t *
    • 含义: 用于接收任务的句柄。如果不需要获取任务句柄,可以传入 NULL。任务句柄可以用来控制任务,比如删除任务或获取任务的状态。

解释:

这行代码的作用是创建一个新的任务 LcdPrintTask,任务的名字为 "task2",堆栈大小为 128 字节,任务在启动时会接收到参数 g_Task2Info,并且该任务的优先级是 osPriorityNormal。任务句柄被设为 NULL,表示我们不需要保存这个任务的句柄信息。

一旦任务创建成功,它会被添加到调度器中,并在合适的时机由操作系统调度执行。

//全局变量
static int g_LCDCanUse = 1;
static volatile int g_calc_end = 0;
static uint64_t g_time = 0;
static uint32_t g_sum = 0;

void CalcTask(void *params)
{
	uint32_t i = 0;
	
	LCD_PrintString(0, 0, "Waiting");

	g_time = system_get_ns();
	for (i = 0; i < 10000000; i++)
	{
		g_sum += i;
	}
	g_calc_end = 1;
	g_time = system_get_ns() - g_time;

	vTaskDelete(NULL);
}

void LcdPrintTask(void *params)
{
	int len;
	while (1)
	{
		LCD_PrintString(0, 0, "Waiting");
		
		vTaskDelay(3000); //让此任务进入阻塞,3毫秒后执行while (g_calc_end == 0);减少cpu的使用
		
		while (g_calc_end == 0);
		
		/* 打印信息 */
		if (g_LCDCanUse)
		{
			g_LCDCanUse = 0;
			
			LCD_ClearLine(0, 0);
			len = LCD_PrintString(0, 0, "Sum: ");
			LCD_PrintHex(len, 0, g_sum, 1);
			
			LCD_ClearLine(0, 2);
			len = LCD_PrintString(0, 2, "Time(ms): ");
			LCD_PrintSignedVal(len, 2, g_time/1000000);
			
			g_LCDCanUse = 1;
		}
		vTaskDelete(NULL);
	}
}

 void LcdPrintTask(void *params)
{
    int len;
    while (1)
    {
        LCD_PrintString(0, 0, "Waiting");
        
      vTaskDelay(3000); //让此任务进入阻塞,3毫秒后执行while (g_calc_end == 0);减少cpu的使用
        
        while (g_calc_end == 0);
        
        /* 打印信息 */
        if (g_LCDCanUse)
        {
            g_LCDCanUse = 0;
            
            LCD_ClearLine(0, 0);
            len = LCD_PrintString(0, 0, "Sum: ");
            LCD_PrintHex(len, 0, g_sum, 1);
            
            LCD_ClearLine(0, 2);
            len = LCD_PrintString(0, 2, "Time(ms): ");
            LCD_PrintSignedVal(len, 2, g_time/1000000);
            
            g_LCDCanUse = 1;
        }
        vTaskDelete(NULL);
    }
}

注意:static volatile int g_calc_end = 0;使用volatile让编译器不要去优化,否则在执行任务的时候g_calc_end时刻等于0,不执行后面的代码。

二、互斥的缺陷--同时访问一个资源

1.同时有两个任务要使用lcd

 进行优化代码如下:但是在微观条件下,也有可能发送任务切换。

 (1)可以使用中断的开关解决互斥问题

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

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

相关文章

详解Element-UI el-table表格中勾选checkbox(selection)多选删除

本节讲解的是关于组件库中el-table组件多选删除功能的实现。 1.Vue文件内的引用 2.页面数据 3.存储多选数据 4. 处理多选数据 这里通过循环的方式找到数据并对数据删除&#xff0c;这种方式易于理解&#xff0c;但不一定是最优方案

springboot的自动配置和怎么做自动配置

目录 一、Condition 1、Condition的具体实现 2、Condition小结 &#xff08;1&#xff09;自定义条件 &#xff08;2&#xff09;SpringBoot 提供的常用条件注解 二、Enable注解 三、EnableAutoConfiguration 注解和自动配置 1、EnableAutoConfiguration的三个注解属性…

LLama 3 跨各种 GPU 类型的基准测试

2024 年 4 月 18 日&#xff0c;AI 社区对 Llama 3 70B 的发布表示欢迎&#xff0c;这是一款最先进的大型语言模型 &#xff08;LLM&#xff09;。该型号是 Llama 系列的下一代产品&#xff0c;支持广泛的用例。该模型 istelf 在广泛的行业平台上表现良好&#xff0c;并提供了新…

Eclipse的使用配置教程:必要设置、创建工程及可能遇到的问题(很详细,很全面,能解决90%的问题)

Eclipse的使用配置&#xff1a; Ⅰ、Eclipse 的必要配置&#xff1a;1、Eclipse 的安装&#xff1a;其一、将 Eclipse 解压或安装到没有中文且没有空格的路径下。其二、拿到 eclipse.exe 文件&#xff0c;傻瓜式安装即可; 2、设置工作空间(workspace)&#xff1a;其一、首次启动…

源头分析: 网络安全的分布式方法

部署网络可见性和网络检测和响应 (NDR) 解决方案来收集、查看和分析网络活动&#xff0c;以检测网络上的可疑和恶意活动。 这些解决方案中的大多数都是为了将数据从收集点 (或传感器) 移动到中央存储库进行分析而构建的。 这种方法有几个缺点&#xff0c;包括规模、性能、成本…

乌龟对对碰在线版

爆肝两天使用vue开发了一个在线版的乌龟对对碰小游戏之幸运对对碰。没有找到合适的乌龟素材&#xff0c;现在使用小兔子代替。 体验地址&#xff1a;幸运对对碰 | 乌龟对对碰小游戏 之前的python版本的乌龟对对碰&#xff1a;写文章-CSDN博客 乌龟对对碰-幸运对对碰

无需测试环境!如何利用测试脚手架隔离微服务,实现功能自动化

以下为作者观点&#xff1a; 想在不建立完整测试环境的情况下测试微服务&#xff1f; 想在将变更推送到主线分支之前完成测试&#xff1f; 这是我们在进行项目交付时经常遇到的难题。最近&#xff0c;当我们开始一个新的项目&#xff0c;为客户构建一个新的聚合平台时&#…

【springboot】springboot接口参数全局解密,解决request内容修改后如何重新设置回去的问题

文章目录 核心思路spring&servelt基础核心接口类body解密核心原理讲解get解密核心原理讲解 核心思路 拦截每次请求 所以要么在拦截器 要么在过滤器中做 (正常来说 其实只能在过滤器做)修改request中的参数把修改后的参数设置回去(难点&#xff09; spring&servelt基础…

RegFormer:用于大规模点云配准的高效投影感知Transformer网络

目录 一、导言 二、相关工作 1、点云配准工作 2、大规模点云配准 3、Transformer引入配准工作 三、RegFormer 1、柱面投影 2、特征提取Transformer 3、双射关联Transformer(BAT) 4、刚性变换估计 5、损失函数 四、实验 一、导言 该论文来自于ICCV2023&#xff08;…

如何搞定聊天记录找回?三款数据恢复工具分享

聊天记录丢了怎么办&#xff1f;别急&#xff0c;我这就带大家看看市面上比较火的三款数据恢复软件在恢复聊天记录方面的表现如何。首先&#xff0c;我们得知道&#xff0c;聊天记录这东西&#xff0c;一旦误删&#xff0c;那可是心急如焚啊。所以&#xff0c;选择一款靠谱的数…

场外个股期权可以分批建仓吗?

场外个股期权的优势是可以进行风险的精细化管理&#xff0c;但由于期权价格变化的非线性特性&#xff0c;盈利与标的行情走势的相关性不断变化&#xff0c;场外个股期权最便宜的可以用2-5万买到100万市值的股票持仓一个月&#xff0c;下面是整理得出的场外个股期权可以分批建仓…

SwiftUI 6.0(iOS 18)监听滚动视图视口中子视图可见性的极简方法

概览 在 SwiftUI 的应用开发中,我们有时需要监听滚动视图中子视图当前的显示状态:它们现在是被滚动到可见视口(Viewport)?或仍然是隐藏在“未知的黑暗”中呢? 在 SwiftUI 早期版本中为了得偿所愿,我们需要借助一些“取巧”的手段。不过,从 SwiftUI 6.0(iOS 18)开始情…

echarts柱状图使用自定义图片填充柱体

这是我的柱状图图片纹理的实现过程的流水账式记录 方法一&#xff1a; 在option.series里面&#xff0c;给每一项配置上图片路径 let Image2 new Image() Image2.src src/assets/image/BarChart-line.pngcolor: {image: Image,repeat: repeat } 出来的效果比较适合整体纹样…

[Linux]如何在Ubuntu中安装Docker,并且学习基本操作?

一、我们为什么需要Docker&#xff1f; 相信大家都遇到过部署一个应用时缺少依赖的情况&#xff0c;往往我们需要手动解决依赖问题&#xff0c;在解决了依赖问题以后&#xff0c;好不容易安装了这个应用&#xff0c;但是我们更换了计算机以后又需要重复上面步骤将这个软件再安装…

Unity(2022.3.38LTS) - Project Settings详细介绍不看你就亏大了(一)

目录 一. 简介 二. 详细介绍 1. Adaptive Performance(自适应性能) 2.音频 3. 编辑器 4. 图形 5. 输入管理器 6.包管理器 7.物理 8.2D物理 9.玩家 10.预设管理器 一. 简介 在 Unity 中&#xff0c;Project Settings&#xff08;项目设置&#xff09;页面是一个非常…

企业组网中MPLS和SD-WAN方案各有什么特点?

MPLS&#xff08;多协议标签交换&#xff09;和SD-WAN&#xff08;软件定义广域网&#xff09;是企业组网的两大关键技术方案&#xff0c;各自具备独特的特点和优势。 MPLS作为一种传统的专线技术&#xff0c;通过给数据包附加标签&#xff0c;实现了网络流量的高效转发。这种方…

教你如何安装并使用小熊猫c++

目录 前言 一、获取安装包 二、安装 1.打开安装包 2.选择语言 3.接受协议 4.安装场景 5.选择组件 6.选择位置 7.完成安装 三、如何使用 1.打开软件并选择主题 2.创建项目 3.新建空项目 4.创建源文件 5.测试C语言代码 6.编译 7.运行 总结 前言 已有的C/…

地震采集的观测系统

这张图表明&#xff0c;为什么在速度分析论文中&#xff0c;与CMP有关的数据都有CDP序号的影子——因为CDP序号是对一条测线上布置的观测系统对地下反射点的信号记录。换句话说&#xff0c;不同的CDP序号&#xff08;类似测井位置&#xff09;意味着不同的CMP道集。 几种论文中…

【Python快速入门和实践013】Python常用脚本-目标检测之按照类别数量划分数据集

一、功能介绍 这段代码实现了从给定的图像和标签文件夹中分割数据集为训练集、验证集和测试集的功能。以下是代码功能的总结&#xff1a; 创建目标文件夹结构&#xff1a; 在指定的根目录&#xff08;dataset_root&#xff09;下创建images和labels两个文件夹。在这两个文件夹下…

scoket通信 -- 网络字节序

include <arpa/inet.h> 考虑到不同语言不同库函数的参数可能不同&#xff0c;我这里以c语言的arpa/inet.h库中的函数为例. 网络字节序是什么 网络字节序&#xff08;Network Byte Order&#xff09;是指在网络通信中用于数据交换时所采用的字节序&#xff0c;它是大端…