os_mutex_lock
所属模块:通信机制 | 类型:互斥锁获取函数
函数简介
os_mutex_lock 用于获取指定互斥锁,
若锁已被占用,则当前任务进入等待状态。
该函数内置优先级继承机制,
能有效避免高优先级任务被低优先级任务阻塞的问题(优先级反转)。
函数原型
char os_mutex_lock(u8 id) reentrant;
参数说明
| 参数 |
说明 |
| id |
锁ID(0 ~ OS_PROCESS_LOCK_NUMBER-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,否则可能导致系统死锁。