任務間的同步_第1頁
任務間的同步_第2頁
任務間的同步_第3頁
任務間的同步_第4頁
任務間的同步_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、任務間的同步任務同步是指一個任務需要等待另一個任務或中斷服務程序發(fā)送相應的同步信號后才能繼 續(xù)執(zhí)行。在CooCox CoOS中,提供了信號量、互斥區(qū)域和事件標志來實現(xiàn)任務間的同步。信號量信號量為系統(tǒng)處理臨界區(qū)和實現(xiàn)任務間同步的問題提供了一種有效的機制。信號量的行為可以用經(jīng)典的PV操作來描述:P Operation: while( s= = 0); s-;V Operation: s+ + ;在CooCox CoOS中,用戶可以調用CoCreateSem()來創(chuàng)建一個信號量,成功創(chuàng)建一個 信號量之后,用戶就可通過調用CoPendSem()、CoAcceptSem()來獲得一個信號量,兩者不 同的

2、是,對于CoPendSem(),如果當前沒有信號量空閑,則將超時等待到該信號量被釋放, 而對于CoAcceptSem()則立刻返回錯誤。用戶也可以在任務體內調用CoPostSem()或者中斷 服務程序內調用isr_PostSem()來釋放一個信號量,以實現(xiàn)彼此同步。程序1信號量創(chuàng)建ID0 = CoCreateSem(0,1,EVENT_SORT_TYPE_FIFO); / initCnt=0,maxCnt=1,FIFO ID1 = CoCreateSem(2,5,EVENT_SORT_TYPE_PRIO); / initCnt=2,maxCnt=5,PRIO程序2信號量的使用void myTa

3、skA(void* pdata)semID = CoCreateSem(0,1,EVENT_SORT_TYPE_FIFO);CoPendSem(semID,0);void myTaskB(void* pdata) CoPostSem(semID);void myISR(void)CoEnterISR ();isr_PostSem(semID);CoExitlSR ();互斥區(qū)域在CooCox CoOS中,互斥區(qū)域解決了互相排斥的問題?;コ鈪^(qū)域禁止多個任務同時進 入受保護的代碼臨界區(qū)(critical section)。因此,在任意時刻,只能有一個任務進入這樣 的代碼保護區(qū)。在CooCox Co

4、OS中,互斥區(qū)域還考慮了優(yōu)先級反轉問題,并通過優(yōu)先級繼承的方法解決 了有可能出現(xiàn)優(yōu)先級反轉的問題。優(yōu)先級反轉是指高優(yōu)先級任務等待低優(yōu)先級任務釋放資源,而低優(yōu)先級任務又正在等待中等 優(yōu)先級任務的現(xiàn)象。目前兩種經(jīng)典的防止反轉的方法:1)優(yōu)先級繼承策略:當前占有臨界資源的任務繼承所有申請該臨界資源任務的最高優(yōu)先級 作為其優(yōu)先級,當其退出臨界區(qū)時,恢復至初始優(yōu)先級。2)優(yōu)先級天花板策略:將申請(占有)某資源的任務的優(yōu)先級提升至可能訪問該資源的所有 任務中優(yōu)先級最高的任務的優(yōu)先級。(這個優(yōu)先級稱為該資源的優(yōu)先級天花板)優(yōu)先級繼承策略對任務執(zhí)行流程的影響相對較小,因為只有當高優(yōu)先級任務申請已被低優(yōu)先 級任

5、務占有的臨界資源這一事實發(fā)生時,才抬升低優(yōu)先級任務的優(yōu)先級。而天花板策略是誰占有 就直接升到最高。CooCox CoOS通過優(yōu)先級繼承的方法來防止優(yōu)先級的反轉。下圖描述了三個任務在CooCox CoOS中有互斥區(qū)域時的任務調度,TaskA擁有最高優(yōu)先 級,TaskC擁有最低優(yōu)先級,藍框表示互斥區(qū)域。TaskA preempts TaskBTaskA trys to enter mutex sertionPRI of TaskC raises to TaskA 5TaskC leaves mutex sedjontTflkfc resumesj IFigure 5.1.1 Task schedu

6、lingTaskB(M)用戶在CooCox CoOS中,可以調用CoCreateMutex()來創(chuàng)建一個互斥區(qū)域,調用 CoEnterMutexSection()和CoLeaveMutexSection()進入和離開互斥區(qū)域,以實現(xiàn)對臨界區(qū) 代碼的保護。程序3互斥區(qū)域的使用void myTaskA(void* pdata) mutexID = CoCreateMutex ();CoEnterMutexSection(mutexID ); / enter the mutex section/ critical codesCoLeaveMutexSection(mutexID ); / leave

7、 the mutex sectionmyTaskB(void* pdata) voidCoEnterMutexSection(mutexID ); / enter the mutex section / critical codes CoLeaveMutexSection(mutexID ); / leave the mutex section事件標志當某一任務要與多個事件同步時,需要使用事件標志。若該任務僅與任一個事件同步,稱為 獨立型同步(邏輯或關系);若與多個事件都發(fā)生同步,則稱之為關聯(lián)型同步(邏輯與關系)。在CooCox CoOS中,最多支持32個事件標志同時存在。CooCox CoO

8、S支持多個任務 等待單個事件或多個事件的發(fā)生。在CooCox CoOS中,當?shù)却蝿账却氖录酥咎幱谖?就緒狀態(tài)時,這些任務處于不可調度狀態(tài)。但一旦等待對象變成就緒狀態(tài),任務將很快恢復運行。一個任務成功等待到事件標志后,根據(jù)事件標志的類型不同,會有不同的成功等待副作用。 在CooCox CoOS中,事件標志有兩種類型,人工重置和自動重置。當一個任務成功等待到自 動重置事件標志,系統(tǒng)會自動將該事件標志變?yōu)槲淳途w狀態(tài);而對于人工重置事件標志,則無副 作用。故當人工重置事件就緒后,等待該事件的所有任務均可變?yōu)榫途w狀態(tài),直到用戶調用 CoClearFlag()將事件標志設置為非就緒態(tài)。當一個自動重

9、置事件得到通知,等待該事件標志的 任務只有一個變成可調度狀態(tài)。而且因為事件標志的等待列表按照FIFO的原則排列,因此對于 自動重置事件而言,只有等待列表的第一個任務變?yōu)榫途w狀態(tài),其它等待該事件標志的任務仍處 于等待狀態(tài)。如任務A/B/C同時等待事件標志I,若該事件標志為人工重置事件,那么當事件標志I就 緒時,同時會通知所有的等待任務,即將任務A/B/C均從等待狀態(tài)變?yōu)榫途w態(tài),且插入就緒鏈 表。若等待的事件標志1為自動重置事件,且任務A/B/C按先后順序排列于等待鏈表,則當事 件標志I就緒時,等待其通知任務A后,就變?yōu)槲淳途w狀態(tài),所以任務B/C仍在等待鏈表中, 等待下一次的事件標志I就緒。在Co

10、oCox CoOS中,用戶可以調用CoCreateFlag()來創(chuàng)建一個事件標志,創(chuàng)建完事件 標志,用戶可以通過 CoWaitForSingleFlag()、CoWaitForMultipleFlags()來等待單個或多 個事件標志。程序4等待單個事件標志 void myTaskA(void* pdata)flagID = CoCreateFlag(0,0); / Reset manually, the original state is not-readyCoWaitForSingleFlag(flagID,0);void myTaskB(void* pdata) CoSetFlag(fla

11、gID);程序5等待多個事件標志 void myTaskA(void* pdata) U32 flag;StatusType err;flagID1 = CoCreateFlag(0,0);flagID2 = CoCreateFlag(0,0);flagID3 = CoCreateFlag(0,0);/ Reset manually, the original/ Reset manually, the original/ Reset manually, the originalstatestatestateis not-readyis not-readyis not-readyflag = f

12、lagID1 | flagID2 | flagID3;CoWaitForMultipleFlags(flag,OPT_WAIT_ANY,0,&err);void myTaskB(void* pdata) CoSetFlag(flaglDl);void myISR(void)CoEnterISR();isr_SetFlag(flagID2);CoExitISR();任務間的通信任務間或任務與中斷服務程序間有時需要進行信息的傳遞,這種信息傳遞即為任務間的通 信。任務間的通信有兩種途徑:通過全局變量來實現(xiàn)或發(fā)消息給另一個任務。用全局變量時,必須保證每個任務或中斷服務程序獨享該變量。在中斷服務中保證獨

13、享的唯 一辦法是關中斷。如果兩個任務共享某變量,各任務要獨享該變量可以先關中斷再開中斷或使用 信號量(見5.1節(jié))。請注意,任務只能通過全局變量與中斷服務程序通信,而且任務并不知道 全局變量什么時候被中斷服務程序修改了(除非中斷程序以信號量方式向任務發(fā)信號或者是該任 務以查詢方式不斷周期性地查詢變量的值)。在這種情況下,CooCox CoOS提供了郵箱和消 息隊列來避免以上問題。郵箱系統(tǒng)或用戶代碼可以通過內核服務來給任務發(fā)送消息。典型的消息郵箱也稱作交換消息,是 指一個任務或一個中斷服務程序利用一個指針型變量,通過內核服務來把一則消息(即一個指針) 放入郵箱。同樣,一個或多個任務可以通過內核服

14、務來接收這則消息。發(fā)送消息的任務和接收消 息的任務約定,該指針指向的內容就是那則消息。MAILBOXFigure 5.2.1 MailboxCooCox CoOS的郵箱就是一個典型的消息郵箱。在CooCox CoOS中,郵箱由兩部分組 成:一個是郵箱的信息,用一個void指針來表示;另一個是由等待該郵箱的任務組成的等待鏈 表。郵箱的等待鏈表支持兩種排序方式,F(xiàn)IFO和優(yōu)先級搶占,具體選擇哪一種方式,由用戶在 創(chuàng)建郵箱的時候決定。在CooCox CoOS中,用戶可以調用CoCreateMbox()來創(chuàng)建一個郵箱,成功創(chuàng)建一個郵 箱后,郵箱內并無消息存在,用戶可在任務體或中斷服務程序中調用CoPo

15、stMail()或 isr_PostMail()向郵箱發(fā)送一則消息,也可以通過CoPendMail()或CoAcceptMail()從郵箱 中獲得一則消息。程序6郵箱的使用void myTaskA(void* pdata)void* pmail;StatusType err;mboxID = CoCreateMbox(EVENT_SORT_TYPE_PRIO); /Sort by preemptivepriority pmail = CoPendMail(mboxID,0,&err);void myTaskB(void* pdata) CoPostMail(mboxID,hello,world

16、);void mylSR(void)CoEnterlSR ();isr_PostMail(mboxID,hello,CooCox);CoExitlSR ();消息隊列消息隊列實際上就是郵箱陣列,用于給任務發(fā)送消息。通過內核提供的服務,任務或中斷服 務子程序可以將多個消息(該消息的指針)放入消息隊列。同樣,一個或多個任務可以通過內核服 務從消息隊列中取出消息。發(fā)送和接收消息的任務約定,傳遞的消息實際上就是指針所指向的內 容。消息隊列不同于郵箱的一點是,郵箱只能存放一個消息,而消息隊列則可存放多個消息。在 CooCox CoOS里,一個隊列可容納的消息個數(shù)是在創(chuàng)建該隊列時決定的。在CooCox C

17、oOS中,消息隊列由兩部分組成:一個是指示該消息隊列的結構體;另一個 是由等待該消息隊列的任務組成的等待任務表。消息隊列的等待鏈表支持兩種排序方式,F(xiàn)IFO 和優(yōu)先級搶占,具體選擇哪一種方式,由用戶在創(chuàng)建消息隊列的時候決定。.在CooCox CoOS中,用戶可以調用CoCreateQueue()來創(chuàng)建一個消息隊列,成功創(chuàng)建 消息隊列后,消息隊列內并無消息存在,用戶可在任務體或中斷服務程序中調用 CoPostQueueMail()或isr_PostQueueMaill()向消息隊列發(fā)送一則消息。亦可以通過 CoPendQueueMail()或 CoAcceptQueueMail()從消息隊列中獲得一則消息。程序7消息隊列的使用 void myTaskA(void* pdata)void* pmail;Void* queue5;StatusType err;queueID = C

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論