實時作業系統 C OS 讀書筆記(4)

2021-07-22 18:15:02 字數 3524 閱讀 1562

第4章 任務的同步與通訊

4.1 任務的同步和事件

☆任務間的制約關係:

直接制約:源於任務之間的合作。

間接制約:源於對資源的共享。

因此,多工合作過程中,作業系統要解決兩個問題:

1. 各任務間應該有一種互斥關係

2. 相關的任務在執行上要有先後次序

☆事件:μc/os-ⅱ實現任務之間通訊所使用的中間環節,例如:訊號量、郵箱(訊息郵箱)和訊息佇列。

☆μc/os-ⅱ把任務傳送事件、請求事件以及其他對事件的操作都定義為全域性變數,以**用程式的所有任務來呼叫。

☆訊號量

是一類事件

最初目的:為了給共享資源設立乙個標誌,該標誌表示該共享資源被占用情況

互斥型訊號量:是乙個二值訊號量,可以實現共享資源的獨佔式占用。

某一任務發現訊號量為「1」時,可以進行共享資源的訪問,同時需要把訊號量變為「0」,該任務使用完共享資源後,需要把訊號量由「0」變為「1」。

☆為了解決任務始終等不到訊號量而不能執行出現的宕機的現象,可以給等待訊號量的任務設定乙個等待時限,當等待訊號量的任務因等待某訊號量的時間超過該時限,可以使等待任務脫離等待狀態而繼續執行。

在多工作業系統中,任務間傳遞訊息緩衝區來傳遞資料,用來傳遞訊息緩衝區指標的資料結構,就是訊息郵箱。

☆訊息佇列:

可以傳遞多個訊息的資料結構,傳遞的是乙個指標陣列,陣列的每乙個元素都存放乙個訊息緩衝區指標。

4.2 事件控制塊及事件處理函式

☆等待任務列表:乙個int8u型別的陣列oseventtbl作為等待事件任務的記錄表。

☆等待任務兩方面的管理:

1.對等待事件所有任務記錄並排序

2.允許等待任務有乙個等待時限,即當等待任務認為等不及時可以退出對事件的請求,防止死鎖。

☆等待任務表以任務的優先級別為順序為每個任務分配乙個二進位制單位,該位的「1」表示這一位對應的任務為事件的等待任務,「0」不是等待任務。

☆oseventgrp:乙個int8u型別的變數,表示等待任務表中的任務組,可以加快對等待任務表的訪問速度。

☆等待任務的等待時限:記錄在等待任務的任務控制塊tcb的成員ostcbdly中,並在每個時鐘節拍中斷服務程式中對該資料進行維護。每當有任務的等待時限到時,將該任務從等待任務表中刪除,並使其進入就緒狀態。

☆事件控制塊的結構(ecb)

描述諸如訊號量、郵箱(訊息郵箱)和訊息佇列等事件的資料結構。

定義在檔案μc/os-ⅱ.h中

結構:typedef struct

;os_event;

☆oseventtype可取的值

oseventtype的值 說明

os_event_type_sem 表明事件是訊號量

os_event_type_mutex 表明事件是互斥型訊號量

os_event_type_mbox 表明事件是訊息郵箱

os_event_type_q 表明事件是訊息佇列

os_event_type_unused 空事件控制塊

☆操作事件控制塊的函式

供操訊號量、訊息郵箱和訊息佇列等事件的函式呼叫

1. os_eventwaitlistinit():事件控制塊的初始化函式

原型:void os_eventwaitlistinit(

os_event *pevent

//事件控制塊的指標

);作用:把變數oseventgrp及任務等待表中的每一位都清0,即令事件的任務表中不含有任何等待任務。

在任務呼叫函式os***create()建立事件時被函式os***create()所呼叫。

***的含義

*** 含義

sem 對訊號量進行操作的函式

mutex 對互斥型訊號量進行操作的函式

mbox 對訊息郵箱進行操作的函式

q 對訊息佇列進行操作的函式

2. os_eventtaskwait():使乙個任務進入等待狀態的函式

原型:void os_eventtaskwait(

os_event *pevent

//事件控制塊的指標

);在任務呼叫函式os***pend()請求乙個事件時被函式os***pend所呼叫。

3. os_eventtaskrdy():使乙個正在等待的任務進入就緒狀態的函式

原型:int8u os_eventtaskrdy(

os_event *pevent,

//事件控制塊的指標

void * msg,

//未使用

int8u msk

//清除tcb狀態標識掩碼

);在任務呼叫函式os***post()傳送乙個事件時被函式os***post()所呼叫。

4. os_eventto():使乙個等待超時的任務進入就緒狀態的函式

原型:void os_eventto(

os_event *pevent

//事件控制塊的指標

);在任務呼叫os***pend()請求乙個事件時被函式os***pend()所呼叫。

☆空事件控制塊鍊錶

形成:在μc/os-ⅱ初始化時,系統會在初始化函式osinit()中按應用程式使用事件的總數os_max_events(在檔案os_ceg.h中定義),建立os_max_events個空事件控制塊並借用成員oseventptr作為鏈結指標,把這些空事件控制塊鏈結成乙個單向鍊錶,鍊錶中的所有控制塊尚未與具體事件相關聯。

每當應用程式建立乙個事件時,系統就會從鍊錶中取出乙個空事件控制塊,並對它進行初始化以描述該事件。應用程式刪除乙個事件時,會將該事件的控制塊歸還給空事件控制塊鍊錶。

4.3 訊號量及其操作

☆訊號量:訊號量計數器和等待任務表組成

每當有任務申請訊號量時,如果訊號量計數器oseventcnt的值大於0,則把該值減1並使任務繼續執行,如果oseventcnt的值為0,則會將任務列入任務等待表oseventtbl,使任務處於等待狀態。

如果有正在使用訊號量的任務釋放了該訊號量,則會在任務等待表中找出優先級別最高的等待任務,並在使它就緒後呼叫排程器引發一次排程;如果任務等待表中已經沒有等待任務,則訊號量計數器就加1。

訊號量不使用事件控制塊的成員oseventptr。

☆訊號量的操作:

1.建立訊號量:

呼叫函式ossemcreate()建立訊號量:

原型:os_event *ossemcreate(

int16u cnt

//訊號量計數器初值

); 返回值為已建立的訊號量的指標

2.請求訊號量:

函式ossempend()

原型:void ossempend(

os_event *pevent,

//訊號量的指標

int16u timeout,

//等待時限

int8u *err

//錯誤資訊

);timeout如果為0,則表明任務的等待時間為無限長

若函式呼叫成功,err的值為os_no_err;

失敗,err的值根據具體錯誤,為os_err_pend_isr、

3. 傳送訊號量

4. 刪除訊號量

5. 查詢訊號量的狀態

實時作業系統 C OS

第3章 c os 的中斷和時鐘 3.1 c os 的中斷過程 c os 的中斷過程 系統接收到中斷請求後,如果這時cpu處於中斷允許狀態 即中斷開放 系統會中止正在執行的當前任務,而按照中斷向量的指向轉而去執行中斷服務子程式 當中斷服務子程式的執行結束後,系統將會根據情況返回到被中止的任務繼續執行,...

C OS實時作業系統簡單介紹

c os ii c os ii實時多工作業系統核心。它被廣泛應用於微處理器 微控制器和數字訊號處理器。c os ii 的前身是 c os,最早出自於1992年美國嵌入式系統專家jean j.labrosse 在 嵌入式系統程式設計 雜誌的5月和6月刊上刊登的文章 並把 c os 的原始碼發布在該雜誌...

作業系統讀書筆記

前言管程 訊號量體系有內容如下 整型訊號量 記錄型訊號量 and型訊號量 訊號量集。最容易搞混的就是整型訊號量和記錄型訊號量,理解之後很容易區分,記住一點 整型訊號量不遵循 讓權等待 的原則,只要待操作的訊號量s 0,就會處於一種 忙等待 的狀態,更嚴重的是,一旦事件發生,會導致一種稱之為 驚群現象...