-
查询一个关于-emc datadomain 2500 存储设备的维护手册
资源介绍
程序清单 L6.12 无等待地请求一个信号量
INT16U OSSemAccept (OS_EVENT *pevent)
{
INT16U cnt;
OS_ENTER_CRITICAL();
if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { (1)
OS_EXIT_CRITICAL();
return (0);
}
cnt = pevent->OSEventCnt; (2)
if (cnt > 0) { (3)
pevent->OSEventCnt--; (4)
}
OS_EXIT_CRITICAL();
return (cnt); (5)
}
6.5.5 查询一个信号量的当前状态, OSSemQuery()
在应用程序中,用户随时可以调用函数 OSSemQuery()[程序清单 L6.13]来查询一个信号量
的当前状态。该函数有两个参数:一个是指向信号量对应事件控制块的指针 pevent。该指针是
在生产信号量时,由 OSSemCreate()函数返回的;另一个是指向用于记录信号量信息的数据结构
OS_SEM_DATA(见 uCOS_II.H)的指针 pdata。因此,调用该函数前,用户必须先定义该结构变
量,用于存储信号量的有关信息。在这里,之所以使用一个新的数据结构的原因在于,调用函
数应该只关心那些和特定信号量有关的信息,而不是象OS_EVENT数据结构包含的很全面的信息。
该数据结构只包含信号量计数值.OSCnt 和等待任务列表.OSEventTbl[]、.OSEventGrp,而
OS_EVENT中还包含了另外的两个域.OSEventType和.OSEventPtr。
和其它与信号量有关的函数一样,OSSemQuery()也是先检查 pevent 指向的事件控制块是
否是 OSSemCreate()产生的[L6.13(1)],然后将等待任务列表[L6.13(2)]和计数值[L6.13(3)]
从 OS_EVENT结构拷贝到 OS_SEM_DATA 结构变量中去。