ucOS- II中設計了五種通訊機制
1. 先總結一下作為核心的事件控制機制:
1.1 數據結構設計: 類(lèi)似于任務(wù)就緒表一樣,作者設計了等待任務(wù)表,表的作用原理和任務(wù)就緒表完全一樣,甚至共用了OSMapTbl和OSUnMapTbl這 兩個(gè)表,不用之處,任務(wù)就緒表用來(lái)查詢(xún)就緒的任務(wù)中優(yōu)先級最好的那個(gè),而等待任務(wù)表用來(lái)查詢(xún)等待事件的任務(wù)中優(yōu)先級最高的那個(gè),類(lèi)似于就緒表,設計了兩個(gè) 變量:OSEventGrp和OSEventTbl[],不同的時(shí)候這兩個(gè)變量被設計進(jìn)時(shí)間控制塊(event control block ECB)中,也就是說(shuō)對于每個(gè)事件(上述五種)都有一個(gè)等待任務(wù)表。對于ECB,還有其他三個(gè)變量:OSEventType(用來(lái)標識是上述五種的哪一 種), OSEventCnt(信號量和互斥體會(huì )用到)和OSEventPtr(在郵箱中用來(lái)存放消息,在隊列中用來(lái)存放隊列塊的指針)。對于事件組來(lái)說(shuō),作者設 計了另一套數據結構,而沒(méi)有用到ECB。
1.2 事件控制的核心函數有四個(gè),基本上就是對等待任務(wù)表的操作,這些函數將作為上述五種通訊機制的核心功能:
1.2.1 OS_EventWaitListInit:初始化等待任務(wù)表, 很簡(jiǎn)單。
1.2.2 OS_EventTaskRdy:首先找到等待該事件的優(yōu)先級最高的任務(wù),將其從等待任務(wù)表中移走,然后更新該任務(wù)的TCB,最高根據TCB的OSTCBStat變量更新任務(wù)就緒表(如果該任務(wù)沒(méi)有等待任何事件,那么就把它加入任務(wù)就緒表)。
1.2.3 OS_EventTaskWait:首先把當前任務(wù)從任務(wù)就緒表中移走,然后把當前任務(wù)加進(jìn)這個(gè)事件的等待任務(wù)表。這個(gè)函數其實(shí)就是掛起當前任務(wù)!
1.2.4 OS_EventTO:超時(shí)處理函數,將當前任務(wù)從等待任務(wù)列表中移走,并更新TCB使其進(jìn)入就緒狀態(tài),值得注意的是,它并不更新就緒任務(wù)表?。?!
2. 信號量的實(shí)現
信號量的用途主要有三個(gè):第一, 表示一個(gè)或多個(gè)事件的發(fā)生; 第二, 表示共享資源的可用(二值信號量); 第三, 表示n個(gè)相同資源的訪(fǎng)問(wèn)(多值信號量)(這是書(shū)上的說(shuō)法,我認為應該表述為: 表示共享資源對n個(gè)任務(wù)的可用)。
2.1 數據結構設計:信號量只是用到ECB,一個(gè)信號量用一個(gè)ECB表示,沒(méi)有用到其他數據結構。其中ECB的OSEventPtr變量沒(méi)有用到,只是簡(jiǎn)單的將其設為0,因此信號量是比較簡(jiǎn)單的一個(gè)通訊機制。
2.2 核心函數主要有四個(gè):
2.2.1 OSSemCreate:創(chuàng )建一個(gè)信號量:首先從事件控制塊緩沖區中得到一個(gè)ECB,然后初始化這個(gè)ECB,對其中等待任務(wù)表的初始化用到OS_EventWaitListInit。
2.2.2 OSSemDel:銷(xiāo)毀一個(gè)信號量:有兩種情況, 第一,只有在沒(méi)有任務(wù)等待該信號量的時(shí)候才刪除;第二,不管有沒(méi)有任務(wù)等待該信號量都強制刪除;對于第一種情況,用OS_DEL_NO_PEND進(jìn)行標 識,這個(gè)時(shí)候,如果確實(shí)沒(méi)有任務(wù)在等待該信號量,將ECB歸還到ECB緩沖區,然后返回; 如果有任務(wù)在等待該信號量,直接返回錯誤標識,以告訴調用者刪除失敗。 對于第二種情況,用OS_DEL_ALWAYS進(jìn)行標識,首先用OS_EventTaskRdy將等待任務(wù)表中的所有任務(wù)都移走,然后將該ECB歸還到 ECB緩沖區。這個(gè)時(shí)候要做判斷如果剛剛有任務(wù)在等待該信號量(這個(gè)判斷在移走之前已經(jīng)做好),就必須重新調度:OS_Sched!所以,如果當前任務(wù)不是優(yōu)先級最高的任務(wù),那么這個(gè)函數將會(huì )被掛起,呵呵。
2.2.3 OSSemPend:該函數可能會(huì )引起當前任務(wù)被掛起:首先判斷該信號量是否可用,也就是ECB的OSEventCnt是否不為0,如果可用的話(huà)更新 ECB然后返回,任務(wù)繼續執行;如果不可用,那么就更新當前任務(wù)的TCB,然后用OS_EventTaskWait掛起任務(wù),然后重新調度。這時(shí),該函數 將可能被掛起,直到當前任務(wù)獲得該信號量從而恢復執行。然后該函數判斷當前任務(wù)繼續執行的原因,如果是超時(shí)的話(huà),調用OS_EventTO,如果是得到信 號量而返回的話(huà),更新當前TCB,然后返回。另外,這也就是OS_EventTO不更新就緒表的原因——本身已經(jīng)在運行了呀,呵呵。
2.2.4 OSSemPost:該函數釋放該信號量,從而可以使正在等待該信號量的任務(wù)恢復執行: 首先判斷等待任務(wù)表中是否有任務(wù)正在等待該信號量,如果有的話(huà)就通過(guò)OS_EventTaskRdy使等待任務(wù)表中優(yōu)先級最高的任務(wù)不再等待該信號量(具 體的操作如上面所述)。接下來(lái)(不管有沒(méi)有任務(wù)正在等待該信號量)就更新ECB,其實(shí)就是將其中的變量OSEventCnt加1。
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
前面對信號量 做了一個(gè)簡(jiǎn)單的總結,下面對互斥體,郵箱和隊列以及事件組做一個(gè)總結,由于事件組沒(méi)有用到ECB,而其他的都有用到ECB,所以最后總結事件組,也就是 說(shuō),除了事件組會(huì )從一個(gè)作者專(zhuān)門(mén)設計的系統緩沖區申請用到的數據結構,其他的都會(huì )從ECB緩沖區中申請ECB。
3. 互斥體的實(shí)現
從其名字,mutual exclusion semaphore,可以看出來(lái),其實(shí)互斥體屬于信號量的一種,其實(shí)它是一個(gè)二值信號量,之所以把它單獨拿出來(lái)設計,主要是為了解決任務(wù)優(yōu)先級反轉的問(wèn)題 ——當該互斥體被一個(gè)任務(wù)占用的時(shí)候,如果有更高的優(yōu)先級任務(wù)等待該互斥體,那么將占用該互斥體的任務(wù)的優(yōu)先級提升到預先設定的那個(gè)比較高的優(yōu)先級,從而 能改善優(yōu)先級反轉的問(wèn)題,但是不能完全去掉,呵呵。
3.1 數據結構的設計:
和信號量一樣,互斥體只用到ECB這一數據結構, 不同的是,由于它主要被設計用來(lái)解決優(yōu)先級反轉的問(wèn)題,每一個(gè)互斥體都會(huì )一個(gè)實(shí)現設定的優(yōu)先級聯(lián)系起來(lái),這個(gè)優(yōu)先級應該盡量比較高,這樣,擁有這個(gè)互斥體 的任務(wù)將會(huì )先被處理,從而改善優(yōu)先級反轉的問(wèn)題。ECB中,OSEventType用來(lái)標識該事件對象是個(gè)互斥體;OSEventCnt的高8位用來(lái)存放 與該互斥體關(guān)聯(lián)的優(yōu)先級,而低8位存放擁有該互斥體的任務(wù)優(yōu)先級;OSEventPtr存放擁有該互斥體的任務(wù)的TCB指針;剩下的等待任務(wù)表和信號量一 樣,沒(méi)任何區別。
3.2 核心函數和信號量一樣有四個(gè),但是由于每個(gè)互斥體都與一個(gè)任務(wù)優(yōu)先級聯(lián)系起來(lái),實(shí)現有一些復雜:
3.2.1 OSMutexCreate:創(chuàng )建一個(gè)互斥體:首先判斷該優(yōu)先級有沒(méi)有被任務(wù)占用,如果有的話(huà),創(chuàng )建失??;然后從ECB緩沖區中取一個(gè)ECB; 最后初始化得到的ECB,值得注意的是,ECB的變量OSEventCnt的高8位用來(lái)存放關(guān)聯(lián)的優(yōu)先級,當然,等待任務(wù)表還是用 OS_EventWaitListInit來(lái)初始化。
3.2.2 OSMutexDel: 刪除一個(gè)互斥體:其實(shí)現與信號量基本一樣,唯一的不用還是由于其關(guān)聯(lián)了一個(gè)任務(wù)優(yōu)先級,刪除的時(shí)候應該將優(yōu)先級重新標識為可用。
3.2.3 OSMutexPend:等待一個(gè)互斥體:首先判斷是否該互斥體可用,如果可用的的話(huà)就用當前任務(wù)的優(yōu)先級和TCB更新ECB,表明該互斥體已經(jīng)被當前任務(wù)占用,直接返回,這種情況最簡(jiǎn)單; 如果互斥體已經(jīng)被其他任務(wù)占用:首先判斷占用該互斥體的任務(wù)的優(yōu)先級是不是比當前任務(wù)的優(yōu)先級低,如果是的話(huà)就要做提升占用該互斥體任務(wù)優(yōu)先級的操作,這也就是互斥體的主要用途——更新就緒任務(wù)表,更新該任務(wù)TCB,更新任務(wù)優(yōu)先級標識表OSTCBPrioTbl。剩下的處理與信號量的OSSemPend的處理完全一致:更 新當前任務(wù)的TCB,然后用OS_EventTaskWait掛起任務(wù),然后重新調度。這時(shí),該函數將可能被掛起,直到當前任務(wù)獲得該互斥體從而恢復執 行。然后該函數判斷當前任務(wù)繼續執行的原因,如果是超時(shí)的話(huà),調用OS_EventTO,如果是得到該互斥體而返回的話(huà),更新當前TCB,然后返回。
3.2.4 OSMutexPost:釋放一個(gè)互斥體,注意,只要占用該互斥體的任務(wù)能夠釋放該互斥體!首先檢查當前任務(wù)是否占用該互斥體,如果不是的話(huà)直接返回錯誤;然后判斷當前的任務(wù)優(yōu)先級是否被提升過(guò),如果是的話(huà),就做恢復當前任務(wù)的優(yōu)先級——更新就緒任務(wù)表,更新當前任務(wù)TCB,更新任務(wù)優(yōu)先級標識表OSTCBPrioTbl;接下來(lái),通過(guò)等待任務(wù)表判斷是否有任務(wù)在等待該互斥體,如果有的話(huà)通過(guò)OS_EventTaskRdy其中優(yōu)先級最高的任務(wù),然后將該互斥體標識為這個(gè)優(yōu)先級最高的任務(wù)所占用, 如果沒(méi)有任務(wù)在等待該互斥體,就重置它。
4. 郵箱的實(shí)現
郵箱(mail box)主要用來(lái)從一個(gè)任務(wù)向另外一個(gè)任務(wù)發(fā)送一個(gè)消息,其實(shí)就是一個(gè)指針,因此,與信號量和互斥提稍有不同,信號量和互斥體用來(lái)同步對資源的訪(fǎng)問(wèn),而這 個(gè)資源在信號量和互斥體中是沒(méi)有體現的,換句話(huà)說(shuō),從信號量和互斥體的ECB中不能看出是在同步哪些資源,而郵箱的話(huà),這個(gè)資源(也就是消息)被放在 ECB中!總的說(shuō)來(lái),郵箱的實(shí)現相對來(lái)說(shuō)很簡(jiǎn)單!
4.1 數據機構的設計:
郵箱也只用到ECB,和信號量以及互斥體不同的是,郵箱沒(méi)有用到OSEventCnt,而是使用OSEventPtr來(lái)存放消息(指針)。其他的和信號量于互斥體相同。
4.2 核心函數也是四個(gè),與信號量和互斥體一樣:
4.2.1 OSMboxCreate:創(chuàng )建一個(gè)郵箱:實(shí)現很簡(jiǎn)單,首先申請一個(gè)ECB,然后初始化這個(gè)ECB,其中用OS_EventWaitListInit初始化等待任務(wù)表。
4.2.2 OSMboxDel:刪除一個(gè)郵箱:與信號量中OSSemDel完全相同。
4.2.3 OSMboxPend:等待一個(gè)郵箱消息:首先檢查該郵箱中是否有消息,如果有的話(huà)取出消息,然后返回; 如果郵箱中沒(méi)有消息,那么更新當前任務(wù)TCB,并用OS_EventTaskWait掛起當前任務(wù),然后重新調度:OS_Sched! 這個(gè)時(shí)候當前任務(wù)將會(huì )被掛起,直到等待的消息來(lái)臨或者超時(shí)才得意恢復執行,之后,它檢查郵箱中是否有消息,如果有的話(huà),取走消息,正常返回;如果郵箱中仍 然沒(méi)有消息,那么當前任務(wù)恢復執行是因為超時(shí),于是返回超時(shí)錯誤!
關(guān)鍵詞:
ucOS-I通訊機
相關(guān)推薦
-
-
-
-
-
jameszxj | 2003-09-06
-
wsser | 2004-07-25
-
唐朝 | 2003-07-11
-
-
Gao | 2003-02-17
-
-
技創(chuàng )快刀 | 2004-04-29
-
-
-
技術(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ē)電子
- 轉換器
- 電源管理
- 信號放大器
評論