7.物联网操作系统互斥信号量
1.使用互斥信号量解决信号量导致的优先级反转,
2.使用递归互斥信号量解决互斥信号量导致的死锁。
3.高优先级主函数中多次使用同一信号量的使用,使用递归互斥信号量,但要注意每个信号量的使用要对应一个释放
优先级翻转问题
优先级翻转功能需求
优先级翻转功能实现
一。实验:优先级翻转问题
1.优先级翻转的解释
(1)有三个任务,一个任务L优先级最低,一个任务M优先级为中间,一个任务H优先级为最高。
(2)刚开始任务L在运行,并且L占用信号量
(3)H任务突然开始运行,抢占L任务,但是由于信号量由L占有,所以进入堵塞状态,CPU继续运行L任务。
(4)M任务突然开始运行,抢占M任务,M任务不需要信号量,所以需要等运行完毕CPU才会分配给L。
(5)L不需要占用临界资源后,释放信号量。H任务由堵塞态变为就绪态,抢占L,运行H。
2.功能需求
- 新建三个任务,优先级分别为中高低
- 新建二值信号量,用于模拟优先级翻转
- 低优先级任务获取信号量后,被中优先级打断,中优先级任务执行时间较长,因为低优先级任务还未释放信号量,高优先级任务就无法获取信号量继续
实现方法:
1.低优先级
(1)获取二值信号量(2)循环释放CPU使用权(3)释放二值信号量(4)系统延时500ms
2.高优先级业务流程
(1)获取二值信号量(2)释放二值信号量(3)系统延迟500ms
API:taskYIELD
3.cubemx创建工程
(1)创建一个高优先级的任务
(2)建一个二值信号量
3.步骤:
(1)低优先级
使用二值信号量,与高优先级使用的二值信号量是同一个。与高优先级相比,多了一个释放CPU权限的函数(taskYIELD())。
printf("Low Task Take sem\n");//二值信号量的使用if(xSemaphoreTake(PrBinarySemHandle,portMAX_DELAY)==pdPASS){printf("Low Task is Running\n");}for(i=0;i<2000000;i++){//释放cputaskYIELD();}//二值信号量的释放printf("Low Task Give Sem\n");xSemaphoreGive(PrBinarySemHandle);osDelay(500);
(2)中优先级
不做特殊处理,就是直接打印
(3)高优先级
与低优先级一起使用一个二值信号量
printf("High Task Take sem\n");if(xSemaphoreTake(PrBinarySemHandle,portMAX_DELAY)==pdPASS){printf("High Task is running\n");}xSemaphoreGive(PrBinarySemHandle);printf("High Task Give Sem\n");osDelay(500);
结果:
二。互斥信号量概念及其应用《解决上述出现的问题:优先级反转问题》
互斥信号量定义
FreeRTOS互斥信号量介绍
FreeRTOS互斥信号量工作原理
1.互斥信号量的定义
短暂提升低优先级的优先级,让他优先完成。
任务都有一个互斥锁
2.FreeRTOS互斥信号量介绍
Mutex包括Mutex与RecursiveMutex(递归信号量解决普通信号量的死锁问题)
3.FreeRTOS互斥信号量工作原理
短暂提升低优先级的优先级,让他优先完成。
3.递归互斥信号量解决死锁问题
多次使用foo()函数会导致死锁,信号量重复使用,任务把自己挂起。
解决方法:递归互斥信号量
三。实验:互斥信号量函数应用
1.功能需求
1、修改优先级翻转实验(优化代码)
2、使用互斥信号量,解决优先级翻转问题
2.API
(1)xSemaphoreCreateMutex()创建互斥信号量
(2)xSemaphoreGetMutexHolder()获取当前信号量任务句柄
3.cubemx创建工程
(1)使能互斥信号量
(2)创建互斥信号量
3.步骤:
把优先级反转的二值信号量,改为互斥信号量,就可以解决优先级反转的问题
替代地方:
(1)低优先级信号量使用与释放处
(2)高优先级信号量使用与释放处
(1)低优先级二值信号量句柄的使用与释放修改为互斥信号量的使用与释放。
修改为
(2)高优先级一样
结果:大量时间用来运行高优先级的任务,正确。
四。实验:递归互斥信号量函数应用
1.死锁现象
上述的互斥信号量如果在同一个任务的主函数中运行两次互斥信号量的使用,会导致任务把自身挂起,即:死锁。
为了解决死锁的问题,使用递归互斥信号量。
2.API
(1)xSemaphoreCreateRecursiveMutex()
(2) xSemaphoreTakeRecursive()
(3)xSemaphoreGiveRecursive()
3.实验验证
需求:
1、模拟死锁现象
2、使用递归互斥信号量解决死锁问题
4.cubemx创建工程
(1)递归互斥信号量的使能
(2)创建递归互斥信号量
5.步骤
1.使用上述的API接口,创建与释放的递归信号量接口(FREERTOS的参考手册有详细讲解函数的使用,不过是英文)
2.使用自己创建的递归信号量
(1)创建出来的递归互斥信号量
(2)高优先级:如果直接使用互斥信号量,这样使用两次会导致死锁,使用递归互斥信号量就会解决此类问题。
//递归互斥信号量改为自己设置的信号量printf("High Task Take sem1\n");if(xSemaphoreTakeRecursive(myRecursiveMutexHandle,portMAX_DELAY)==pdPASS){printf("High Task is running1\n");}printf("High Task Take sem2\n");if(xSemaphoreTakeRecursive(myRecursiveMutexHandle,portMAX_DELAY)==pdPASS){printf("High Task is running2\n");}xSemaphoreGiveRecursive(myRecursiveMutexHandle);printf("High Task Give Sem1\n");xSemaphoreGiveRecursive(myRecursiveMutexHandle);printf("High Task Give Sem2\n");osDelay(500);
(3)低优先级,注意:使用与高优先级一样的信号量
结果:高优先级占用CPU比率大,正确
五。互斥信号量实现原理
相关文章:

7.物联网操作系统互斥信号量
1.使用互斥信号量解决信号量导致的优先级反转, 2.使用递归互斥信号量解决互斥信号量导致的死锁。 3.高优先级主函数中多次使用同一信号量的使用,使用递归互斥信号量,但要注意每个信号量的使用要对应一个释放 优先级翻转问题 优先级翻转功能需…...
Vue - Element el-form 表单对象多层嵌套校验
针对el-form的数据源是对象嵌套对象,在进行数据绑定和校验时和单层的对象有一点区别, 具体是下面两部分: 数据源: fromData: {name: ,health: {height: } }1、 给 el-form-item 的 prop设为:prop"health.height&…...

elementUI全屏loading的使用(白屏的解决方案)
官网中有使用方法,但是我实际上手之后会出现白屏,解决办法如下: <el-button type"text" size"small" click"delRow(scope)"> 删除</el-button>loading: false, // loading 动画loadingInstance…...

flutter开发实战-flutter_spinkit实现多种风格进度指示器
flutter开发实战-flutter_spinkit实现多种风格进度指示器 最近开发过程中flutter_spinkit,这个拥有多种种风格加载指示器 一、flutter_spinkit 引入flutter_spinkit # 多种风格的模糊进度指示器flutter_spinkit: ^5.1.0效果示例 const spinkit SpinKitRotatingC…...

检测文本是否由AI生成,GPT、文心一言等均能被检测
背景 目前很多机构推出了ChatGPT等AI文本检测工具,但是准确率主打一个模棱两可,基本和抛硬币没啥区别。 先说结论,我们对比了常见的几款AI检测工具,copyleaks检测相比较而言最准确。 检测文本 AI文本片段1 来源:G…...
【3D机甲】捏造型功能
文章目录 1. 模型选择2. 变形和调整3. 材质和纹理4. 部件修改5. 关节和动作6. 物理模拟 3D机甲捏造型功能通常包括以下小功能: 模型选择:通过从库中选择机甲模型或导入自定义模型来开始设计。 变形和调整:调整机甲的大小、比例、旋转和位置&…...
设计模式之五:单例模式
有些对象只需要有一个,比如线程池、缓存和注册表等。 对比全局变量,其需要在程序开始就创建好对象,如果这个对象比较耗资源,而在后面的执行过程中又一直没有用到,就造成了浪费。 class Singleton {private:static Si…...

MATLAB的设置路径
在主页下的 或者在命令行输入path,命令行会出现所有路径 必须要将某些函数.m文件以及一些类文件包含在路径当中,否则在脚本代码中输入代码时,不会有代码提示...

Hyperledger Fabric 使用 CouchDB 和复杂智能合约开发
前言 在上个实验中,我们已经实现了简单智能合约实现及客户端开发,但该实验中智能合约只有基础的增删改查功能,且其中的数据管理功能与传统 MySQL 比相差甚远。本文将在前面实验的基础上,将 Hyperledger Fabric 的默认数据库支持 …...

这应该是最全的,Fiddler手机App抓包详解,看完还不会来找我...
目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 什么是抓包&#…...

使用ubuntu-base制作根文件系统
1:ubuntu官网下载最小根文件系统: 放置到电脑的ubuntu中, Mkdir Ubuntu_rootfs Cd Ubuntu_rootfs Sudo tar –zxvf Ubuntu-bash-xxxxxx.tar.gz 2:电脑的ubuntu安装qemu搭建arm模拟系统 将/usr/bin/qemu-arm-static/(64位拷贝…...
springboot-mybatis的分页查询的接口
一、安装依赖 <dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version> </dependency> 二、代码定义 分页对象类 Data AllArgsConstruct…...

网络音频终端音频编码解码终端
网络对讲终端SV-7011V 网络对讲终端SV-7011V,采用了ARM音频DSP架构,集网络对讲、网络广播、监听等功能于一身,内置麦克风、配置line out、line in、Mic in功能输出接口,适用于学校,机场,广场等场所。 产品…...

cordova 12 编译失败Could not find method compile() for arguments [com....]
问题: Could not find method compile() for arguments [com.tencent.mm.opensdk:wechat-sdk-android-with-mta:] on object of type org.gradle.api.internal.artifacts.dsl.dependencies.DefaultDependencyHandler. 问题原因: 在Cordova项目中&…...

快速开发平台 WebBuilder 9 发布
WebBuilder 是一款强大,全面和高效的应用开发和运行平台。基于浏览器的集成开发环境,智能化的设计,能轻松完成常规桌面应用和面向手机等的移动应用开发。高效、稳定和可扩展的特点,适合复杂企业级应用的运行。跨平台、数据库和浏览…...

GPT-5出世,需5万张H100!英伟达GPU陷短缺风暴
随着人工智能技术的不断突破,自然语言处理领域也掀起了一波又一波的革命。从GPT-3.5的惊艳登场,到紧随其后的GPT-4的惊世震人,人们仿佛置身于科幻电影中,亲历了一场场技术的奇迹。然而,这场奇迹背后却逐渐显现出一道不…...

Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑
Jmeter学习和一个关于jmeter获取X-XSRF-TOKEN时的坑 现在想对一个接口做性能测试,需要测试它多个线程并发下的调用 1.新建测试计划和线程组 略 2.新建http接口 一个完整的http接口包含请求头和请求,这里就需要两个组件:HTTP request、HT…...
SQL注入总结
0x00 前言 简单的总结一下SQL注入的内容 0x01 常规注入 通过特殊字符测试闭合,通常使用的闭合方式有 " ) ")等 1.判断字段 a union select 1,2,3 #2.执行基础内容 a union select 1,database(),3 #3.查表 a union select 1,group_concat(table_na…...
Java 实现 后端分页
背景说明 在实际开发中,基于数据库表结构进行SQL查询,如果要对结果进行分页,可以借助一些工具类,如:基于Mybatis的 工具类 PageHelper。 但是,有时分页的对象是经过一些业务逻辑处理的列表,如…...
数据结构 | 搜索和排序——排序
目录 一、冒泡排序 二、选择排序 三、插入排序 四、希尔排序 五、归并排序 六、快速排序 排序是指将集合中的元素按照某种顺序排序的过程。 一、冒泡排序 冒泡排序多次遍历列表。它比较相邻的元素,将不合顺序的交换。每一轮遍历都将下一个最大值放到正确的位…...

7.4.分块查找
一.分块查找的算法思想: 1.实例: 以上述图片的顺序表为例, 该顺序表的数据元素从整体来看是乱序的,但如果把这些数据元素分成一块一块的小区间, 第一个区间[0,1]索引上的数据元素都是小于等于10的, 第二…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...

调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...

高频面试之3Zookeeper
高频面试之3Zookeeper 文章目录 高频面试之3Zookeeper3.1 常用命令3.2 选举机制3.3 Zookeeper符合法则中哪两个?3.4 Zookeeper脑裂3.5 Zookeeper用来干嘛了 3.1 常用命令 ls、get、create、delete、deleteall3.2 选举机制 半数机制(过半机制࿰…...
linux 下常用变更-8
1、删除普通用户 查询用户初始UID和GIDls -l /home/ ###家目录中查看UID cat /etc/group ###此文件查看GID删除用户1.编辑文件 /etc/passwd 找到对应的行,YW343:x:0:0::/home/YW343:/bin/bash 2.将标红的位置修改为用户对应初始UID和GID: YW3…...
拉力测试cuda pytorch 把 4070显卡拉满
import torch import timedef stress_test_gpu(matrix_size16384, duration300):"""对GPU进行压力测试,通过持续的矩阵乘法来最大化GPU利用率参数:matrix_size: 矩阵维度大小,增大可提高计算复杂度duration: 测试持续时间(秒&…...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
基于matlab策略迭代和值迭代法的动态规划
经典的基于策略迭代和值迭代法的动态规划matlab代码,实现机器人的最优运输 Dynamic-Programming-master/Environment.pdf , 104724 Dynamic-Programming-master/README.md , 506 Dynamic-Programming-master/generalizedPolicyIteration.m , 1970 Dynamic-Programm…...

OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...