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 - 参数非法或递归锁冲突

源码实现

/*------------------------------------------------------------------------ | FILE DESCRIPTION | ------------------------------------------------------------------------*/ /*------------------------------------------------------------------------ | - File name : mutex_lock.c | - Author : 谭舒 | - Update date : 2026-09-19 | - Copyright(C) : 2026 HRTOS. All rights reserved. ------------------------------------------------------------------------*/ /*------------------------------------------------------------------------ | INCLUDES | ------------------------------------------------------------------------*/ #include "hrtos_internal.h" /*------------------------------------------------------------------------ | API FUNCTIONS | ------------------------------------------------------------------------*/ /** * @brief 获取指定的互斥锁资源。 * * @param[in] mid 互斥锁资源槽位编号。 * * @return 操作结果。 * @retval 1 成功直接获取互斥锁。 * @retval WAIT_SIGNAL 等待互斥锁后被信号唤醒。 * @retval -1 互斥锁资源槽位编号无效,或当前任务已持有该互斥锁。 * * @note 当互斥锁处于空闲状态时,当前任务直接获得互斥锁。 * 当互斥锁已被其他任务持有时,当前任务进入互斥锁等待状态。 * 当等待任务的当前优先级高于互斥锁拥有者时,提升互斥锁拥有者的当前优先级。 * 该互斥锁不支持递归获取。 */ 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; /* 同步到 PROCESS_OK 寄存器(假设低三位存优先级) */ OS_PROCESS_OK[m->owner] &= 0xF1; OS_PROCESS_OK[m->owner] |= ((OS_TASK[tid].cur_prio & 0x07) << 1); } /* 退出临界区 */ EA = 1; /* ------------------------------------------------- * 进入互斥锁等待状态 * ------------------------------------------------- */ return os_wait(WAIT_MUTEX, mid, 0); /* 成功进入等待队列 */ } /*------------------------------------------------------------------------ | END OF FILE: mutex_lock.c | ------------------------------------------------------------------------*/

使用示例

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

注意事项

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

相关推荐