文章目录
一、前言
互斥量通常在各种各样的操作系统上用于资源管理。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线程在交替运行。