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时,该函数会阻塞当前任务,并进入调度器切换流程。

相关推荐