當乙個任務等待訊號量、互斥型訊號量、時間標誌組或訊息佇列時,該任務就被放入任務掛起錶或等待表中,帶有任務掛起錶的核心物件如下:
核心物件
訊號量、互斥訊號量
os_sem、os_mutex
訊號量、事件標誌組
os_sem、os_***_grp
訊息佇列
os_q
每種核心物件的頭部都包含三個相同的資料域,第乙個資料域為核心物件的型別,系統通過該資料域判斷核心物件的型別
核心物件
type資料域的值(4個ascii值)
訊號量sema
互斥訊號量
mutx
事件標誌組
flag
訊息佇列
queu
struct os_pend_list
;
任務掛起錶實際上不直接指向任務的控制塊,而是指向乙個os_pend_data型別的資料結構,該型別的資料結構會在任務被放入任務掛起錶時動態地分配到該任務的堆疊空間中。
struct os_pend_data
;
μc/os-iii僅僅允許任務同時等待多個訊號量和(或)多個訊息佇列,不支援同時等待多個事件標誌組或互斥訊號量。
struct os_sem
;
os_pend_list結構體中pendlist->nbrentries表明有多少個任務正在等待該訊號量,pendlist->headptr指向等待該訊號量的最高優先順序任務(即os_pend_data結構體),pendlist->tailptr指向等待該訊號量的最低優先順序任務(即os_pend_data結構體)
每個os_pend_data結構體都指向其對應的任務控制塊tcb,因此可以通過訊號量的任務掛起錶知道哪個任務在等待該訊號量
每個任務控制塊中的os_tcb.penddatatblptr又指回到os_pend_data結構體(此處指向的可能是乙個結構體陣列,表徵該任務正在同時等待多個核心物件,每乙個表項表明乙個等待的核心物件)
os_pend_data結構體構成乙個雙向鍊錶,系統可以很容易的新增或刪除掛起錶中的任意乙個任務
μc/os-iii僅僅允許任務同時等待多個訊號量和(或)多個訊息佇列,不支援同時等待多個事件標誌組或互斥訊號量。
乙個任務呼叫ospendmulti()來等待多個核心物件,同時指定乙個超時時間,該時間對任務等待的核心物件都有效,如果在指定的超時時限內,沒有物件被發布,該任務將返回乙個錯誤**,表示等待超時。
os_obj_qty ospendmulti (os_pend_data *p_pend_data_tbl,
/*等待多個核心物件的os_pend_data結構體陣列,結構體中.pendobjptr表明任務等待的核心物件*/
os_obj_qty tbl_size,
/*等待核心物件的數目,即os_pend_data結構體陣列的大小*/
os_tick timeout,
/*等待超時時間*/
os_opt opt,
/*等待物件選項*/
os_err *p_err)
/*返回錯誤碼*/
//例如:乙個任務等待3個訊號量,2個訊息佇列
os_sem mysem1;
os_sem mysem2;
os_sem mysem3;
os_q myq1;
os_q myq2;
void
mytask
(void
)}
當被呼叫時,ospendmulti()函式首先驗證os_pend_data表中指定的所有物件是否為os_sem或os_q,如果不是則返回錯誤碼。之後函式遍歷os_pend_data表中的所有物件以確定是否有任何乙個物件已經被發布,如果有,ospendmulti()就會根據情況填充表中的.rdyobjptr、.rdymsgptr、rdymsysize和.rdyts成員。
4.1 乙個任務同時等待多個訊號量
乙個指向os_pend_data表基位址的指標被放到同時等待兩個訊號量的任務的控制塊中即os_tcb.penddatatblptr
os_pend_data表的表項數也被放在該任務的控制塊中(即os_tcb.penddatatblentries),表明該任務同時等待幾個核心物件
第乙個訊號量指向os_pend_data表的第乙個表項
os_pend_data表的第乙個表項資料os_pend_data[0].pendobjptr指向等待的第乙個訊號量
由於第乙個訊號量只有乙個任務在等待,所以os_pend_data[0]中的prevptr和nextptr都指向null
第二個訊號量的具體指向同第乙個訊號量
4.2 多個任務同時等待多個訊號量
多個任務同時等待多個訊號量時,os_pend_data表被串聯起來,位於雙向鍊錶前面的os_pend_data結構體屬於高優先順序,後面的屬於低優先順序。當乙個任務等待多個核心物件時,os_pend_data表中只有乙個表項的rdyobjptr為非空值,表明這個任務等待的哪個核心物件被發布。
例如,上面n哪個等待3個訊號量,2個訊息佇列的任務,如果第乙個訊息佇列被發布,則os_pend_data表中的內容如下圖:
C OS III 任務就緒表
在系統中,所有已經就緒等待執行的任務都被放入乙個所謂 就緒表 ready list 中,該錶包括兩部分 1.1 就緒優先順序位對映表 每一位代表乙個優先順序,當某一優先順序由任務就緒時,在就緒優先順序位對映表中該優先順序對應的位被置1,之所以按照上圖的順序對映,是為了便於使用一條特殊的指令 計算前導...
C OSIII 任務通訊(訊息傳遞)
使用情況 乙個任務或者中斷服務程式與另乙個任務交流資訊 使用方法 訊息佇列服務函式的實現 在os q.c檔案中,在編譯時,將os cfg.h檔案中的配置常數os cfg q en設為1就可啟用這些服務函式。常用訊息佇列的服務函式有 void osqcreate os q p q,指向訊息佇列控制塊的...
ucos任務掛起
建立好了任務之後,就已經初步跨進了ucosii的程式設計了,隨著進一步的程式設計,發現學會建立了任務還是不夠的,建立任務1用於串列埠1傳送資料,任務2用於串列埠1接收資料,程式本身的意圖是傳送完資料後,接著就串列埠1接收反饋回來的資訊,但是不能正常通訊,原因就是當任務1在傳送資料過程 cpu時不是會...