RTX5 | 互斥量01 - 互斥量的使用

一、前言


互斥量通常在各种各样的操作系统上用于资源管理。MCU上的很多资源能被复用,但是,在同一个时刻上仅仅只有一个线程能访问这些资源(例如通讯(串口,SPI),内存,文件等)。互斥量通常用于保护一些共享资源的访问。在线程上获取互斥量,也必须释放互斥量(释放了互斥量,其他线程才能访问共享资源)。
在这里插入图片描述
互斥量是一个特别的信号量。在同一个时刻,信号量可以有多个访问权限,而互斥量仅仅只有一个访问权限(只允许一个线程访问)。它要么有效的(1),要不被一个获取了互斥量的线程阻塞(0)。互斥量的好处在于它引入线程所有权。当一个线程获取了互斥量就变成互斥量的拥有者,获取互斥量并没有任何延时(通过osMutexRecursive设置)。所以,互斥量的获取与释放可以被嵌套。
在这里插入图片描述
以上都是从RTX5官方文档翻译过来的。除此之外,我强烈建议把《嵌入式实时操作系统uc/OS-III》的第13章-资源管理仔细读几遍,在实际工作中反复思考

STM32工程:
链接:https://pan.baidu.com/s/1jZc6XpyOJ9So2ey_7Bw4CA
提取码:jalh

二、实验目的


1、LED线程与A线程分别成功获取互斥量后继续,线程终止时释放互斥量。

三、API


3.1、osMutexAttr_t

/* 使用案例1 */
const osMutexAttr_t Thread_Mutex_attr =
{
	.name         = "Mutex One",                         /* 互斥量名字 */
	.attr_bits    = osMutexPrioInherit | osMutexRobust,  /* 继承更高优先级(解决优先级反转问题),线程终止时(终止态)自动释放互斥量 */
};

/* 使用案例2 */
const osMutexAttr_t Thread_Mutex_attr =
{
	.name         = "Mutex One",
	.attr_bits    = osMutexPrioInherit | osMutexRobust | osMutexRecursive,  /* 继承更高优先级,线程终止时自动释放互斥量,一个线程多次获取互斥量不会进入阻塞态 */
};

/* 使用案例3 */
const osMutexAttr_t Thread_Mutex_attr =
{
	.name         = "Mutex One",
	.attr_bits    = 0,              /* 不继承更高优先级,线程终止时不自动释放互斥量,一个线程多次获取互斥量将会进入阻塞态(除非先释放互斥量才能再一次获取互斥量) */
};

在这里插入图片描述

3.2、osMutexNew

/* 使用案例1 */
osMutexId_t  mutexID_One = NULL;                       /* 保存互斥量ID */

const osMutexAttr_t Thread_Mutex_attr =
{
	.name         = "Mutex One",                         /* 互斥量名字 */
	.attr_bits    = osMutexPrioInherit | osMutexRobust,  /* 继承更高优先级(解决优先级反转问题),线程终止时自动释放互斥量 */
};

mutexID_One = osMutexNew(&Thread_Mutex_attr);          /* 创建互斥量 */ 

在这里插入图片描述

3.3、osMutexAcquire

/* 使用案例 */
osMutexAcquire(mutexID_One,osWaitForever);    /* 获取互斥量,一直等待直到获取成功 */
osMutexAcquire(mutexID_One,10U);              /* 获取互斥量,超时时间10个time ticks */

在这里插入图片描述

3.4、osMutexGetOwner

/* 使用案例 */
osThreadId_t thread_Owner; 

thread_Owner = osMutexGetOwner(mutexID_One);  /* 获取互斥量metxID_One的线程拥有者 */ 

在这里插入图片描述

3.5、osMutexRelease

/* 使用案例 */
status = osMutexRelease(mutexID_One);  /* 释放互斥量 */

在这里插入图片描述

四、代码


4.1、main.h

在这里插入图片描述

4.2、main.c

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

五、Event Recorder调试


5.1、System Analyzer

从System Analyzer看到互斥量被使用。
在这里插入图片描述

5.2、RTX RTOS

在这里插入图片描述

5.3、Debug (printf) Viewer

LED线程与A线程在交替运行。
在这里插入图片描述

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wallace Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值