目录
一、LiteOS 与互斥锁简介
在物联网飞速发展的今天,轻量级操作系统扮演着至关重要的角色,LiteOS 便是其中的佼佼者。LiteOS 是华为面向物联网领域开发的一款基于实时内核的轻量级操作系统 ,其内核大小小于 10KB,具有节能特性和快速启动能力,启动时间可达毫秒级。它支持如 NB-IoT、Wi-Fi、以太网、BLE、Zigbee 等多种物联网协议,并能接入不同的云平台,具备 “零配置”“自发现” 和 “自组网” 能力,使得智能硬件开发更为简单,有力地推动了万物互联互通的实现。
在多任务系统中,各个任务可能会同时访问共享资源,这就好比多个工人同时使用同一套工具。如果没有合理的协调机制,就可能出现混乱,导致数据不一致或系统错误。互斥锁(Mutex)就像是一把钥匙,在多任务环境中,它确保同一时刻只有一个任务可以访问共享资源,防止数据冲突和破坏,保障了系统的稳定性和数据的完整性,是保护共享资源的关键工具。接下来,就让我们深入探索 LiteOS 中的互斥锁机制。
二、LiteOS 互斥锁深度剖析
(一)互斥锁的基本概念
互斥锁,全称为互斥型信号量,是一种特殊的二值信号量 ,就像是一扇门的唯一钥匙,用于实现对临界资源的独占式处理。在任意时刻,互斥锁只有两种状态:开锁和闭锁。当任务持有互斥锁时,互斥锁处于闭锁状态,该任务获得互斥锁的所有权,其他任务不能再对该互斥锁进行开锁或持有操作。当任务释放互斥锁后,互斥锁处于开锁状态,任务失去所有权,其他任务才有机会获取该互斥锁来访问共享资源。这种机制确保了同一时刻只有一个任务能够访问共享资源,保证了公共资源操作的完整性,避免了数据竞争和不一致性问题。
与其他同步机制相比,例如信号量,信号量可以允许多个任务同时访问共享资源,只要信号量的计数值大于 0 。而互斥锁则是严格的独占式访问,同一时刻只允许一个任务持有锁。条件变量通常用于线程间的同步,需要与互斥锁配合使用,线程在某些条件下等待,当条件满足时被唤醒。互斥锁则更侧重于保护共享资源的访问,防止多个任务同时对资源进行操作。
(二)优先级继承机制
在多任务系统中,优先级翻转是一个需要特别关注的问题。假设系统中有三个任务:高优先级任务 H、中优先级任务 M 和低优先级任务 L。当低优先级任务 L 持有互斥锁并正在访问共享资源时,高优先级任务 H 被唤醒并尝试获取同一互斥锁。由于互斥锁被 L 持有,H 任务只能进入阻塞状态。此时,如果中优先级任务 M 被唤醒,由于 M 的优先级高于 L,M 任务将抢占 CPU 执行,导致高优先级的 H 任务反而被延迟执行,这就是优先级翻转现象。
LiteOS 采用优先级继承算法来解决这个问题 。当低优先级任务 L 持有互斥锁,而高优先级任务 H 请求该互斥锁时,系统会暂时提高 L 任务的优先级,使其与 H 任务的优先级相同。这样,即使此时有中优先级任务 M 被唤醒,由于 L 任务的优先级已经提升,M 任务也无法抢占 L 任务的 CPU 使用权,从而避免了优先级翻转带来的影响。当 L 任务完成对共享资源的访问并释放互斥锁后,其优先级会恢复到初始设定值。
例如,在一个智能家居系统中,有一个低优先级的任务负责定期读取传感器数据(如温度、湿度传感器)并更新到共享内存中,同时有一个高优先级的任务负责处理用户的紧急控制指令(如紧急关闭设备)。如果低优先级任务正在读取传感器数据并持有互斥锁时,高优先级的紧急控制指令任务被触发,此时通过优先级继承机制,低优先级的传感器数据读取任务的优先级会被提升到与紧急控制指令任务相同,确保紧急控制指令任务不会被不必要地延迟,保证系统的实时响应性。
用图表来表示优先级继承的过程如下:
步骤 |
任务状态 |
互斥锁状态 |
说明 |
1 |
L 任务持有互斥锁,正在访问共享资源;H 任务就绪,等待互斥锁;M 任务未就绪 |
闭锁 |
正常任务执行状态 |
2 |
H 任务请求互斥锁,进入阻塞;L 任务优先级提升到与 H 相同 |
闭锁 |
优先级继承发生 |
3 |
M 任务就绪,但由于 L 任务优先级高于 M,M 无法抢占 CPU |
闭锁 |
避免优先级翻转 |
4 |
L 任务完成资源访问,释放互斥锁,优先级恢复 |