互斥量的使用

官方的描述
在这里插入图片描述互斥量主要是对于共享资源的保护

在这里插入图片描述

其中参数要注意
osMutexRecursive://递归互斥量
互斥锁嵌套属性,同一个线程可以在不锁定自身的情况下多次使用互斥锁。每当拥有互斥锁的线程获得互斥锁时,锁计数就会增加。互斥锁也必须被释放多次,直到锁定计数为零。当互斥量达到0时,互斥量实际上会被释放,其他线程可以获取互斥量。
osMutexPrioInherit://优先级继承
优先级继承属性,使用优先级继承属性的互斥锁将 ”等待线程“ 的优先级转移给当前互斥锁的所有者(如果所有者的线程优先级较低)。这确保了低优先级线程不会阻塞高优先级线程。否则,低优先级线程可能持有互斥锁,但由于另一个中优先级线程而没有获得执行时间。如果没有优先级继承,等待互斥锁的高优先级线程将被中优先级线程阻塞,称为优先级反转。
osMutexRobust://当线程终止时,自动释放互斥锁
互斥锁健壮属性,如果拥有的线程被终止(通过osThreadExit或osThreadTerminate),健壮的互斥锁将被自动释放。非健壮互斥锁不会被释放,用户必须手动确保释放互斥锁。

使用逻辑“OR”操作选择多个选项

互斥量的创建
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

osMutexId_t mutex_id;   /* 互斥量  */
const osMutexAttr_t Thread_Mutex_attr = {"myThreadMutex",     // human readable mutex name
//  osMutexRecursive,    // attr_bits  //互斥量的类型osMutexPrioInherit | osMutexRobust,NULL,                // memory for control block   0U                   // size for control block
};void thread_Start_App(void *argument)
{osStatus_t status;uint8_t ucKeyCode;		/* 按键代码 */MsgQueue_T   lt_Qqueue;MEM_BLOCK_t *pMem;mpid_MemPool = osMemoryPoolNew(MEMPOOL_OBJECTS, sizeof(MEM_BLOCK_t), NULL);if (mpid_MemPool == NULL){printf("MemoryPool is Failed. \r\n");//创建失败}else{printf("MemoryPool is OK. \r\n");//创建失败}msgQueue_ID = osMessageQueueNew(QUEUE_SIZE,           //队列的元素数量sizeof(pMem),  //单个元素的大小NULL                 //队列的属性);if(NULL==msgQueue_ID){printf("msgQueue_ID is Failed. \r\n");//队列创建失败}else{printf("msgQueue_ID is Success. \r\n");//队列创建成功}																	 threadID_LED = osThreadNew(thread_LED_App,NULL,&thread_LED_Attr);   /* 创建LED线程 */  if(NULL == threadID_LED){printf("threadID_LED is Failed. \r\n");//创建失败}else{printf("threadID_LED is OK. \r\n");//创建成功}mutex_id = osMutexNew(&Thread_Mutex_attr);if (mutex_id != NULL)  {printf("(mutex_idD is OK. \r\n");//创建成功}threadID_User= osThreadNew(thread_User_App,NULL,&thread_User_Attr);   /* 创建LED线程 */  if(NULL == threadID_User){printf("threadID_User is Failed. \r\n");//创建失败}else{printf("threadID_User is OK. \r\n");//创建成功}while(1){status = osMutexAcquire(mutex_id,osWaitForever);//	永久等待,直到等到互斥量printf("threadID_Star  is  Acquire  mutex_id. \r\n");HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);status = osMutexRelease(mutex_id);//	永久等待,直到等到互斥量if (status == osOK) {printf("threadID_Star  is  Release mutex_id. \r\n");}osDelay(100);}
}void thread_LED_App(void *argment)
{osStatus_t status;MEM_BLOCK_t *pMem;while(1){
//		osMessageQueueGet(msgQueue_ID,(void *)&pMem, NULL, osWaitForever);  //出队列,永久等待//		HAL_GPIO_TogglePin(LED_GPIO_Port,LED_Pin);
//	    printf("msgQueue_ID get is OK  pMem->Buf[0] is %d,pMem->Idx is  %d \r\n",pMem->Buf[0],pMem->Idx);//获取队列数据成功
//		 osMemoryPoolFree(mpid_MemPool,pMem);            // free mem blockstatus = osMutexAcquire(mutex_id,osWaitForever);//	永久等待,直到等到互斥量printf("threadID__LED  is  Acquire  mutex_id. \r\n");osDelay(2000);status = osMutexRelease(mutex_id);//	永久等待,直到等到互斥量if (status == osOK) {printf("threadID__LED  is  Release mutex_id. \r\n");}}
}

看下打印结果
在这里插入图片描述
同时,LED本来是100ms的频率闪烁。由于互斥量的原因,LED也因此变成2秒闪烁

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

商务英语学习柯桥学外语到泓畅-老外说“go easy on me”是什么意思?

在口语中“go easy on sb ”这个短语是很常见的 01 go easy on me 怎么理解? 在口语中,“go easy on me”是一个非常常见的表达,通常表示请求对方在某方面对自己宽容一些,不要对自己太过苛刻或严厉。 短语(go&#xff…

vscode在cmake config中不知道怎么选一个工具包?select a kit

vscode在cmake config中不知道怎么选一个工具包,或者发现一直在用VS的工具包想换成自己的工具包。select a kit vscode在cmake config中不知道怎么选一个工具包,或者发现一直在用VS的工具包想换成自己的工具包。select a kit 1.在VSCode中 按ctrlshift…

SpringBoot【实用篇】- 热部署

文章目录 目标:1.手动启动热部署2.自动启动热部署4.禁用热部署 目标: 手动启动热部署自动启动热部署热部署范围配置关闭热部署 1.手动启动热部署 当我们没有热部署的时候,我们必须在代码修改完后再重启程序,程序才会同步你修改的信息。如果我们想快速查…

AI 原生时代,更要上云:百度智能云云原生创新实践

本文整理自百度云智峰会 2024 —— 云原生论坛的同名演讲。 我今天分享的主题,是谈谈在云计算和 AI 技术快速发展和深入落地的背景下,百度智能云在云原生的基础设施产品和技术层面做的一些创新实践。 毋庸置疑,过去十几年云计算和 AI 技术是…

Java项目实战II基于Java+Spring Boot+MySQL的植物健康系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者,专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 基于Java、…

BGP路径属性与路由反射器

前言 IBGP水平分割规则用于防止AS内部产生环路,在很大程度上杜绝了IBGP路由产生环路的可能性,但是同时也带来了新的问题:BGP路由在AS内部只能传递一跳,如果建立IBGP对等体全互联模型又会加重设备的负担。 BGP 路径属性 AS_Path …

uniapp学习(010-2 实现抖音小程序上线)

零基础入门uniapp Vue3组合式API版本到咸虾米壁纸项目实战,开发打包微信小程序、抖音小程序、H5、安卓APP客户端等 总时长 23:40:00 共116P 此文章包含第113p的内容 文章目录 抖音小程序下载抖音开发者工具先去开发者工具里进行测试 抖音开放平台配置开始打包上传…

无线基础配置

配置图 各部分配置 AC1 vlan b [AC6605]vlan batch 10 20 100 Info: This operation may take a few seconds. Please wait for a moment...done. [AC6605]int [AC6605]interface g [AC6605]interface GigabitEthernet 0/0/2 [AC6605-GigabitEthernet0/0/2]port …

影刀RPA实战:识别简单计算验证码

1.官方计算验证码 基于影刀AI引擎的验证码识别指令,该指令不是长期免费,有一定的免费额度,用完之后需要我们到影刀官方充值。 上图使我们要识别的计算验证码 影刀指令代码: 配置我们选择计算题,文件路径本次指定本地…

HarmonyOS:UIAbility组件概述

一、概述 UIAbility组件是一种包含UI的应用组件,主要用于和用户交互。 UIAbility的设计理念: 原生支持应用组件级的跨端迁移和多端协同。支持多设备和多窗口形态。 UIAbility划分原则与建议: UIAbility组件是系统调度的基本单元&#xff0c…

单链表的基本操作实现

定义 链表节点长这个样子,数据域data指针域next指向下一个结点 typedef struct lnode {int data;struct lnode *next; }lnode ,*linklist; 初始化 /*初始化*/ linklist f1(){linklist l(linklist)malloc(sizeof(lnode));l->nextNULL;return l; }int main(){l…

C++ 优先算法——复写零(双指针)

目录 题目:复写零 1. 题目解析 2. 算法原理 一. 先找到最后一个“复写”数 处理边界情况 二. 复写操作 3. 代码实现 题目:复写零 1. 题目解析 题目截图: 该题目要求的与移动零相似,都要在一个数组上进行操作,…

使用linuxdeployqt打包Qt程序问题及解决方法

dpkg: 处理归档 libmysqlclient18_5.6.25-0ubuntu1_amd64.deb (--install)时出错: 预依赖问题 - 将不安装libmysqlclient18:amd64 在处理时有错误发生: libmysqlclient18_5.6.25-0ubuntu1_amd64.deb下载libmysqlclient18/5.6.25 libmysqlclient18/5.6…

配置BGP与IGP交互和路由自动聚合示例

组网需求 如图所示,用户将网络划分为AS65008和AS65009,在AS65009内,使用IGP协议来计算路由(该例使用OSPF做为IGP协议)。要求实现两个AS之间的互相通信。 配置思路 采用如下的思路配置BGP与IGP交互: 在AR…

基于SpringBoot的健身房系统的设计与实现(源码+定制+开发)

博主介绍: ✌我是阿龙,一名专注于Java技术领域的程序员,全网拥有10W粉丝。作为CSDN特邀作者、博客专家、新星计划导师,我在计算机毕业设计开发方面积累了丰富的经验。同时,我也是掘金、华为云、阿里云、InfoQ等平台…

flex 布局比较容易犯的错误 出现边界超出的预想的情况

flex 布局比较容易犯的错误 出现边界超出的预想的情况 如图 当使用flex布局时,设置flex:1 或者是flex:x 时 如果没有多层嵌套的flex布局,内容超出flex:1规定的后,仍然会撑大融器 在flex:1 处设置 overflow:hidden 即可超出后不显…

vscode | 开发神器vscode快捷键删除和恢复

目录 快捷键不好使了删除快捷键恢复删除的快捷键 在vscode使用的过程中,随着我们自身需求的不断变化,安装的插件将会持续增长,那么随之而来的就会带来一个问题:插件的快捷键重复。快捷键重复导致的问题就是快捷键不好使了&#xf…

商家如何在高德地图上申请店铺入驻?

在当今数字化时代,互联网成为了消费者寻找商品和服务的主要渠道。高德地图作为国内领先的地图导航软件,不仅拥有庞大的用户基础,还为商家提供了优质的店铺展示平台。因此,对于实体店商家而言,入驻高德地图是提升店铺曝…

Cpp多态机制的深入理解(20)

文章目录 前言一、多态的概念二、多态的定义与实现两个必要条件虚函数虚函数的重写重写的三个例外override 和 final重载、重写(覆盖)、重定义(隐藏) 三、抽象类概念接口继承和实现继承 四、多态的原理虚表和虚表指针虚函数调用过程动态绑定与静态绑定 五、那...那单继承甚至多…

数字IC后端实现之Innovus Place跑完density爆涨案例分析

下图所示为咱们社区a7core后端训练营学员的floorplan。 数字IC后端实现 | Innovus各个阶段常用命令汇总 该学员跑placement前density是59.467%,但跑完place后density飙升到87.68%。 仔细查看place过程中的log就可以发现Density一路飙升! 数字IC后端物…