在应用程序中,用户随时可以调用函数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 结构变量中去。
程序清单 L6.13 查询一个信号量的状态 |
INT8U OSSemQuery (OS_EVENT *pevent, OS_SEM_DATA *pdata) |
{ |
INT8U i; |
INT8U *psrc; |
INT8U *pdest; |
|
OS_ENTER_CRITICAL(); |
if (pevent->OSEventType != OS_EVENT_TYPE_SEM) { (1) |
OS_EXIT_CRITICAL(); |
return (OS_ERR_EVENT_TYPE); |
} |
pdata->OSEventGrp = pevent->OSEventGrp; (2) |
psrc = &pevent->OSEventTbl[0]; |
pdest = &pdata->OSEventTbl[0]; |
for (i = 0; i < OS_EVENT_TBL_SIZE; i++) { |
*pdest++ = *psrc++; |
} |
pdata->OSCnt = pevent->OSEventCnt; (3) |
OS_EXIT_CRITICAL(); |
return (OS_NO_ERR); |
} |