ucosiii中存在很多進行任務同步、交流的方法,例如使用訊號量、互斥訊號量、訊息佇列、事件標誌組,一般都是單獨使用它們進行任務同步,ucosiii同時等待多個核心物件就是實現多對一的任務同步方法。
我的理解:
現在需要進行任務同步,任務a、任務b可以發布不同的核心物件訊號量sema
、semb
,假設任務c是需要同步的,同步的意思就是當某些事件發生時才進行接下來的動作。在任務c中呼叫ospendmulti()
對sema、semb進行等待,當未等待到任何訊號量時就會掛起當前任務,當等待到sema
或semb
亦或者同時等待到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_tbl
:os_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中只支援同時等待多個訊號量和訊息佇列,不支援同時等待多個事件標誌組和互斥訊號量。首先我會介紹...
等待編譯核心
現在還在編譯核心,看來我得利用編譯核心時間上上網了,乙個核心編譯的時間也未免太長了,可能是我的電腦比較一般的緣故吧,但願這次不要出什麼問題,我發現要是加入乙個工程進入還是很容易編譯出錯的。昨天的心情不是很好,寫 心情是很重要的,程式設計序算是一種高度集中的腦力勞動,沒有平和的心態根本不行,於是昨天到...