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线程在交替运行。
在这里插入图片描述

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
### 回答1: MDK操作系统(Keil RTX)是一种基于ARM Cortex-M微控制器设计的实时操作系统,它提供了一系列的API,用于实现任务管理、同步和互斥机制、事件管理等功能,使嵌入式系统的开发更加简单和高效。本文将针对MDK操作系统RTX使用手册进行分析和解释。 RTX使用手册的主要内容包括了RTX的基础概述、任务管理、同步和互斥机制、事件管理、内存管理、定时器、堆栈以及钩子函数等。 首先是对RTX的基础概述,包括了RTX的特点,支持的处理器和开发工具,以及RTX操作系统的一些基本定义和数据结构。 接着是任务管理、同步和互斥机制、事件管理等方面的详细说明。任务管理是RTX最基本的功能之一,通过RTX提供的API,可以方便地创建和控制任务的执行。同步和互斥机制则是用于协调任务间的数据访问,避免数据竞争和冲突。事件管理则是用于任务间的通信和协作,能够实现任务间的异步通信和消息传递。 另外,RTX使用手册也包括了内存管理、定时器、堆栈和钩子函数等方面的讲解。这些功能可以帮助用户更好地管理系统资源、实现精准定时和任务优先级控制,以及对任务周期进行实时监控和调试等。 总之,MDK操作系统RTX使用手册是开发者在MDK环境下使用RTX的重要工具和参考,对于实现嵌入式系统的高效开发与控制,熟练掌握该使用手册中的内容,将极大地提高开发效率和系统质。 ### 回答2: MDK操作系统RTX使用手册是一份关于Keil软件开发工具的操作指南,主要面向使用MDK软件开发环境进行嵌入式应用程序开发的工程师和开发人员。手册中涵盖了RTX实时操作系统的各种用法和实现方法,包括任务管理、信号、消息队列、任务优先级等。使用此手册可以快速学习和使用RTX实时操作系统,提高开发效率和编程质。 手册主要分为四部分:介绍、基础知识、API和附录。手册中的介绍部分介绍了RTX实时操作系统的基本概念、功能特点和开发环境。基础知识部分涵盖了RTOS基础知识、线程概念、线程与进程的区别等内容。API部分则详细讲解了RTX的各种API函数,如任务、信号、事件标志、消息队列等。附录部分包括了常见的错误信息、常用的程序控制语句和调试命令等。 除了API部分,手册中还提供了很多RTX的示例程序,这些示例程序可以帮助读者更好地理解RTX的各种功能,并且可以作为读者开发自己的应用程序的参考。 总之,MDK操作系统RTX使用手册是一份非常重要的开发指南,能够帮助嵌入式应用程序开发人员快速掌握RTX实时操作系统的使用方法,并且提供丰富的示例代码和应用实例,帮助开发人员更好地完成各种嵌入式系统开发任务。 ### 回答3: MDK操作系统的RTX使用手册提供了详细的使用说明,以帮助开发者更轻松地使用操作系统。 首先,RTX提供了一个非常方便的任务管理器,可以让开发者轻松地管理任务。支持任务的优先级、任务的延时等参数的配置,可以使开发者更加容易地管理任务。 其次,RTX提供了非常丰富的时间管理功能,包括超时延时、软定时器等,可以大大减轻开发者的工作负担,并提高代码的鲁棒性。 此外,RTX还提供了一些常用的操作系统服务,例如:信号互斥、消息队列、邮箱等。这些操作系统服务可以在多个任务之间共享数据,并保证数据的安全性。 最后,MDK操作系统的RTX使用手册还提供了很多的示例代码和工程文件,以帮助开发者更加快速地上手。 总的来说,MDK操作系统的RTX使用手册为开发者提供了一个非常完整而强大的操作系统框架,为开发高质的嵌入式应用程序提供了非常好的支持。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Wallace Zhang

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

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

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

打赏作者

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

抵扣说明:

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

余额充值