os_mutex_unlock

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

API Metadata

函数ID:os_mutex_unlock
模块:mutex
类型:mutex unlock
嵌套深度:2

函数简介

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); }

注意事项

释放互斥锁时会触发优先级恢复机制, 并可能将锁直接转移给等待队列中的高优先级任务。

相关推荐