核心接口
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)
• 任务同步触发