信号量之创建信号量——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的空指针 }