信号量之创建信号量——OSSemCreate()

来源:互联网 发布:mysql设置外键约束 编辑:程序博客网 时间:2024/06/05 11:11
OS_EVENT  *OSSemCreate (INT16U cnt){    OS_EVENT  *pevent;#if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */    OS_CPU_SR  cpu_sr = 0;#endif    if (OSIntNesting > 0) {                                /* See if called from ISR ...               */        return ((OS_EVENT *)0);                            /* ... can't CREATE from an ISR             */    }//如果是中断服务子程序调用创建信号量函数,则返回空指针     OS_ENTER_CRITICAL();//关中断     pevent = OSEventFreeList;//如果不是中断服务子程序调用,则将下一个空闲事件控制块链表指针赋给当前指针  /* Get next free event control block        */     if (OSEventFreeList != (OS_EVENT *)0) {                /* See if pool of free ECB pool was empty   */        OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;    }//如果事件控制块不为空,则将下一个空闲的事件控制块指针赋给空闲事件控制块链表    OS_EXIT_CRITICAL();//开中断    if (pevent != (OS_EVENT *)0) {                         /* Get an event control block               */        pevent->OSEventType    = OS_EVENT_TYPE_SEM;        //获得一个空闲事件控制块后,将事件类型值设置为3        pevent->OSEventCnt     = cnt;                      /* 设置信号量的值                      */        pevent->OSEventPtr     = (void *)0;                /* 将当前获得的事件控制块从空闲事件控制块链表中移除                */#if OS_EVENT_NAME_SIZE > 1        pevent->OSEventName[0] = '?';                      /* Unknown name                             */        pevent->OSEventName[1] = OS_ASCII_NUL;#endif        OS_EventWaitListInit(pevent);                      /* 对事件控制块的等待任务列表进行初始化,此时注意,因为信号量正在被初始化,这时候没有任务                                                              在等待该信号量,故将OSEventGrp和OSEvnetTbl[]清0      */    }    return (pevent);                                       //返回给调用者一个指向事件控制块的指针。注:此指针我们称为该信号量的句柄,因为所有对该信号量                                                              操作的函数都是通过这个指针完成的,如果没有可用的事件控制块,那么就返回一个指向NULL的空指针 }


原创粉丝点击