uC OS II時間控制塊1

2021-06-27 17:41:55 字數 2804 閱讀 4932

任務或中斷服務程式可以通過事件控制塊(ecb)向另外的任務發訊號,這裡的訊號被看成是事件。(1)中斷服務程式不能等待事件控制塊給它傳送訊號;(2)處於等待狀態狀態的任務可以設定等待超時;(3)多個任務同時等待一事件的發生,當事件發生時,只有優先順序最高的任務得到該事件並進入就緒狀態;

ucosii通過ucos_ii.h中定義的os_event資料結構,維護乙個事件控制塊ecb的所有資訊。該結構中除了包含事件本身的定義外,還定義了等待該事件的所有任務列表。 每個訊號量、互斥型訊號量、訊息郵箱、訊息佇列都應分配到乙個事件控制塊。

600 將任務置於等待事件的任務列表

pevent->oseventgrp |= osmaptbl[prio>>3];

pevent->oseventtbl[prio>>3] |= osmaptbl[prio&0x07];

601 從等待事件的任務列表中使任務脫離等待狀態

清除任務在oseventtbl中的相應位,並且如果其所在組中沒有其他處於等待事件的任務,oseventgrp中的相應位也要清除掉。

602 在等待事件的任務列表中查詢優先順序最高的任務

和查詢處於就緒狀態的任務列表一樣,通過查osunmaptbl得出。

603 空餘事件控制塊鍊錶

事件控制塊的總數由應用程式所需要的訊號量、互斥型訊號量、郵箱、訊息佇列的總數決定。所有事件控制塊ecb被鏈結成乙個單向鍊錶---空餘事件控制塊鍊錶。

604 初始化乙個事件控制塊 os_eventwaitlistinit()

當建立乙個訊號量、郵箱、訊息佇列時,相應的建立函式os??create()通過呼叫os_eventwaitlistinit(),對事件控制塊中的等待任務列表進行初始化。該函式初始化乙個空的等待任務列表,初始化完成時,表中沒有任何等待事件的任務。函式傳遞乙個指標變數給事件控制塊,這個指標變數就是建立訊號量、郵箱等時分配的事件控制塊指標pevent.

605 使乙個任務進入就緒態  os_eventtaskrdy()

當某個事件發生了,要將等待該事件任務列表中最高優先順序任務置於就緒態時,訊號量、郵箱等所對應的post函式呼叫os_eventtaskrdy(),以實現該操作。

606 使乙個任務進入等待某事件發生狀態 os_eventtaskwait()

當某任務須等待乙個事件的發生時,訊號量、郵箱等會通過相應的pend函式呼叫函式oseventtaskwait(),使當前任務從就緒任務列表中脫離就緒態,並放到相應事件的事件控制塊ecb的等待任務表中。

607 由於等待超時而將任務置為就緒態 os_eventto()

如果在預先指定的等待時限內任務等待的事件沒有發生,那麼ostimetick()函式會因為等待超時而將任務的狀態置為就緒態。這種情況下,訊號量、郵箱等通過pend函式呼叫os_eventto()函式,以完成這項工作。

第七章  訊號量管理

訊號量有2部分組成:(1)16位的無符號整型訊號量的計數值(0-65535);(2)由等待該訊號量的任務組成的等待任務表。

ucosii提供了6個對訊號量進行操作的函式,當os_cfg.h中os_sem_en設為0時,所有的訊號量函式都不能用,若配置為1時,ossemcreate(),ossempend(),ossempost()必須有。

700 建立乙個訊號量 ossemcreate()

該函式用來建立乙個訊號量,並對它付初值。中斷服務程式不能呼叫該函式

701 刪除乙個訊號量 ossemdel()

當os_cfg.h中的os_sem_del_en=1時,該函式才被編譯。在刪除訊號量之前,必須首先刪除操作該訊號量的所有任務。中斷服務程式不能呼叫該函式。

702 等待乙個訊號量 ossempend()

真正將任務置入睡眠狀態的操作在os_eventtaskwait()函式中執行;由於得不到訊號量,當前任務就不能再處於就緒態了,於是呼叫任務排程函式讓下乙個處於最高優先順序的任務執行,這樣呼叫ossempend()函式的任務被掛起了,直到訊號量出現才能繼續執行。中斷服務程式不能呼叫該函式。

703 發出乙個訊號量 ossempost()

因為這個函式使更重要的任務進入了就緒態,故呼叫這個函式的任務就不能繼續執行了。當中斷服務子程式呼叫這個函式時,不會發生任務切換,要等到最外層的中斷服務程式呼叫了osintexit()後才能進行。

704 無等待的請求乙個訊號量 ossemaccept()

當任務請求乙個訊號量時,如果該訊號量暫時無效,也可以讓該任務簡單的返回,而不是進入睡眠等待狀態。

705 查詢乙個訊號量的當前狀態  ossemquery()

在應用程式中,隨時可以呼叫函式ossemquery()來查詢乙個訊號量的當前狀態。該函式有2個引數:(1)指向訊號量對應的事件控制塊的指標pevent ;(2)指向用於記錄訊號量資訊的資料結構os_sem_data的指標pdata.

第八章  互斥型訊號量管理

任務可以用互斥型訊號量實現對共享資源的獨佔式處理,互斥型訊號量也稱作mutex,mutex是二值訊號量,除了有普通訊號量的機制外,還有些其他特性(如降解優先順序反轉的問題)。

互斥型訊號量由3個元素組成:

(1)1個標誌,指示mutex是否可以使用(0或1);

(2)1個優先順序,準備一旦高優先順序的任務需要這個mutex,賦給占有mutex的任務; (3)乙個等待該mutex的任務列表。

800 建立乙個互斥型訊號量 osmutexcreate()

801 刪除乙個互斥型訊號量 osmutexdel()

802 等待乙個互斥型訊號量 osmutexpend()

803 釋放乙個互斥型訊號量 osmmtexpost()

804 無等待的獲取互斥型訊號量(任務不掛起)  osmutexaccept()

805 獲取互斥型訊號量的當前狀態  osmutexquery()

UC OS II任務管理(1)之任務控制塊

任務狀態 ucosii任務狀態一共有睡眠 就緒 阻塞 執行 以及中斷掛起五種狀態。睡眠態 dormant 任務已經在記憶體中裝入,但是還沒有進行任務執行的所需要的條件。就緒態 ready 是任務已經做好執行的一切準備了,就只差排程程式排程,將cpu讓給執行。阻塞態 waiting 當任務因為需要某些...

ucos ii的任務控制塊

在作業系統初始化函式osinit執行之後,使用者可以呼叫ostaskcreate或者ostaskcreateext函式來建立使用者任務,因為這兩個函式是核心用來建立任務的,不允許使用者進行修改,因此被稱為系統服務。使用者任務的程式是以函式的形式遊使用者編寫,稱為使用者函式,和作業系統提供的服務劃分了...

uCOS II 之事件控制塊學習

1940 一.事件控制塊ecb資料結構 typedef struct os event 二 關鍵演算法 1 將乙個任務插入到等待事件的任務列表中 當呼叫函式os eventtaskwait 使乙個任務進入等待某事件發生時,需要此演算法,從而將任務插入到等待事件的任務列表中。pevent oseven...