os_mutex_lock

所属模块:同步机制 | 类型:互斥锁获取函数

API Metadata

函数ID:os_mutex_lock
模块:mutex
类型:mutex lock
嵌套深度:2

函数简介

os_mutex_lock 用于获取互斥锁资源, 当资源被占用时任务将进入阻塞等待状态。

该函数支持优先级继承机制,可避免优先级反转问题, 是 RTOS 中关键的同步控制接口之一。

函数原型

char os_mutex_lock(char mid);

参数说明

参数 说明
mid 互斥锁ID(0 ~ OS_RESOURCE_MAX-1)

返回值

1 - 成功获取或进入等待队列
0 - (保留语义)等待路径触发
-1 - 参数非法或递归锁冲突

源码实现

#include "hrtos_internal.h" /* ========================================================= * 互斥锁获取(支持优先级继承) */ char os_mutex_lock(char mid) { OS_RESOURCE *m; char tid; if (mid < 0 || mid >= OS_RESOURCE_MAX) { return -1; } tid = OS_CURRENT_TASK; m = &OS_RES[mid]; EA = 0; /* ------------------------- * 递归锁保护 * ------------------------- */ if (m->owner == tid) { EA = 1; return -1; } /* ------------------------- * 空闲 → 直接获取 * ------------------------- */ if (m->owner == OS_INVALID_ID) { m->owner = tid; OS_TASK[tid].base_prio = (OS_PROCESS_OK[tid] & 14) >> 1; OS_TASK[tid].cur_prio = OS_TASK[tid].base_prio; EA = 1; return 1; } /* ------------------------- * 优先级继承 * ------------------------- */ OS_TASK[tid].base_prio = (OS_PROCESS_OK[tid] & 14) >> 1; OS_TASK[tid].cur_prio = OS_TASK[tid].base_prio; if (OS_TASK[tid].cur_prio > OS_TASK[m->owner].cur_prio) { OS_TASK[m->owner].cur_prio = OS_TASK[tid].cur_prio; OS_PROCESS_OK[m->owner] &= 0xF1; OS_PROCESS_OK[m->owner] |= ((OS_TASK[tid].cur_prio & 0x07) << 1); } EA = 1; /* ------------------------- * 进入阻塞等待 * ------------------------- */ os_wait(WAIT_MUTEX, mid, 0); return 1; }

使用示例

void task() { os_mutex_lock(0); // 临界区操作 os_mutex_unlock(0); }

注意事项

mutex lock 可能导致任务阻塞, 并触发优先级继承机制以避免优先级反转问题。

相关推荐