核心接口
os_mutex_init():初始化指定互斥锁资源。os_mutex_lock():请求获取互斥锁。os_mutex_unlock():请求释放当前任务持有的互斥锁。
使用前请确认资源编号有效、初始化已经完成,并核对当前版本的返回值和任务上下文限制。
资源数据模型
根据原有设计说明,Mutex 使用 OS_RES 资源单元关联资源状态、 持有者标识和等待任务信息。这些状态共同支撑加锁、等待和解锁流程。
资源状态
描述资源是否可用,并与当前持有者信息保持一致。
等待状态
记录等待该资源的任务,为后续唤醒或调度提供依据。
字段类型、状态编码和更新顺序应以当前版本的结构定义及内核源码为准。
初始化流程
按原页面所描述的模型,初始化会将资源设为可用状态, 清除持有者标识,并重置等待信息。
重新初始化可能破坏现有持有者和等待任务之间的关系。 请在任务开始并发访问前完成初始化。
加锁流程
加锁首先需要检查资源状态和当前持有者。 当资源已被其他任务占用时,内核还需要处理竞争、等待以及相关优先级状态。
判断互斥锁是否处于可获取状态。
资源可用时建立持有关系;资源被占用时按内核规则处理。
若当前实现支持阻塞等待,则按相应等待机制处理任务状态。
原始说明指出该 Mutex 不支持递归加锁。重复获取时的具体返回行为应以接口实现为准。
解锁流程
解锁时需要检查调用者与资源持有者的关系,再更新资源状态、 优先级相关状态和等待任务信息。
解锁后的具体行为可能是释放资源后由等待任务重新竞争, 也可能涉及直接移交所有权。两种语义不同,应根据源码确认, 不能仅凭唤醒动作推断资源已完成移交。
优先级继承
当高优先级任务等待低优先级任务持有的互斥锁时, 可能发生优先级反转。如果内核实现了优先级继承, 可以在符合条件时临时提高持有者的有效优先级, 帮助其获得运行机会并尽快释放资源。
发生竞争
高优先级任务等待锁,低优先级任务仍持有共享资源。
继承机制
若实现适用的优先级继承规则,持有者的有效优先级可临时调整。
应重点检查继承触发条件、有效优先级的保存与恢复、 多锁持有场景,以及等待任务的选择规则。
优先级继承旨在缓解特定条件下的优先级反转, 并不意味着所有等待时间都能消除,也不等同于对整个临界区作出固定的最坏执行时间保证。
使用原则与典型场景
- 共享数据:保护多个任务共同访问的数据结构。
- 外设驱动:协调多个任务对同一外设操作流程的访问。
- 复合操作:保护需要作为整体完成的多步读写过程。
- 文件系统与协议栈:在确有共享访问需求时保护相关状态。
避免不必要的长时间操作和可能造成循环等待的调用。 检查所有正常退出路径,确保互斥锁能按规则释放。
Mutex 与其他 IPC 机制
Mutex · 互斥锁
关注共享资源的独占访问与持有者关系。
Semaphore · 信号量
通常用于资源计数或任务同步。
Event · 事件
通常用于状态表达和任务通知。
Message Queue · 消息队列
用于按队列规则缓冲和传递数据。
选择 IPC 机制时,应首先明确目标是保护共享资源、同步任务执行, 还是传递数据,再结合对应接口和内核语义做决定。