os_mutex_lock

所属模块:通信机制 | 类型:互斥锁获取函数

函数简介

os_mutex_lock 用于获取指定互斥锁, 若锁已被占用,则当前任务进入等待状态。

该函数内置优先级继承机制, 能有效避免高优先级任务被低优先级任务阻塞的问题(优先级反转)。

函数原型

char os_mutex_lock(u8 id) reentrant;

参数说明

参数 说明
id 锁ID(0 ~ OS_PROCESS_LOCK_NUMBER-1)

返回值

0 表示成功获取锁,-1 表示参数非法。

源码实现

char os_mutex_lock(u8 id) reentrant { u8 old_ie = IE; if(id >= OS_PROCESS_LOCK_NUMBER) return -1; while(1) { EA = 0; if(OS_PROCESS_LOCK[id].id == 0) { // 获取锁 OS_PROCESS_LOCK[id].id = OS_YUNXING_BIANHAO; OS_PROCESS_LOCK[id].psw = OS_PEOCESS_OK[OS_YUNXING_BIANHAO]; EA = old_ie; return 0; } // 优先级继承 { u8 owner = OS_PROCESS_LOCK[id].id; u8 owner_pr = (OS_PEOCESS_OK[owner] >> 1) & 7; u8 self_pr = (OS_PEOCESS_OK[OS_YUNXING_BIANHAO] >> 1) & 7; if(owner_pr < self_pr) { OS_PEOCESS_OK[owner] = (OS_PEOCESS_OK[owner] & 0xF1) | (self_pr << 1); } } EA = old_ie; os_switch(); } }

使用示例

void task1() { while(1) { os_mutex_lock(0); // 临界区 shared_data++; os_mutex_unlock(0); } }

注意事项

使用完锁后必须调用 os_mutex_unlock,否则可能导致系统死锁。

相关推荐