uC/OS-II作為實時多任務操作系統(tǒng),是時間驅動的,必然支持如信號量、消息等機制。事件主要包括信號量和互斥信號量,而事件的組合可以用事件標志組來管理。
在任務管理中任務控制塊承載了任務的相關信息。在時間管理中,這個載體就變成了事件控制塊(ECB)。
事件控制塊(ECB)在事件管理中占據(jù)著舉足輕重的作用。雖然事件控制塊ECB并沒有任務控制塊(TCB)的內(nèi)容豐富,但是在事件處理中仍然是核心的數(shù)據(jù)結構,頻繁被訪問。ECB的定義出現(xiàn)在操作系統(tǒng)的頭文件ucos_ii.h中。定義如下所示:
50.png (16.33 KB, 下載次數(shù): 52)
下載附件
2013-7-31 14:06 上傳
事件控制塊結構體中第一項OSEventType是時間控制塊的類型。為了增加代碼的可讀性,每種類型都在ucos_ii.h中定義了相應的宏,如下所示:
51.png (3.76 KB, 下載次數(shù): 68)
下載附件
2013-7-31 14:06 上傳
可見,OSEventType的取值可以從0到5,如果事件是基于信號量的,那么這個域的值就應該是OS_EVENT_TYPE_SEM,也就是3,單是OS_EVENT_TYPE_SEM比3具有更強的可讀性。
52.png (13.37 KB, 下載次數(shù): 62)
下載附件
2013-7-31 14:06 上傳
可見,事件等待表的大小與任務數(shù)是密切相關的。OS_LOWEST_PRIO是最低優(yōu)先級的任務的優(yōu)先級,也就是空閑任務的優(yōu)先級,這里應該是63,那么(OS_LOWEST_PRIO)/8u+1就是8,和就緒表的大小是一樣的。
事件等待組和事件等待表的關系與任務管理中就緒組和就緒表的關系式一樣的,只不過事件等待組和事件等待表用于管理等待事件發(fā)生的任務,而這兩者都在事件控制塊中,不像就緒組和就緒表是獨立的。
操作系統(tǒng)在ucos_ii.h中,以數(shù)組的形式定義了事件控制塊的實體事件ECB表:
53.png (6.3 KB, 下載次數(shù): 54)
下載附件
2013-7-31 14:06 上傳
該語句在內(nèi)存中分配了OS_MAX_EVENTS個事件控制塊,宏OS_MAX_EVENTS的默認值是10。
注意不要混淆:該表是在ucos_ii.h中聲明的全局變量,類型是OS_EVENT,與ECB中同名的OSEventTbl是不同的。ECB中的OSEventTbl被稱為事件等待表,是ECB中的一項。
一個事件塊標志著一個事件,等待這個事件的任務在事件塊的事件等待組合事件等待表中標記自己的存在,然后被阻塞。當事件發(fā)生時,操作系統(tǒng)回找到優(yōu)先級最高的等待事件發(fā)生的任務,并將該任務就緒,然后在事件等待組和事件等待表中取消該任務的標記。事件等待組合事件等待表的關系同就緒組和就緒表的關系式完全相同的。如下所示:
54.png (19.14 KB, 下載次數(shù): 47)
下載附件
2013-7-31 14:06 上傳
上圖中沒有任務等待事件發(fā)生,因此就緒組位0,就緒表的內(nèi)容頁全是0.假設有優(yōu)先級為20和32的任務在等待事件發(fā)生,那么就緒組和就緒表應該如下圖所示:
55.png (18.83 KB, 下載次數(shù): 52)
下載附件
2013-7-31 14:06 上傳
可見,事件等待組和事件等待表的關系和就緒組與就緒表的關系式完全相同的,結構也是完全相同的。
在事件管理中,將空閑的事件塊連接成一個單向的鏈表——事件控制塊空閑鏈表。這個鏈表的形式和TCB的空閑鏈表的形式是完全相同的。
當創(chuàng)建一個事件的時候,要在事件控制塊(ECB)空閑鏈表中查找是否有空閑的ECB可用。如果有,就從鏈表中取出,分配給事件。要做這件事,首先要找到鏈表的表頭,因此聲明了一個重要的全局變量OSEventFreeList指向表頭的地址,稱為事件空閑鏈表指針。OSEventFreeList的定義如下所示:
56.png (6.08 KB, 下載次數(shù): 59)
下載附件
2013-7-31 14:06 上傳
事件控制塊的OSEventPtr在事件塊未使用的時候沒有其他作用,就被用來指示下一個ECB的指針。在事件控制塊初始化程序結束的時候,該鏈表如下所示:
57.png (17.36 KB, 下載次數(shù): 61)
下載附件
2013-7-31 14:06 上傳
|