信号量(Semaphore)

基于 OS_RESOURCE.value 的计数型同步机制,用于任务同步与资源控制。

IPC 同步机制 资源计数

定义

Semaphore 是基于计数器的同步原语,核心依赖 OS_RESOURCE.value, 用于资源可用性控制与任务阻塞/唤醒。

核心接口

char os_sem_init(u8 sid, char init_val) char os_sem_post(char sid) u8 os_sem_wait(u8 sid)

数据模型(真实实现)

OS_RESOURCE { value // 信号量计数 owner // 未使用(兼容 mutex) wait_mask // 等待任务位图 wait_cnt // 保留字段 }
Semaphore = value计数 + wait_mask等待队列,不是独立对象。

wait流程(os_sem_wait)

if(value > 0) value-- → 直接返回 else 进入 WAIT_SEM 挂入 wait_mask 阻塞任务

快路径优先:避免调度开销。

post流程(os_sem_post)

if(wait_mask != 0) 选择最高优先级任务 wake_task() else if(value < 255) value++

优先唤醒任务,其次才累加计数。

行为语义

Wait: value > 0 → consume value == 0 → block Post: wake waiting task OR increase value

关键特性

• 无所有权(区别 Mutex)
• 支持计数资源
• ISR可 post,不可 wait阻塞
• wake_task 按优先级选择
• wait_mask 位图管理等待任务

典型用途

• 生产者/消费者模型
• ISR → Task 通知
• 资源池(buffer / connection)
• 任务同步触发