浅析 UCOS信号量
信号量有 3种用途:
1)
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
达事件的发生次数或者已发生事件的数量。
2) 表达资源可用性,例如有一台打印机,信号量值为 1 表示打印机空闲,
为 0表示打印机被占用。这是资源可用量的一个特例,也可以说,信号
量值为 1表示有 1台打印机空闲,为 0表示无打印机空闲。
3) 表达资源可用量,例如有 10个串口,信号量值用于表达空闲串口数量。
UCOS 代码没有显式地区分信号量的用途并作分别处理,因为这些用途的
代码处理是完全相同的。
假设信号量用于表达事件发生的次数,OSSemCreate创建一个事件,初始
化事件计数器初值为 0。当一个任务等待事件发生时,若事件未发生,事件计数
器为 0,任务保持等待状态。
假设信号量用于表达资源可用性(或数量),OSSemCreate 创建一个事件,
初始化资源计数器初值为 10。当一个任务等待资源可用时,若无可用资源,资
源计数器为 0,任务保持等待状态。
事件计数器和资源计数器在程序中是同一个变量,可见,当这个变量为 0时,
无论用于信号量用于事件计数器还是资源计数器,都会使(等待事件的和申请资
源的)任务保持等待状态。
假设信号量用于表达事件发生的次数,某个任务或中断触发了事件,事件计
数器递增为非 0,表示事件已发生,UCOS会调度等待事件发生的任务获得执行。
假设信号量用于表达资源可用性(或数量),当一个任务用完并释放资源时资
源计数器递增为非 0,表示有资源可用,UCOS会调度等待资源可用的任务获得
执行。
事件计数器和资源计数器在程序中是同一个变量,可见,当这个变量非 0时,
无论信号量用于事件计数器还是资源计数器,都会使(等待事件的和申请资源的)
任务获得执行。
OSSemPend,等待事件发生,或者等待资源可用,都是等待事件计数器(资
源计数器) 变为非 0。
OSSemPost,触发事件发生,或者
通知
关于发布提成方案的通知关于xx通知关于成立公司筹建组的通知关于红头文件的使用公开通知关于计发全勤奖的通知
资源可用,都是将事件计数器(资源
计数器) 递增为非 0。
在调用 OSSemPend时,若事件已发生,或者资源已可用,事件计数器(资
源计数器) 已是非 0,就要调度等待事件的或者等待资源的任务获得执行,并递
减事件计数器(资源计数器)。
在 OSSemPost 之后,事件已发生,或者资源已可用,事件计数器(资源计
数器) 已是非 0,就要调度等待事件的或者等待资源的任务获得执行,并递减事
件计数器(资源计数器)。
可见,当信号量用于表达事件时,将事件计数器初始化为 0,当信号量用于
资源可用性或可用数量时,将资源计数器初始化为非 0。通过将同一变量(既作事
件计数器又作资源计数器)初始化为不同值,既表达了信号量的用途,又使同一
套代码服务于多种用途。