os_sem_take
所属模块:通信机制 | 类型:信号量获取(P操作)
函数简介
os_sem_take 用于申请信号量资源(P操作)。
当信号量大于0时立即获取,否则当前任务进入阻塞状态,
并触发调度器切换到其他任务执行。
该函数是典型的同步机制核心接口,用于任务间互斥与资源竞争控制。
函数原型
char os_sem_take(u8 id) reentrant;
参数说明
| 参数 |
说明 |
| id |
信号量ID(必须小于 OS_INFORMATION_PUBLIC) |
源码实现
char os_sem_take(u8 id) reentrant
{
if(id >= OS_INFORMATION_PUBLIC)
return -1;
while(1)
{
EA = 0;
if(OS_INFORMATION_COMMON[id] > 0)
{
OS_INFORMATION_COMMON[id]--;
EA = 1;
return 0;
}
EA = 1;
os_switch(); // 阻塞等待
}
}
使用示例
void task1(void)
{
while(1)
{
os_sem_take(0); // 获取资源
// 临界区
do_something();
os_sem_give(0); // 释放资源
}
}
注意事项
当信号量为0时,该函数会阻塞当前任务,并进入调度器切换流程。