




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、任務(wù)間的同步任務(wù)同步是指一個(gè)任務(wù)需要等待另一個(gè)任務(wù)或中斷服務(wù)程序發(fā)送相應(yīng)的同步信號(hào)后才能繼 續(xù)執(zhí)行。在CooCox CoOS中,提供了信號(hào)量、互斥區(qū)域和事件標(biāo)志來(lái)實(shí)現(xiàn)任務(wù)間的同步。信號(hào)量信號(hào)量為系統(tǒng)處理臨界區(qū)和實(shí)現(xiàn)任務(wù)間同步的問(wèn)題提供了一種有效的機(jī)制。信號(hào)量的行為可以用經(jīng)典的PV操作來(lái)描述:P Operation: while( s= = 0); s-;V Operation: s+ + ;在CooCox CoOS中,用戶可以調(diào)用CoCreateSem()來(lái)創(chuàng)建一個(gè)信號(hào)量,成功創(chuàng)建一個(gè) 信號(hào)量之后,用戶就可通過(guò)調(diào)用CoPendSem()、CoAcceptSem()來(lái)獲得一個(gè)信號(hào)量,兩者不 同的
2、是,對(duì)于CoPendSem(),如果當(dāng)前沒(méi)有信號(hào)量空閑,則將超時(shí)等待到該信號(hào)量被釋放, 而對(duì)于CoAcceptSem()則立刻返回錯(cuò)誤。用戶也可以在任務(wù)體內(nèi)調(diào)用CoPostSem()或者中斷 服務(wù)程序內(nèi)調(diào)用isr_PostSem()來(lái)釋放一個(gè)信號(hào)量,以實(shí)現(xiàn)彼此同步。程序1信號(hào)量創(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信號(hào)量的使用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ū)域解決了互相排斥的問(wèn)題?;コ鈪^(qū)域禁止多個(gè)任務(wù)同時(shí)進(jìn) 入受保護(hù)的代碼臨界區(qū)(critical section)。因此,在任意時(shí)刻,只能有一個(gè)任務(wù)進(jìn)入這樣 的代碼保護(hù)區(qū)。在CooCox Co
4、OS中,互斥區(qū)域還考慮了優(yōu)先級(jí)反轉(zhuǎn)問(wèn)題,并通過(guò)優(yōu)先級(jí)繼承的方法解決 了有可能出現(xiàn)優(yōu)先級(jí)反轉(zhuǎn)的問(wèn)題。優(yōu)先級(jí)反轉(zhuǎn)是指高優(yōu)先級(jí)任務(wù)等待低優(yōu)先級(jí)任務(wù)釋放資源,而低優(yōu)先級(jí)任務(wù)又正在等待中等 優(yōu)先級(jí)任務(wù)的現(xiàn)象。目前兩種經(jīng)典的防止反轉(zhuǎn)的方法:1)優(yōu)先級(jí)繼承策略:當(dāng)前占有臨界資源的任務(wù)繼承所有申請(qǐng)?jiān)撆R界資源任務(wù)的最高優(yōu)先級(jí) 作為其優(yōu)先級(jí),當(dāng)其退出臨界區(qū)時(shí),恢復(fù)至初始優(yōu)先級(jí)。2)優(yōu)先級(jí)天花板策略:將申請(qǐng)(占有)某資源的任務(wù)的優(yōu)先級(jí)提升至可能訪問(wèn)該資源的所有 任務(wù)中優(yōu)先級(jí)最高的任務(wù)的優(yōu)先級(jí)。(這個(gè)優(yōu)先級(jí)稱(chēng)為該資源的優(yōu)先級(jí)天花板)優(yōu)先級(jí)繼承策略對(duì)任務(wù)執(zhí)行流程的影響相對(duì)較小,因?yàn)橹挥挟?dāng)高優(yōu)先級(jí)任務(wù)申請(qǐng)已被低優(yōu)先 級(jí)任
5、務(wù)占有的臨界資源這一事實(shí)發(fā)生時(shí),才抬升低優(yōu)先級(jí)任務(wù)的優(yōu)先級(jí)。而天花板策略是誰(shuí)占有 就直接升到最高。CooCox CoOS通過(guò)優(yōu)先級(jí)繼承的方法來(lái)防止優(yōu)先級(jí)的反轉(zhuǎn)。下圖描述了三個(gè)任務(wù)在CooCox CoOS中有互斥區(qū)域時(shí)的任務(wù)調(diào)度,TaskA擁有最高優(yōu)先 級(jí),TaskC擁有最低優(yōu)先級(jí),藍(lán)框表示互斥區(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中,可以調(diào)用CoCreateMutex()來(lái)創(chuàng)建一個(gè)互斥區(qū)域,調(diào)用 CoEnterMutexSection()和CoLeaveMutexSection()進(jìn)入和離開(kāi)互斥區(qū)域,以實(shí)現(xiàn)對(duì)臨界區(qū) 代碼的保護(hù)。程序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事件標(biāo)志當(dāng)某一任務(wù)要與多個(gè)事件同步時(shí),需要使用事件標(biāo)志。若該任務(wù)僅與任一個(gè)事件同步,稱(chēng)為 獨(dú)立型同步(邏輯或關(guān)系);若與多個(gè)事件都發(fā)生同步,則稱(chēng)之為關(guān)聯(lián)型同步(邏輯與關(guān)系)。在CooCox CoOS中,最多支持32個(gè)事件標(biāo)志同時(shí)存在。CooCox CoO
8、S支持多個(gè)任務(wù) 等待單個(gè)事件或多個(gè)事件的發(fā)生。在CooCox CoOS中,當(dāng)?shù)却蝿?wù)所等待的事件標(biāo)志處于未 就緒狀態(tài)時(shí),這些任務(wù)處于不可調(diào)度狀態(tài)。但一旦等待對(duì)象變成就緒狀態(tài),任務(wù)將很快恢復(fù)運(yùn)行。一個(gè)任務(wù)成功等待到事件標(biāo)志后,根據(jù)事件標(biāo)志的類(lèi)型不同,會(huì)有不同的成功等待副作用。 在CooCox CoOS中,事件標(biāo)志有兩種類(lèi)型,人工重置和自動(dòng)重置。當(dāng)一個(gè)任務(wù)成功等待到自 動(dòng)重置事件標(biāo)志,系統(tǒng)會(huì)自動(dòng)將該事件標(biāo)志變?yōu)槲淳途w狀態(tài);而對(duì)于人工重置事件標(biāo)志,則無(wú)副 作用。故當(dāng)人工重置事件就緒后,等待該事件的所有任務(wù)均可變?yōu)榫途w狀態(tài),直到用戶調(diào)用 CoClearFlag()將事件標(biāo)志設(shè)置為非就緒態(tài)。當(dāng)一個(gè)自動(dòng)重
9、置事件得到通知,等待該事件標(biāo)志的 任務(wù)只有一個(gè)變成可調(diào)度狀態(tài)。而且因?yàn)槭录?biāo)志的等待列表按照FIFO的原則排列,因此對(duì)于 自動(dòng)重置事件而言,只有等待列表的第一個(gè)任務(wù)變?yōu)榫途w狀態(tài),其它等待該事件標(biāo)志的任務(wù)仍處 于等待狀態(tài)。如任務(wù)A/B/C同時(shí)等待事件標(biāo)志I,若該事件標(biāo)志為人工重置事件,那么當(dāng)事件標(biāo)志I就 緒時(shí),同時(shí)會(huì)通知所有的等待任務(wù),即將任務(wù)A/B/C均從等待狀態(tài)變?yōu)榫途w態(tài),且插入就緒鏈 表。若等待的事件標(biāo)志1為自動(dòng)重置事件,且任務(wù)A/B/C按先后順序排列于等待鏈表,則當(dāng)事 件標(biāo)志I就緒時(shí),等待其通知任務(wù)A后,就變?yōu)槲淳途w狀態(tài),所以任務(wù)B/C仍在等待鏈表中, 等待下一次的事件標(biāo)志I就緒。在Co
10、oCox CoOS中,用戶可以調(diào)用CoCreateFlag()來(lái)創(chuàng)建一個(gè)事件標(biāo)志,創(chuàng)建完事件 標(biāo)志,用戶可以通過(guò) CoWaitForSingleFlag()、CoWaitForMultipleFlags()來(lái)等待單個(gè)或多 個(gè)事件標(biāo)志。程序4等待單個(gè)事件標(biāo)志 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等待多個(gè)事件標(biāo)志 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();任務(wù)間的通信任務(wù)間或任務(wù)與中斷服務(wù)程序間有時(shí)需要進(jìn)行信息的傳遞,這種信息傳遞即為任務(wù)間的通 信。任務(wù)間的通信有兩種途徑:通過(guò)全局變量來(lái)實(shí)現(xiàn)或發(fā)消息給另一個(gè)任務(wù)。用全局變量時(shí),必須保證每個(gè)任務(wù)或中斷服務(wù)程序獨(dú)享該變量。在中斷服務(wù)中保證獨(dú)
13、享的唯 一辦法是關(guān)中斷。如果兩個(gè)任務(wù)共享某變量,各任務(wù)要獨(dú)享該變量可以先關(guān)中斷再開(kāi)中斷或使用 信號(hào)量(見(jiàn)5.1節(jié))。請(qǐng)注意,任務(wù)只能通過(guò)全局變量與中斷服務(wù)程序通信,而且任務(wù)并不知道 全局變量什么時(shí)候被中斷服務(wù)程序修改了(除非中斷程序以信號(hào)量方式向任務(wù)發(fā)信號(hào)或者是該任 務(wù)以查詢方式不斷周期性地查詢變量的值)。在這種情況下,CooCox CoOS提供了郵箱和消 息隊(duì)列來(lái)避免以上問(wèn)題。郵箱系統(tǒng)或用戶代碼可以通過(guò)內(nèi)核服務(wù)來(lái)給任務(wù)發(fā)送消息。典型的消息郵箱也稱(chēng)作交換消息,是 指一個(gè)任務(wù)或一個(gè)中斷服務(wù)程序利用一個(gè)指針型變量,通過(guò)內(nèi)核服務(wù)來(lái)把一則消息(即一個(gè)指針) 放入郵箱。同樣,一個(gè)或多個(gè)任務(wù)可以通過(guò)內(nèi)核服
14、務(wù)來(lái)接收這則消息。發(fā)送消息的任務(wù)和接收消 息的任務(wù)約定,該指針指向的內(nèi)容就是那則消息。MAILBOXFigure 5.2.1 MailboxCooCox CoOS的郵箱就是一個(gè)典型的消息郵箱。在CooCox CoOS中,郵箱由兩部分組 成:一個(gè)是郵箱的信息,用一個(gè)void指針來(lái)表示;另一個(gè)是由等待該郵箱的任務(wù)組成的等待鏈 表。郵箱的等待鏈表支持兩種排序方式,F(xiàn)IFO和優(yōu)先級(jí)搶占,具體選擇哪一種方式,由用戶在 創(chuàng)建郵箱的時(shí)候決定。在CooCox CoOS中,用戶可以調(diào)用CoCreateMbox()來(lái)創(chuàng)建一個(gè)郵箱,成功創(chuàng)建一個(gè)郵 箱后,郵箱內(nèi)并無(wú)消息存在,用戶可在任務(wù)體或中斷服務(wù)程序中調(diào)用CoPo
15、stMail()或 isr_PostMail()向郵箱發(fā)送一則消息,也可以通過(guò)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 ();消息隊(duì)列消息隊(duì)列實(shí)際上就是郵箱陣列,用于給任務(wù)發(fā)送消息。通過(guò)內(nèi)核提供的服務(wù),任務(wù)或中斷服 務(wù)子程序可以將多個(gè)消息(該消息的指針)放入消息隊(duì)列。同樣,一個(gè)或多個(gè)任務(wù)可以通過(guò)內(nèi)核服 務(wù)從消息隊(duì)列中取出消息。發(fā)送和接收消息的任務(wù)約定,傳遞的消息實(shí)際上就是指針?biāo)赶虻膬?nèi) 容。消息隊(duì)列不同于郵箱的一點(diǎn)是,郵箱只能存放一個(gè)消息,而消息隊(duì)列則可存放多個(gè)消息。在 CooCox CoOS里,一個(gè)隊(duì)列可容納的消息個(gè)數(shù)是在創(chuàng)建該隊(duì)列時(shí)決定的。在CooCox C
17、oOS中,消息隊(duì)列由兩部分組成:一個(gè)是指示該消息隊(duì)列的結(jié)構(gòu)體;另一個(gè) 是由等待該消息隊(duì)列的任務(wù)組成的等待任務(wù)表。消息隊(duì)列的等待鏈表支持兩種排序方式,F(xiàn)IFO 和優(yōu)先級(jí)搶占,具體選擇哪一種方式,由用戶在創(chuàng)建消息隊(duì)列的時(shí)候決定。.在CooCox CoOS中,用戶可以調(diào)用CoCreateQueue()來(lái)創(chuàng)建一個(gè)消息隊(duì)列,成功創(chuàng)建 消息隊(duì)列后,消息隊(duì)列內(nèi)并無(wú)消息存在,用戶可在任務(wù)體或中斷服務(wù)程序中調(diào)用 CoPostQueueMail()或isr_PostQueueMaill()向消息隊(duì)列發(fā)送一則消息。亦可以通過(guò) CoPendQueueMail()或 CoAcceptQueueMail()從消息隊(duì)列中獲得一則消息。程序7消息隊(duì)列的使用 void myTaskA(void* pdata)void* pmail;Void* queue5;StatusType err;queueID = C
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 購(gòu)買(mǎi)路燈合同協(xié)議
- 房產(chǎn)合同協(xié)議套路
- 菜市門(mén)面轉(zhuǎn)讓合同協(xié)議書(shū)
- 組織服務(wù)合同協(xié)議
- 贈(zèng)與合同終止協(xié)議
- 三方協(xié)議是多久的合同
- 營(yíng)口合同協(xié)議翻譯成英文
- 戀愛(ài)管家合同協(xié)議
- 房屋室內(nèi)拆除合同協(xié)議書(shū)
- 合同代理收費(fèi)協(xié)議
- 中國(guó)資源循環(huán)集團(tuán)有限公司招聘筆試真題2024
- (高清版)TDT 1013-2013 土地整治項(xiàng)目驗(yàn)收規(guī)程
- 大念住經(jīng) 排版用于打印
- 第三講 應(yīng)用語(yǔ)言學(xué)的理論
- 計(jì)量器具校準(zhǔn)記錄
- 煤炭地下氣化原理課件
- 公司企業(yè)工匠申報(bào)表
- 三字經(jīng)全文(帶拼音及誦讀指導(dǎo))精編版課件
- 井控培訓(xùn)知識(shí)課件
- 雙減背景下小學(xué)語(yǔ)文作業(yè)的有效設(shè)計(jì)課件
- 十二講船舶制冷裝置課件
評(píng)論
0/150
提交評(píng)論