OS_EVENT *OSSemCreate (INT16U cnt) ;該函數返回的數據類型爲指針,指針指向的數據類型爲OS_EVENT(事件的數據類型爲結構體)。也就是函數返回一個地址,地址裏存的是新創建的結構體類型所佔據的內存的首地址。
OS_EVENT *pevent;
pevent = OSEventFreeList; if (OSEventFreeList != (OS_EVENT *)0) { /* See if pool of free ECB pool was empty */
OSEventFreeList = (OS_EVENT *)OSEventFreeList->OSEventPtr;
}
;首先創建一個指向OS_EVENT結構體類型的指針pevent;系統初始化時會創建一個空事件控制塊鏈表,而創建的空事件控制塊的數目由常數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
;以上就是對新創建的空任務控制塊的各個量進行初始化。
OS_EventWaitListInit(pevent); ;通過調用OSEventWaitListInit()對事件控制塊中的等待任務列表進行初始化。該函數初始化一個空的等待任務列表,其中沒有任何任務。該函數的調用參數只有一個,就是指向需要初始化的事件控制塊的指針pevent。
return (pevent); ;返回創建的結構體類型數據的首地址的指針