查询一个信号量的当前状态, OSSemQuery()

来源:互联网 发布:大数据架构详解 编辑:程序博客网 时间:2024/06/12 01:01

在应用程序中,用户随时可以调用函数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);

}

0 0