返回 IPC 通信机制
HRTOS / INTER-PROCESS COMMUNICATION

互斥锁 Mutex

面向共享资源的任务同步机制。通过资源所有权与等待管理, 协调多个任务对临界资源的访问,并结合内核优先级处理机制, 降低资源竞争对实时任务执行的影响。

资源互斥 所有权管理 任务同步 优先级处理
OVERVIEW

保护共享资源,明确任务访问边界

Mutex 与普通状态通知不同,它关注的是谁持有资源、其他任务如何等待, 以及资源释放后如何继续执行。合理使用互斥锁,可以让共享数据和外设访问流程更清晰。

01
获取与释放 建立明确的资源持有关系
02
等待管理 协调竞争任务的后续执行
03
优先级处理 具体机制以当前内核实现为准
01

核心接口

Mutex API
接口声明 C / HRTOS
char os_mutex_init(char mid); char os_mutex_lock(char mid); char os_mutex_unlock(char mid);
  • os_mutex_init():初始化指定互斥锁资源。
  • os_mutex_lock():请求获取互斥锁。
  • os_mutex_unlock():请求释放当前任务持有的互斥锁。
i
调用约束
使用前请确认资源编号有效、初始化已经完成,并核对当前版本的返回值和任务上下文限制。
02

资源数据模型

Resource State & Ownership
OS_RES[mid] { value // 资源状态 owner // 当前持有任务 ID wait_mask // 等待任务位图 wait_cnt // 等待计数 }

根据原有设计说明,Mutex 使用 OS_RES 资源单元关联资源状态、 持有者标识和等待任务信息。这些状态共同支撑加锁、等待和解锁流程。

资源状态

描述资源是否可用,并与当前持有者信息保持一致。

等待状态

记录等待该资源的任务,为后续唤醒或调度提供依据。

i
实现边界
字段类型、状态编码和更新顺序应以当前版本的结构定义及内核源码为准。
03

初始化流程

os_mutex_init()
value = 1 owner = OS_INVALID_ID wait_mask = 0 wait_cnt = 0

按原页面所描述的模型,初始化会将资源设为可用状态, 清除持有者标识,并重置等待信息。

!
不要重复初始化正在使用的锁
重新初始化可能破坏现有持有者和等待任务之间的关系。 请在任务开始并发访问前完成初始化。
04

加锁流程

os_mutex_lock()

加锁首先需要检查资源状态和当前持有者。 当资源已被其他任务占用时,内核还需要处理竞争、等待以及相关优先级状态。

1
检查资源状态

判断互斥锁是否处于可获取状态。

2
获取资源或处理竞争

资源可用时建立持有关系;资源被占用时按内核规则处理。

3
等待与调度

若当前实现支持阻塞等待,则按相应等待机制处理任务状态。

i
重复加锁
原始说明指出该 Mutex 不支持递归加锁。重复获取时的具体返回行为应以接口实现为准。
05

解锁流程

os_mutex_unlock()

解锁时需要检查调用者与资源持有者的关系,再更新资源状态、 优先级相关状态和等待任务信息。

请求解锁 │ ├─ 检查调用者是否为合法持有者 │ ├─ 更新资源及优先级相关状态 │ └─ 根据实现规则处理资源释放 与等待任务的后续执行

解锁后的具体行为可能是释放资源后由等待任务重新竞争, 也可能涉及直接移交所有权。两种语义不同,应根据源码确认, 不能仅凭唤醒动作推断资源已完成移交。

06

优先级继承

Priority Inheritance

当高优先级任务等待低优先级任务持有的互斥锁时, 可能发生优先级反转。如果内核实现了优先级继承, 可以在符合条件时临时提高持有者的有效优先级, 帮助其获得运行机会并尽快释放资源。

发生竞争

高优先级任务等待锁,低优先级任务仍持有共享资源。

继承机制

若实现适用的优先级继承规则,持有者的有效优先级可临时调整。

i
需要源码确认
应重点检查继承触发条件、有效优先级的保存与恢复、 多锁持有场景,以及等待任务的选择规则。

优先级继承旨在缓解特定条件下的优先级反转, 并不意味着所有等待时间都能消除,也不等同于对整个临界区作出固定的最坏执行时间保证。

07

使用原则与典型场景

Practical Guidelines
  • 共享数据:保护多个任务共同访问的数据结构。
  • 外设驱动:协调多个任务对同一外设操作流程的访问。
  • 复合操作:保护需要作为整体完成的多步读写过程。
  • 文件系统与协议栈:在确有共享访问需求时保护相关状态。
!
持锁期间保持简短
避免不必要的长时间操作和可能造成循环等待的调用。 检查所有正常退出路径,确保互斥锁能按规则释放。
08

Mutex 与其他 IPC 机制

Choosing the Right Primitive

Mutex · 互斥锁

关注共享资源的独占访问与持有者关系。

Semaphore · 信号量

通常用于资源计数或任务同步。

Event · 事件

通常用于状态表达和任务通知。

Message Queue · 消息队列

用于按队列规则缓冲和传递数据。

选择 IPC 机制时,应首先明确目标是保护共享资源、同步任务执行, 还是传递数据,再结合对应接口和内核语义做决定。