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 - 参数非法或非当前持有者释放失败

源码实现

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

注意事项

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

相关推荐