os_mutex_lock
所属模块:同步机制 | 类型:互斥锁获取函数
函数简介
os_mutex_lock 用于获取互斥锁资源,
当资源被占用时任务将进入阻塞等待状态。
该函数支持优先级继承机制,可避免优先级反转问题,
是 RTOS 中关键的同步控制接口之一。
函数原型
char os_mutex_lock(char mid);
参数说明
| 参数 |
说明 |
| mid |
互斥锁ID(0 ~ OS_RESOURCE_MAX-1) |
返回值
1 - 成功获取或进入等待队列
0 - (保留语义)等待路径触发
-1 - 参数非法或递归锁冲突
源码实现
#include "hrtos_internal.h"
/* =========================================================
* 互斥锁获取(支持优先级继承)
*/
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;
OS_PROCESS_OK[m->owner] &= 0xF1;
OS_PROCESS_OK[m->owner] |= ((OS_TASK[tid].cur_prio & 0x07) << 1);
}
EA = 1;
/* -------------------------
* 进入阻塞等待
* ------------------------- */
os_wait(WAIT_MUTEX, mid, 0);
return 1;
}
使用示例
void task()
{
os_mutex_lock(0);
// 临界区操作
os_mutex_unlock(0);
}
注意事项
mutex lock 可能导致任务阻塞,
并触发优先级继承机制以避免优先级反转问题。