同時等待多個核心物件實驗
在前面的幾篇部落格中我介紹了任務如何等待單個物件,比如訊號量、互斥訊號量、訊息佇列和時間標誌組。本篇文章我們就繼續學習ucosiii中的是如何同時等待多個核心物件的,在ucosiii中只支援同時等待多個訊號量和訊息佇列,不支援同時等待多個事件標誌組和互斥訊號量。
首先我會介紹什麼是同時等待多個核心物件,然後介紹相關的函式,最後會有乙個小實驗來驗證我們前面所學習的理論。
ucosiii中的乙個任務可以同時等待任意數量的訊號量或者訊息佇列,當只要等待其中的任意乙個的時候就會導致該任務進入就緒態,如下圖所示:
設計乙個應用程式,該程式有3個任務、2個訊號量、和1個訊息佇列。任務a用於建立其它2個任務、2個訊號量和1個訊息佇列。b任務為任務1,用於按鍵檢測,當檢測到按鍵key1被按下就傳送訊號量1,當key2被按下就傳送訊號量2,當key_up被按下就傳送訊息佇列,任務1還用來控制led0的閃爍。任務c呼叫函式ospendmulti()來同時等待2個訊號量和1個訊息佇列
定義2個訊號量,1個訊息佇列
在開始任務中建立2個訊號量、1個訊息佇列以及兩個任務os_sem test_sem1;
//訊號量1
os_sem test_sem2;
//訊號量2
os_q test_q;
//訊息佇列
兩個任務的實現//建立訊號量test_sem1
ossemcreate (
(os_sem*
)&test_sem1,
(cpu_char*
)"test_sem1"
,(os_sem_ctr)0,
(os_err*
)&err)
;//建立訊號量test_sem2
ossemcreate (
(os_sem*
)&test_sem2,
(cpu_char*
)"test_sem2"
,(os_sem_ctr)0,
(os_err*
)&err)
;//建立訊息佇列
osqcreate (
(os_q*
)&test_q,
//訊息佇列
(cpu_char*
)"key msg"
,//訊息佇列名稱
(os_msg_qty )queue_num,
//訊息佇列長度
(os_err*
)&err)
;//錯誤碼
//建立task1任務
ostaskcreate
((os_tcb *
)&task1_tasktcb,
(cpu_char *
)"task1 task"
,(os_task_ptr )task1_task,
(void*)
0,(os_prio )task1_task_prio,
(cpu_stk *
)&task1_task_stk[0]
,(cpu_stk_size)task1_stk_size/10,
(cpu_stk_size)task1_stk_size,
(os_msg_qty )0,
(os_tick )0,
(void*)
0,(os_opt )os_opt_task_stk_chk|os_opt_task_stk_clr,
(os_err *
)&err)
;//建立multi測試任務
ostaskcreate
((os_tcb *
)&multi_tasktcb,
(cpu_char *
)"multi task"
,(os_task_ptr )multi_task,
(void*)
0,(os_prio )multi_task_prio,
(cpu_stk *
)&multi_task_stk[0]
,(cpu_stk_size)multi_stk_size/10,
(cpu_stk_size)multi_stk_size,
(os_msg_qty )0,
(os_tick )0,
(void*)
0,(os_opt )os_opt_task_stk_chk|os_opt_task_stk_clr,
(os_err *
)&err)
;
具體的實驗現象,自己燒一下例程就可以看到//任務1的任務函式
void
task1_task
(void
*p_arg)
num++;if
(num==50)
ostimedlyhmsm(0
,0,0
,10,os_opt_time_periodic,
&err)
;//延時10ms}}
//等待多個核心物件的任務函式
void
multi_task
(void
*p_arg)
}
UCOSIII 同時等待多個核心物件
一 相關理論 1 ucosiii只支援同時等待多個訊號量和訊息佇列,不支援同時等待多個事件標誌組和互斥訊號量。2 當等待到任意乙個的時候可以該任務就會進入就緒狀態。二 相關api函式 1 os pend data陣列 os pend data pend muli 3 pend muli 0 pend...
UCOSIII等待多個核心物件
ucosiii中存在很多進行任務同步 交流的方法,例如使用訊號量 互斥訊號量 訊息佇列 事件標誌組,一般都是單獨使用它們進行任務同步,ucosiii同時等待多個核心物件就是實現多對一的任務同步方法。我的理解 現在需要進行任務同步,任務a 任務b可以發布不同的核心物件訊號量sema semb,假設任務...
Shell中同時讀多個檔案
有時需要提取檔案中的乙個或多個列元素生成新的檔案,這一操作在 shell 裡很容易實現。比如有乙個資料檔案 data,有三列資訊 姓名 學號 班級。redraiment 0612800134 0601 christine 0612800136 0601 zb 0612800229 0602 現在需要...