STM32CubeMX学习笔记26---FreeRTOS互斥量

news2024/11/24 6:39:58

一、互斥量简介

1、互斥量用于互锁,可以充当资源保护的令牌,当一个任务希望访问某个资源时,它必须先获取令牌,当任务使用完资源后,必须返还令牌,以便其他任务可以访问该资源。

2、互斥量一般用于临界资源保护。

3、用互斥量处理不同任务队临界资源的同步访问时,任务想要获取互斥量才能进行资源访问,如果一旦有任务成功获得了互斥量,则互斥量立即变为闭锁状态,此时其他任务会因为获取不到互斥量而不能访问这个资源,任务会根据用户自定义的等待时间进行等待,直到互斥量被持有的任务释放后,其他任务才能获取互斥量从而得到访问该临界资源,此时互斥量再次上锁,如此一来就可以确保每个时刻只有一个任务正在访问这个临界资源,保证了临界资源操作的安全性。

4、互斥量与递归互斥量

互斥量更适合于可能会引起优先级翻转的情况

递归互斥量更适用于任务可能会多次获取互斥量的情况下,这样可以避免同一任务多次递归持有而造成死锁的问题。

核心在于:谁上锁,就只能由谁开锁。

二、STM32CubeMX设置

1、配置RCC、USART1、时钟72M
2、配置SYS,将Timebase Source修改为除滴答定时器外的其他定时器。
3、初始化LED的两个引脚
4、开启FreeRTOS,v1与v2版本不同,一般选用v1即可
5、创建两个线程:任务LED1用作发送,LED2用作接收。

以上步骤可参考:STM32CubeMX学习笔记22---FreeRTOS(任务创建和删除)-CSDN博客

6、创建互斥量Mutex

        在 Mutexes 进行配置。

  • Mutex Name: 互斥量名称
  • Allocation: 分配方式:Dynamic 动态内存创建
  • Conrol Block Name: 控制块名称
7、生成代码

三、程序编程

1、创建一个互斥量:osMutexCreate
函数osMutexId osMutexCreate (const osMutexDef_t *mutex_def)
参数mutex_def: 引用由osMutexDef定义的互斥量
返回值成功返回互斥量ID,失败返回0

例:

osMutexId myMutex01Handle;
 
osMutexDef(myMutex01);
myMutex01Handle = osMutexCreate(osMutex(myMutex01));
2、创建一个递归互斥量:osRecursiveMutexCreate

用于创建一个递归互斥量,不是递归的互斥量由函数 osMutexCreate() 创建,且只能被同一个任务获取一次,如果同一个任务想再次获取则会失败。递归信号量则相反,它可以被同一个任务获取很多次,获取多少次就需要释放多少次。递归信号量与互斥量一样,都实现了优先级继承机制,可以减少优先级反转的反生。

函数osMutexId osRecursiveMutexCreate (const osMutexDef_t *mutex_def)
参数mutex_def: 引用由osMutexDef定义的互斥量
返回值成功返回互斥量ID,失败返回0

要想使用该函数必须在 Config parameters 中把 USE_RECURSIVE_MUTEXES 选择 Enabled 来使能。

例:

osMutexId myMutex02Handle;
 
osMutexDef(myMutex02);
myMutex02Handle = osRecursiveMutexCreate(osMutex(myMutex02));
 3、删除一个互斥量:osMutexDelete 

用于删除一个互斥量。

函数osStatus osMutexDelete (osMutexId mutex_id)
参数mutex_id: 互斥量ID
返回值错误码

例:

osMutexDelete(myMutex01Handle);
4、获取互斥量:osMutexWait

用于获取互斥量,但是递归互斥量并不能使用这个 API 函数获取。

 例:

osMutexWait(myMutex01Handle,osWaitForever);//一直等待获取互斥量
5、获取递归互斥量:osRecursiveMutexWait

        用于获取递归互斥量的宏,与互斥量的获取函数一样,osMutexWait()也是一个宏定义,它最终使用现有的队列机制,实际执行的函数是 xQueueTakeMutexRecursive() 。 获取递归互斥量之前必须由 osRecursiveMutexCreate() 这个函数创建。要注意的是该函数不能用于获取由函数 osMutexCreate() 创建的互斥量。

要想使用该函数必须在 Config parameters 中把 USE_RECURSIVE_MUTEXES 选择 Enabled 来使能。

例:

osRecursiveMutexWait(myMutex02Handle,osWaitForever);//一直等待获取互斥量
6、释放互斥量: osMutexRelease

        用于释放互斥量,但不能释放由函数 osRecursiveMutexCreate() 创建的递归互斥量。

函数osStatus osMutexRelease (osMutexId mutex_id)
参数mutex_id: 互斥量ID
返回值

错误码

例:

osMutexRelease(myMutex01Handle);
7、释放递归互斥量:osRecursiveMutexRelease

        用于释放一个递归互斥量。已经获取递归互斥量的任务可以重复获取该递归互斥量。使用 osRecursiveMutexWait() 函数成功获取几次递归互斥量,就要使用 osRecursiveMutexRelease() 函数返还几次,在此之前递归互斥量都处于无效状态,别的任务就无法获取该递归互斥量。使用该函数接口时,只有已持有互斥量所有权的任务才能释放它,每释放一该递归互斥量,它的计数值就减 1。当该互斥量的计数值为 0 时(即持有任务已经释放所有的持有操作),互斥量则变为开锁状态,等待在该互斥量上的任务将被唤醒。如果任务的优先级被互斥量的优先级翻转机制临时提升,那么当互斥量被释放后,任务的优先级将恢复为原本设定的优先级。

函数osStatus osRecursiveMutexRelease (osMutexId mutex_id)
参数mutex_id: 互斥量ID
返回值错误码

要想使用该函数必须在 Config parameters 中把 USE_RECURSIVE_MUTEXES 选择 Enabled 来使能。

 例:

osRecursiveMutexRelease(myMutex02Handle);
8、互斥量使用

        如果两个线程都使用printf进行打印函数,如果同时打印可能导致资源抢夺,此时可以使用互斥量,将两个线程中打印的东西轮流进行打印,此时就不会出现资源抢夺问题。

LED1:

void LED1_Task1(void const * argument)
{
  /* USER CODE BEGIN LED1_Task1 */
  /* Infinite loop */
	 osStatus xReturn;
	int i=0;
  for(;;)
  {
		HAL_GPIO_TogglePin(GPIOE,GPIO_PIN_5);   //LED1状态每500s翻转一次
		
		//获取互斥量 MuxSem,没获取到则一直等待  上锁
		 xReturn = osMutexWait(myMutex01Handle,     /* 互斥量句柄 */ 
                          osWaitForever);   /* 等待时间 */
    if(osOK == xReturn) 
		{
			//获取到互斥量,此时资源上锁,其他任务不得使用该资源(printf)
			printf("LED1 run %d ",i++);
			printf("LED1 run %d ",i++);
			printf("LED1 run %d \n",i++);
			
		}
		osMutexRelease(myMutex01Handle);//给出互斥量
    osDelay(500);
  }
  /* USER CODE END LED1_Task1 */
}

LED2:

void LED2_Task03(void const * argument)
{
  /* USER CODE BEGIN LED2_Task03 */
  /* Infinite loop */
	 osStatus xReturn = osErrorValue;
	int i=0;
  for(;;)
  { 
		HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_5);   //LED1状态每500s翻转一次
		printf("LED2 run %d \n",i++);
    osDelay(100);
  }
  /* USER CODE END LED2_Task03 */
}

下载验证:

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

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

相关文章

GPT-4引领AI新纪元,Claude3、Gemini、Sora能否跟上步伐?

【最新增加Claude3、Gemini、Sora、GPTs讲解及AI领域中的集中大模型的最新技术】 2023年随着OpenAI开发者大会的召开,最重磅更新当属GPTs,多模态API,未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义,不亚…

【XXL-JOB】分布式任务调度解决方案,XXL-JOB入门

目录 1 概念2 快速入门2.1 启动xxl-job-admin2.2 创建一个新的定时任务2.3 在调度中心新增定时任务 3 详细介绍3.1 新建执行器3.2 创建任务3.3 其他概念3.3.1 路由策略3.3.2 任务运行模式(BEAN、GLUE)3.3.3 阻塞处理策略3.3.4 子任务3.3.5 任务超时时间 3.4 高级任务用法3.4.1 …

源码编译部署LAMP

编译部署LAMP 配置apache [rootzyq ~]#: wget https://downloads.apache.org/apr/apr-1.7.4.tar.gz --2023-12-11 14:35:57-- https://downloads.apache.org/apr/apr-1.7.4.tar.gz Resolving downloads.apache.org (downloads.apache.org)... 88.99.95.219, 135.181.214.104…

如何用 C++ 部署深度学习模型?

深度学习模型通常在诸如Python这样的高级语言中训练和验证,但在实际生产环境部署时,往往需要更高的执行效率和更低的资源占用。C作为一款性能卓越、低级别的编程语言,是部署深度学习模型的理想选择之一。本文将详细介绍如何在C环境下加载和运…

AI智能客服系统的费用

实现智能客服所需的费用取决于多个因素,包括项目的规模、所选择的技术和服务提供商、数据的获取和处理方式等。以下是一些可能影响费用的因素,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作…

使用stream流合并多个List(根据实体类特定属性合并)

开发情景 现有多个List集合,其中都是一样的实体类,这里我想根据实体类的特定属性将它们合并在一起,形成一个最终的List集合。 这里主要用到了Stream流的flatMap方法与reduce方法。 flatMap:可以将多个Stream流合并在一起,形成一个Stream流。 reduce:可以将Stram流中的元…

MySQL的概述与安装

一、数据库的基本概念: 1.1 数据: 1) 描述事物的符号记录称为数据(Data)。数字、文字、图形、图像、声音、档案记录等 都是数据。 2)数据是以“记录”的形式按照统一的格式进行存储的,而不是…

ASA方舟生存飞升计划1.5重置版服务器搭建教程

ASA方舟生存飞升计划1.5重置版服务器搭建教程 大家好我是艾西一个做服务器租用的网络安全工程人员,以前有给大家分享过方舟生存进化的搭建架设教程。方舟这游戏出的时间也很久了,随着时间的推移官方有出新的版本命名为飞升计划,不少的玩家都…

数据库系统概论-第4章 数据库安全性

4.1 数据库安全性概述 4.2 数据库安全性控制 4.3 视图机制 4.4 审计 4.5 数据加密 4.6 其他安全性保护 4.7 小结

SVN修改已提交版本的注释

目录 一、需求分析 二、问题分析 三、解决办法 一、需求分析 ​开发过程中,在SVN提交文件后,发现注释写的不完整或不够明确,想再修改之前的注释文字​。 使用环境: SVN服务器操作系统:Ubuntu 20.04.6 LTS SVN版本&…

linux网络服务学习(2):vsftp

1.什么是vsftp vsftp是linux服务器上的一款使用ftp协议的软件,是linux上使用最广泛的ftp服务端软件 ftp协议是使用明文传输的,很不安全,一般用于局域网内的文件上传、下载 2.vsftp连接类型 ftp连接要用到2个端口:21、20端口。…

Visual Studio 2013 - 重置窗口布局

Visual Studio 2013 - 重置窗口布局 1. Microsoft Visual Studio 2013 - 重置窗口布局References 1. Microsoft Visual Studio 2013 - 重置窗口布局 窗口 -> 重置窗口布局 References [1] Yongqiang Cheng, https://yongqiang.blog.csdn.net/

HarmonyOS定时器与定时任务

HarmonyOS 的 ArkTS 说白了 就是 TS和JS混合 加了一些新特性的语言 定时任务 就还是用 js代码就OK了 我们代码这样写 Entry Component struct Twox {build() {Row() {Column(){Button("触发定时任务").onClick(()>{setTimeout(()> {console.log(执行)},2000…

Halcon 凹坑检测案例

* 使用元组的方法 ImageFile:[] ImageFile[0]:D:/Halcon/产品上的凹坑检测/1.bmp ImageFile[1]:D:/Halcon/产品上的凹坑检测/2.bmp for Index : 0 to |ImageFile|-1 by 1read_image (Image, ImageFile[Index])* 二值化threshold (Image, Region, 100, 255)* 连通性connection (…

C语言实现流水灯

头文件 #ifndef __LED_H__ #define __LED_H__ #define RCC (*(unsigned int *)0X50000A28) #define GPIOE_MODER (*(unsigned int *)0X50006000) #define GPIOF_MODER (*(unsigned int *)0X50007000) #define GPIOE_OTYPER (*(unsigned int *)0X50006004) #define GPIOE_OSPE…

百度千帆模型初次体验【人工智能】

百度千帆模型初次体验【人工智能】 前言版权推荐百度千帆模型初次体验【人工智能】一、百度智能云平台1.领取代金券2.创建应用3.开通付费 二、SpringBoot1.创建SpringBoot项目2.配置文件3.配置Bean4.编写Util5.测试6.结果 三、问题四、资料 最后 前言 2024-3-20 13:38:33 以下…

亚马逊等跨境电商平台自养号测评的五个核心因素

一、安全稳定的环境系统 尽管市场上存在大量现成的系统和软件包,卖个软件或设备给你,这种基本上都没有解决风控的能力,因此,小编推荐大家还是自己掌握相关技术,避免过度依赖于外部资源,目前,也…

从零到一构建短链接系统(七)

1.convention目录下创建exception目录,并创建AbstractException类, ClientException类,ServiceException类,RemoteException类 /*** 抽象项目中三类异常体系,客户端异常、服务端异常以及远程服务调用异常** see Clien…

第2章 数据处理伦理

思维导图 2.1 引言 简单来说,伦理是建立在是非观念上的行为准则。伦理准则通常侧重于公平、尊重、责任、诚信、质量、可靠性、透明度和信任等方面。 数据处理伦理指如何以符合伦理准则的方式获取、存储、管理、使用和销毁数据。 核心概念:对人的影响、…

sentry-cli - error: Failed to load .sentryclirc file from project path

Xcode 15.2 warning sentry-cli - error: Failed to load .sentryclirc file from project path (/Users/zhuhongwei/Desktop/pandabill/.sentryclirc)推荐一下刚上线的 App 熊猫小账本,里面有用到这篇博客讲的内容 熊猫小账本 一个简洁的记账 App,用于…