-
创建一份针对EMC DataDomain 2500存储设备的维护手册
资源介绍
程序清单 L6.9 建立一个信号量
OS_EVENT *OSSemCreate (INT16U cnt)
{
OS_EVENT *pevent;
OS_ENTER_CRITICAL();
pevent = OSEventFreeList; (1)
if (OSEventFreeList != (OS_EVENT *)0) { (2)
OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
}
OS_EXIT_CRITICAL();
if (pevent != (OS_EVENT *)0) { (3)
pevent->OSEventType = OS_EVENT_TYPE_SEM; (4)
pevent->OSEventCnt = cnt; (5)
OSEventWaitListInit(pevent); (6)
}
return (pevent); (7)
}
6.5.2 等待一个信号量, OSSemPend()
程序清单 L6.10 是 OSSemPend()函数的源代码。它首先检查指针 pevent 所指的任务控制
块是否是由 OSSemCreate()建立的[L6.10(1)]。如果信号量当前是可用的(信号量的计数值大于
0)[L6.10(2)],将信号量的计数值减 1[L6.10(3)],然后函数将“无错”错误代码返回给它的
调用函数。显然,如果正在等待信号量,这时的输出正是我们所希望的,也是运行 OSSemPend()
函数最快的路径。
如果此时信号量无效(计数器的值是 0),OSSemPend()函数要进一步检查它的调用函数是
不是中断服务子程序[L6.10(4)]。在正常情况下,中断服务子程序是不会调用 OSSemPend()函数