从零开始学硬件<10>demo源码OceanOS-CM0-B8解读
B8课程信号量上一课B7 用互斥锁保护“同一时刻只能一人用”的资源B8 用计数信号量管理“可同时被 N 个任务占用”的资源。信号量用一个计数值count管理“有多少份可用资源”pend取走一份post归还一份。图一阶段1一口气进场100次count: 100 → 0每次 pend 时 count 0内核直接 count-- 返回成功不阻塞Enter parking OK. ← count 100→99Enter parking OK. ← 99→98...Enter parking OK. ← 1→0图二阶段2前3秒——车位空了超时失败count 0且 task1/2 还在 delay(3000)没有人 post。main_task 每次pend(500) → 挂起最多等 500 tick约 500ms超时返回错误 → 打印失败立刻再 pend(500)……阶段3约t3s——第一次离场唤醒关键task1、task2 同时从 delay 醒来。此时 main_task 多半正挂在 pend 上。以 task1 先跑为例同优先级顺序可能对调(1)task1: os_semaphore_post()等待队列里有main_task不把count而是直接唤醒main_task触发调度(2)main_task(优先级更高)立刻抢跑pend成功返回打印Enter parking OK.再pend → count仍为0 →再次挂起(3)回到task1打印task1:exit.delay(1000)(4)task2: post →再次唤醒main → OK →再挂起打印task2:exit.delay(1000)图三对log可能有个疑问的exit后为什么接着有ok看代码task1和task2先执行os_semaphore_post(g_sem)post唤醒了正在等的main_taskOK往往紧挨在对应的exit前面是优先级抢占造成的。

相关新闻