os_mutex_unlock
所属模块:同步机制 | 类型:互斥锁释放函数
函数简介
os_mutex_unlock 用于释放互斥锁资源,
并恢复当前任务的原始优先级。
如果存在等待任务,系统会自动选择最高优先级任务唤醒,
并将互斥锁所有权转移给该任务。
函数原型
char os_mutex_unlock(char mid);
参数说明
| 参数 |
说明 |
| mid |
互斥锁ID(0 ~ OS_RESOURCE_MAX-1) |
返回值
1 - 成功释放并转移所有权
0 - 成功释放且无等待任务
-1 - 参数非法或非当前持有者释放失败
源码实现
/*------------------------------------------------------------------------
| FILE DESCRIPTION |
------------------------------------------------------------------------*/
/*------------------------------------------------------------------------
| - File name : mutex_unlock.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 0 释放互斥锁成功,当前无有效等待任务。
* @retval -1 互斥锁资源槽位编号无效,或当前任务不是互斥锁拥有者。
*
* @note 当前任务必须是指定互斥锁的拥有者。
* 释放互斥锁后恢复当前任务的基础优先级。
* 当存在等待任务时,选择当前优先级最高的等待任务并转移互斥锁所有权,
* 随后唤醒该任务。
*/
char os_mutex_unlock(char mid)
{
OS_RESOURCE *m;
char tid;
/* -------------------------------------------------
* 参数检查
* ------------------------------------------------- */
if(mid < 0 || mid >= OS_RESOURCE_MAX)
{
return -1;
}
/* 当前任务 ID */
tid = OS_CURRENT_TASK;
/* 获取互斥锁对象 */
m = &OS_RES[mid];
/* 进入临界区 */
EA = 0;
/* -------------------------------------------------
* 当前任务不是互斥锁拥有者
* 不允许释放
* ------------------------------------------------- */
if(m->owner != tid)
{
EA = 1;
return -1;
}
/* -------------------------------------------------
* 恢复原始优先级
* -------------------------------------------------
* 释放互斥锁后,
* 取消优先级继承状态
* ------------------------------------------------- */
OS_TASK[tid].cur_prio = OS_TASK[tid].base_prio;
OS_PROCESS_OK[tid] &= 0xF1;
OS_PROCESS_OK[tid] |=
((OS_TASK[tid].cur_prio & 0x07) << 1);
/* -------------------------------------------------
* 唤醒等待队列中的最高优先级任务
* ------------------------------------------------- */
if(m->wait_mask)
{
char i;
char next = OS_INVALID_ID;
char best_prio = -1;
u16 mask = m->wait_mask;
/* -------------------------------------------------
* 在等待队列中寻找最高优先级任务
* ------------------------------------------------- */
for(i = 0; i < OS_PROCESS_MAX; i++)
{
if(mask & ((u16)1 << i))
{
if(OS_TASK[i].cur_prio > best_prio)
{
best_prio = OS_TASK[i].cur_prio;
next = i;
}
}
}
/* -------------------------------------------------
* 防御性检查
* ------------------------------------------------- */
if(next == OS_INVALID_ID)
{
m->wait_mask = 0;
m->owner = OS_INVALID_ID;
EA = 1;
return 0;
}
/* -------------------------------------------------
* 转移互斥锁所有权
* ------------------------------------------------- */
m->owner = next;
/* -------------------------------------------------
* 唤醒任务
* ------------------------------------------------- */
wake_task(next, WAIT_SIGNAL);
EA = 1;
return 1;
}
/* -------------------------------------------------
* 无等待任务
* 互斥锁恢复为空闲状态
* ------------------------------------------------- */
m->owner = OS_INVALID_ID;
EA = 1;
return 0;
}
/*------------------------------------------------------------------------
| END OF FILE: mutex_unlock.c |
------------------------------------------------------------------------*/
使用示例
void task()
{
os_mutex_lock(0);
// 临界区操作
os_mutex_unlock(0);
}
注意事项
释放互斥锁时会触发优先级恢复机制,
并可能将锁直接转移给等待队列中的高优先级任务。