os_mutex_unlock
所属模块:同步机制 | 类型:互斥锁释放函数
函数简介
os_mutex_unlock 用于释放互斥锁资源,
并恢复当前任务的原始优先级。
如果存在等待任务,系统会自动选择最高优先级任务唤醒,
并将互斥锁所有权转移给该任务。
函数原型
char os_mutex_unlock(char mid);
参数说明
| 参数 |
说明 |
| mid |
互斥锁ID(0 ~ OS_RESOURCE_MAX-1) |
返回值
1 - 成功释放并转移所有权
0 - 成功释放且无等待任务
-1 - 参数非法或非当前持有者释放失败
源码实现
#include "hrtos_internal.h"
/* =========================================================
* 互斥锁释放(支持优先级恢复 + 任务唤醒)
*/
char os_mutex_unlock(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;
}
/* -------------------------
* 恢复任务原始优先级
* ------------------------- */
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;
}
使用示例
void task()
{
os_mutex_lock(0);
// 临界区操作
os_mutex_unlock(0);
}
注意事项
释放互斥锁时会触发优先级恢复机制,
并可能将锁直接转移给等待队列中的高优先级任务。