ucOS- II中設計了五種通訊機制
4.2.4 OSMboxPost:往郵箱發(fā)送消息: 首先檢查是否有任務(wù)正在等待郵箱消息的到來(lái),如果有的話(huà)就通過(guò)OS_EventTaskRdy找到優(yōu)先級最高的任務(wù),然后重新調度,注意,這時(shí)候要發(fā)送的消息會(huì )放到優(yōu)先級最高任務(wù)的TCB中!如果沒(méi)有任務(wù)在等待該郵箱消息的到來(lái),就直接把消息放到郵箱中。
5 隊列的實(shí)現
隊列的實(shí)現類(lèi)似于郵箱,也是用來(lái)從一個(gè)任務(wù)向其他任務(wù)發(fā)送消息,不過(guò),隊列更為復雜,之所以稱(chēng)之為隊列,它可以發(fā)送多個(gè)消息,可以把郵箱看成是只發(fā)送一個(gè)消息的隊列。
5.1 數據結構的設計:
由于隊列可以發(fā)送多個(gè)消息,所以?xún)H僅用ECB不能滿(mǎn)足要求,于是作者引入了另外一個(gè)數據結構QS_Q,用來(lái)描述隊列代表的多個(gè)消息,但是這里與 郵箱不同的是,QS_Q本身并不包含消息本身,而是隊列代表的一系列消息的描述。當然,真正的消息放在一個(gè)系統的消息緩沖區MsgTbl,這個(gè)緩沖區是預 先定義好的,其大小根據實(shí)際的應用而定制。所以對于隊列來(lái)說(shuō),用到三個(gè)數據結構,ECB, QS_Q, MsgTbl,其中ECB和QS_Q是每個(gè)隊列都有一個(gè),而MsgTbl是系統中所有隊列共享的!
QS_Q由ECB的變量OSEventPtr引出,ECB的OSEventCnt沒(méi)有用到,其他的變量用法同信號量。對于QS_Q來(lái)說(shuō),和ECB一樣是從系統QS_Q緩沖區中申請的。
5.2 核心函數為五個(gè),其中四個(gè)類(lèi)似于前面的信號量,互斥體和郵箱,此外還多了一個(gè)清空隊列的函數:
5.2.1 OSQCreate:創(chuàng )建一個(gè)隊列:首先申請一個(gè)ECB,然后申請一個(gè)QS_Q,最后初始化申請到的ECB和QS_Q,其中用到OS_EventWaitListInit初始化等待任務(wù)表。
5.2.2 OSQDel:刪除一個(gè)隊列:實(shí)現和信號量的OSSemDel基本一樣,不同的是,由于隊列引入了QS_Q,必須加歸還申請到的QS_Q到系統QS_Q緩沖區的操作。
5.2.3 OSQPend:等待一個(gè)消息:注意這個(gè)函數只是等待一個(gè)消息,而這個(gè)消息是不是想要的它并不知道!首 先通過(guò)QS_Q判斷該隊列是不是有消息,如果有的話(huà)更新QS_Q然后返回;如果該隊列沒(méi)有消息,那么更新當前任務(wù)的TCB以表明當前任務(wù)正在等待該隊列的 消息,然后通過(guò)OS_EventTaskWait掛起當前任務(wù),然后重新調度——OS_Sched!這個(gè)時(shí)候當前任務(wù)會(huì )等到消息到來(lái)或者超時(shí)才會(huì )得以繼續 執行。。。當繼續執行的時(shí)候,判斷是得到消息才執行,還是超時(shí),如果是前者的話(huà),直接更新當前任務(wù)的TCB;如果是后者的話(huà),通過(guò)OS_EventTO更 新?tīng)顟B(tài)。
5.2.4 OSQPost:發(fā)送一個(gè)消息:這個(gè)函數放一個(gè)消息到隊列。首先檢查是不是有任務(wù)在等待該隊列的消息,如果有的話(huà),就通過(guò)OS_EventTaskRdy 找到正在等待該隊列消息的任務(wù)中優(yōu)先級最高的那個(gè),然后重新調度——OS_Sched!如果沒(méi)有的話(huà),更新該隊列的QS_Q,也就是加一個(gè)消息進(jìn)該隊列。
5.2.5 OSQFlush:刷新該隊列,其實(shí)就是簡(jiǎn)單的重置QS_Q,系統消息緩沖區MsgTbl是不需要改動(dòng)的!
前面對信號量,互斥體,郵箱,隊列做了一個(gè)簡(jiǎn)單的總結,這四個(gè)通訊機制的核心都是ECB,而這里總結的事件組(evnet flag),作者沒(méi)有用ECB,而是重新設計了兩個(gè)單獨的數據結構來(lái)實(shí)現。下面對事件組這最復雜的通訊機制做一總結,呵呵
6 事件組
事件組的用途主要是把多個(gè)事件和多個(gè)任務(wù)能夠聯(lián)系起來(lái),使通訊機制更加靈活,它有兩部分組成:一是表示了各個(gè)事件的狀態(tài);二是等待這些事件的任務(wù)列表。
6.1 數據結構設計:
如上面提到的,事件組用到了全新的兩個(gè)數據結構:OS_FLAG_GRP和OS_FLAG_NODE——OS_FLAG_GRP有三個(gè)變 量:OSFlagType(和ECB中的OSEventType一樣,用來(lái)標識這是一個(gè)事件組),OSFlagWaitList(負責引出等待事件組的任 務(wù)列表)和OSFlagFlags(標識當前事件狀態(tài));OS_FLAG_NODE有六個(gè)變量:OSFlagNodeNext和 OSFlagNodePrev(用來(lái)將OS_FLAG_NODE構成雙向列表),OSFlagNodeTCB(正在等待事件組的任務(wù) TCB),OSFlagNodeFlagGrp(該變量反向指到OS_FLAG_GRP,用來(lái)記錄事件組),OSFlagNodeFlags(標識任務(wù)和 該節點(diǎn)關(guān)聯(lián)的任務(wù)正在等待的事件標志)和OSFlagNodeWaitType(標識該節點(diǎn)相關(guān)聯(lián)任務(wù)正在等待的方式:是全部等到,還是只等其中一個(gè))。 從上面不難看出,OS_FLAG_GRP其實(shí)相當于ECB中的除了等待任務(wù)表的其他三個(gè)變量,而OS_FLAG_NODE相當于等待任務(wù)表,不同的是,由 于等待的任務(wù)不是僅僅等待一個(gè)事件,而是等待一系列事件,這樣,等待任務(wù)表就不能勝任了——因為等待任務(wù)表只能標明哪些個(gè)任務(wù)正在等待,但是等待的目標是 唯一的,而這里等待的目標可能會(huì )是多個(gè)!
6.2 核心功能函數:
由于用到了不同的數據結構,OS_EventWaitListInit,OS_EventTaskRdy,OS_EventTaskWait和 OS_EventTO就必須重新設計,作者在這里設計了另外的核心功能函數,OS_FlagBlock,OS_FlagRdy和 OS_FlagUnlink。
6.2.1 OS_FlagBlock:其作用相當于OS_EventTaskWait:將當前任務(wù)從就緒任務(wù)表中移走,更新當前任務(wù)的TCB,不同的是,在 OS_EventTaskWait中將當前任務(wù)加入等待任務(wù)表,而這里由于沒(méi)有用到等待任務(wù)表,而是創(chuàng )建一個(gè)OS_FLAG_NODE,換句話(huà)說(shuō),只要有 OS_FLAG_NODE就表明有任務(wù)在等待事件組,其實(shí)原理上和等待任務(wù)表是一樣的。
6.2.2 OS_FlagRdy:其作用相當于OS_FlagTaskRdy:將OS_FLAG_NODE所指向的任務(wù)的TCB更新以表明等到了事件組,如果該任務(wù) 不在等待其他的目標,將其加入就緒任務(wù)表中。然后用OS_FlagUnlink將此任務(wù)的OS_FLAG_NODE刪除。
6.2.3 OS_FlagUnlink:該函數主要是把特定的OS_FLAG_NODE從等待任務(wù)列表中刪除。
6.3 核心函數和信號量類(lèi)似,有四個(gè),其實(shí)現比較簡(jiǎn)單:
6.3.1 OSFlagCreate: 創(chuàng )建一個(gè)事件組:從系統事件組緩沖區中申請一個(gè)OS_FLAG_GRP,然后初始化該OS_FLAG_GRP。
6.3.2 OSFlagDel:刪除一個(gè)事件組:和信號量的OSSemDel幾乎完全一樣,不同的是用OS_FlagRdy而不是OS_EventTaskRdy。
6.3.3 OSFlagPend:等待一個(gè)事件組:這里的等待有兩種情況:等待所有的事件到來(lái),等待任何一個(gè)事件到來(lái)。不管哪種情況,都是先判斷需要的標識是不是已 經(jīng)到來(lái),如果到來(lái)的話(huà)就更新事件組,然后返回;如果沒(méi)有到來(lái)的話(huà),就會(huì )用OS_FlagBlock為當前任務(wù)產(chǎn)生一個(gè)OS_FLAG_NODE,并將其加 進(jìn)雙向鏈表里。
6.3.4 OSFlagPost:標識一個(gè)事件組一些標識已經(jīng)到來(lái):先更新OS_FLAG_GRP,然后遍歷OS_FLAG_NODE的雙向鏈表,用OS_FlagRdy使那些正在等待這些標識的任務(wù)不再等待。
7 各種通訊機制的比較
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
綜合以上五種通訊機制可以看出:信號量是最普通的通訊機制,當需要一般的同步或者資源保護的話(huà),用信號量就可以了;互斥體主要用來(lái)解決優(yōu)先級反 轉的問(wèn)題,當需要在任務(wù)間同步資源的時(shí)候,用互斥體;郵箱主要用來(lái)將一個(gè)消息從一個(gè)任務(wù)發(fā)送到另一個(gè)任務(wù);隊列可以看作是擴展的郵箱,隊列可以發(fā)送多個(gè)消 息;事件組是最復雜的一個(gè)通許機制,但最靈活,可以在任務(wù)間用多個(gè)事件標識來(lái)同步,因此用起來(lái)需要特別注意!
關(guān)鍵詞:
ucOS-I通訊機
相關(guān)推薦
-
技創(chuàng )快刀 | 2004-04-29
-
-
wsser | 2004-07-25
-
-
-
Gao | 2003-02-17
-
-
-
-
jameszxj | 2003-09-06
-
唐朝 | 2003-07-11
-
-
-
技術(shù)專(zhuān)區
- FPGA
- DSP
- MCU
- 示波器
- 步進(jìn)電機
- Zigbee
- LabVIEW
- Arduino
- RFID
- NFC
- STM32
- Protel
- GPS
- MSP430
- Multisim
- 濾波器
- CAN總線(xiàn)
- 開(kāi)關(guān)電源
- 單片機
- PCB
- USB
- ARM
- CPLD
- 連接器
- MEMS
- CMOS
- MIPS
- EMC
- EDA
- ROM
- 陀螺儀
- VHDL
- 比較器
- Verilog
- 穩壓電源
- RAM
- AVR
- 傳感器
- 可控硅
- IGBT
- 嵌入式開(kāi)發(fā)
- 逆變器
- Quartus
- RS-232
- Cyclone
- 電位器
- 電機控制
- 藍牙
- PLC
- PWM
- 汽車(chē)電子
- 轉換器
- 電源管理
- 信號放大器
評論