OS_EVENT *OSSemCreate (INT16U cnt) ;該函數(shù)返回的數(shù)據(jù)類型為指針,指針指向的數(shù)據(jù)類型為OS_EVENT(事件的數(shù)據(jù)類型為結(jié)構(gòu)體)。也就是函數(shù)返回一個地址,地址里存的是新創(chuàng)建的結(jié)構(gòu)體類型所占據(jù)的內(nèi)存的首地址。
OS_EVENT *pevent;
pevent = OSEventFreeList; if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
}
;首先創(chuàng)建一個指向OS_EVENT結(jié)構(gòu)體類型的指針pevent;系統(tǒng)初始化時會創(chuàng)建一個空事件控制塊鏈表,而創(chuàng)建的空事件控制塊的數(shù)目由常數(shù)OSEventMax來決定。OSEventFreeList就指向這個空事件控制塊鏈表的第一個,所以上面的程序里把OSEventFreeList賦給了pevent,也就是讓pevent指向第一個空事件控制塊,然后又讓OSEventFreeList指向了空事件控制鏈表中的第二個。也就是從空事件鏈表中摘出了第一個給事件使用。
if (pevent != (OS_EVENT *)0) { /* Get an event control block */
pevent->OSEventType = OS_EVENT_TYPE_SEM;
pevent->OSEventCnt = cnt; /* Set semaphore value */
pevent->OSEventPtr = (void *)0; /* Unlink from ECB free list */
#if OS_EVENT_NAME_SIZE > 1
pevent->OSEventName[0] = '?'; /* Unknown name */
pevent->OSEventName[1] = OS_ASCII_NUL;
#endif
;以上就是對新創(chuàng)建的空任務(wù)控制塊的各個量進行初始化。
OS_EventWaitListInit(pevent); ;通過調(diào)用OSEventWaitListInit()對事件控制塊中的等待任務(wù)列表進行初始化。該函數(shù)初始化一個空的等待任務(wù)列表,其中沒有任何任務(wù)。該函數(shù)的調(diào)用參數(shù)只有一個,就是指向需要初始化的事件控制塊的指針pevent。
return (pevent); ;返回創(chuàng)建的結(jié)構(gòu)體類型數(shù)據(jù)的首地址的指針




