互斥量
互斥量的基本概念
互斥量又称互斥信号量(本质是信号量),是一种特殊的二值信号量,它和信号量不同的是,它支持互斥量所有权、递归访问以及防止优先级翻转的特性,用于实现对临界资源的独占式处理。
两种状态:1.开锁 2. 闭锁 取决于该互斥量是否被任务持有
互斥量的优先级继承机制
在 FreeRTOS 操作系统中为了降低优先级翻转问题利用了优先级继承算法。
优先级继承算法是指:
暂时提高某个占有某种资源的低优先级任务的优先级,使之与在所有等待该资源的任务中优先级最高那个任务的优先级相等,而当这个低优先级任务执行完毕释放该资源时,优先级重新回到初始设定值。
个人理解:提高该任务的优先级,防止一些低优先级的任务进来进一步增加高优先级的任务阻塞。
互斥量与二值信号量最大的不同是:互斥量具有优先级继承机制,而信号量没有。
什么是“优先级翻转”?
在很多场合中,某些资源只有一个,当低优先级任务正在占用该资源的时候,即便高优先级任务也只能乖乖的等待
低优先级任务使用完该资源后释放资源。这里高优先级任务无法运行而低优先级任务可以运行
的现象称为“优先级翻转”。
为什么说优先级翻转在操作系统中是危害很大?
因为在我们一开始创造这个系统的时候,我们就已经设置好了任务的优先级了,越重要的任务优先级越高。但是发生优先级翻转,对我们操作系统是致命的危害,会导致系统的高优先级任务阻塞时间过长。
FreeRTOS 的优先级继承机制不能解决优先级反转,只能将这种情况的影响降低到最小,硬实时系统在一开始设计时就要避免优先级反转发生。
互斥量应用场景
- 可能会引起优先级反转的情况
- 任务可能会多次获取互斥量的情况下。这样可以避免同一任务多次递归持有而造成死锁的问题。(递归互斥量)
- 互斥量不可以在中断中应用
互斥量控制块
互斥量函数接口
- osMutexId_t osMutexNew (const osMutexAttr_t *attr)用于创建一个事件组,并返回对应的事件组 ID。
- osStatus_t osMutexDelete (osMutexId_t mutex_id) 在 osMutexDelete 函数中删除互斥量也就是删除信号量
- osStatus_t osMutexAcquire (osMutexId_t mutex_id, uint32_t timeout) mutex_id :互斥量 ID timeout :线程超时等待时间 互斥量获取函数
- osStatus_t osMutexRelease (osMutexId_t mutex_id) 互斥量释放函数