UCOSIII等待多個核心物件

2021-10-02 17:12:08 字數 2219 閱讀 5488

ucosiii中存在很多進行任務同步、交流的方法,例如使用訊號量、互斥訊號量、訊息佇列、事件標誌組,一般都是單獨使用它們進行任務同步,ucosiii同時等待多個核心物件就是實現多對一的任務同步方法。

我的理解:

現在需要進行任務同步,任務a、任務b可以發布不同的核心物件訊號量semasemb,假設任務c是需要同步的,同步的意思就是當某些事件發生時才進行接下來的動作。在任務c中呼叫ospendmulti()對sema、semb進行等待,當未等待到任何訊號量時就會掛起當前任務,當等待到semasemb亦或者同時等待到sema、semb時,任務c就會釋放執行後面的程式、動作。

當然是否選擇掛起等待是可以通過opt進行設定的。

os_obj_qty  ospendmulti (os_pend_data  *p_pend_data_tbl,

os_obj_qty tbl_size,

os_tick timeout,

os_opt opt,

os_err *p_err)

引數:

p_pend_data_tblos_pend_data型別的指標,

tbl_size:等待的核心物件的數量

timeout:超時時間,為0則一直等待

opt:選項位元組:

阻塞等待os_opt_pend_blocking、非阻塞等待os_opt_pend_non_blocking

p_err:錯誤碼

使用方法:

index=

ospendmulti

((os_pend_data*

)pend_multi_tbl,

(os_obj_qty )core_obj_num,

//核心數量

(os_tick )0,

(os_opt )os_opt_pend_blocking,

(os_err*

)&err)

;

在使用pend_multi_tbl之前,需要初始化為我們設定要等待的核心物件,只支援訊號量和訊息佇列。下面是初始化為兩個訊號量和乙個訊息佇列:

os_pend_data pend_multi_tbl[core_obj_num]

; pend_multi_tbl[0]

.pendobjptr=

(os_pend_obj*

)&test_sem1;

pend_multi_tbl[1]

.pendobjptr=

(os_pend_obj*

)&test_sem2;

pend_multi_tbl[2]

.pendobjptr=

(os_pend_obj*

)&test_q;

os_pend_data是一種結構體型別,成員pendobjptr就是指向我們要等待的物件,因此上面的例子初始化的是pendobjptr,讓其指向我們要等待的三個核心物件。

typedef

struct os_pend_data os_pend_data;

struct  os_pend_data 

;

當在其他地方發布了這些核心物件,上面使用ospendmulti()的任務就會釋放執行從而實現任務間的同步。例如下面的**(部分)使用按鍵對核心物件進行發布,從而實現任務同步。

while(1

)

總結:

ospendmulti()等待多個核心物件是為了進行多對一的任務同步,可以利用它使多個事件的發生觸發另乙個事件執行。

注意:只支援同時等待多個訊號量和訊息佇列,不支援事件標誌組和互斥訊號量。

UCOSIII 同時等待多個核心物件

一 相關理論 1 ucosiii只支援同時等待多個訊號量和訊息佇列,不支援同時等待多個事件標誌組和互斥訊號量。2 當等待到任意乙個的時候可以該任務就會進入就緒狀態。二 相關api函式 1 os pend data陣列 os pend data pend muli 3 pend muli 0 pend...

UCOSIII中同時等待多個核心物件

同時等待多個核心物件實驗 在前面的幾篇部落格中我介紹了任務如何等待單個物件,比如訊號量 互斥訊號量 訊息佇列和時間標誌組。本篇文章我們就繼續學習ucosiii中的是如何同時等待多個核心物件的,在ucosiii中只支援同時等待多個訊號量和訊息佇列,不支援同時等待多個事件標誌組和互斥訊號量。首先我會介紹...

等待編譯核心

現在還在編譯核心,看來我得利用編譯核心時間上上網了,乙個核心編譯的時間也未免太長了,可能是我的電腦比較一般的緣故吧,但願這次不要出什麼問題,我發現要是加入乙個工程進入還是很容易編譯出錯的。昨天的心情不是很好,寫 心情是很重要的,程式設計序算是一種高度集中的腦力勞動,沒有平和的心態根本不行,於是昨天到...