os_mutex_lock
所属模块:同步机制 | 类型:互斥锁获取函数
函数简介
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 可能导致任务阻塞,
并触发优先级继承机制以避免优先级反转问题。