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

2021-09-27 06:22:40 字數 2968 閱讀 3575

同時等待多個核心物件實驗

在前面的幾篇部落格中我介紹了任務如何等待單個物件,比如訊號量、互斥訊號量、訊息佇列和時間標誌組。本篇文章我們就繼續學習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個訊息佇列

os_sem	test_sem1;

//訊號量1

os_sem test_sem2;

//訊號量2

os_q test_q;

//訊息佇列

在開始任務中建立2個訊號量、1個訊息佇列以及兩個任務

//建立訊號量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 現在需要...