第10講-嵌入式OS內(nèi)核-任務(wù)通信與同步_第1頁
第10講-嵌入式OS內(nèi)核-任務(wù)通信與同步_第2頁
第10講-嵌入式OS內(nèi)核-任務(wù)通信與同步_第3頁
第10講-嵌入式OS內(nèi)核-任務(wù)通信與同步_第4頁
第10講-嵌入式OS內(nèi)核-任務(wù)通信與同步_第5頁
已閱讀5頁,還剩69頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

第10講

任務(wù)通信與同步主要內(nèi)容概述信號(hào)燈消息隊(duì)列事件管道概述多任務(wù)系統(tǒng)中任務(wù)之間的關(guān)系相互獨(dú)立僅競爭CPU資源競爭除CPU外的其他資源(互斥)同步協(xié)調(diào)彼此運(yùn)行的步調(diào),保證協(xié)同運(yùn)行的各個(gè)任務(wù)具有正確的執(zhí)行次序通信彼此間傳遞數(shù)據(jù)或信息,以協(xié)同完成某項(xiàng)工作進(jìn)程同步的例子只有當(dāng)售票員關(guān)門之后司機(jī)才能啟動(dòng)車輛,只有司機(jī)停車之后售票員才能開車門。司機(jī)和售票員的行動(dòng)需要一定的協(xié)調(diào)。同樣地,兩個(gè)進(jìn)程之間有時(shí)也有這樣的依賴關(guān)系,因此我們也要有一定的同步機(jī)制保證它們的執(zhí)行次序任務(wù)能以以下方式與中斷處理程序或其他任務(wù)進(jìn)行同步或通信:單向同步或通信:一個(gè)任務(wù)與另一個(gè)任務(wù)或一個(gè)ISR同步或通信。雙向同步或通信:兩個(gè)任務(wù)相互同步或通信。雙向同步不能在任務(wù)與ISR之間進(jìn)行,因?yàn)镮SR不能等待。概述ISRxTaskyPOSTPEND任務(wù)與ISR之間的同步(單向)TaskxTaskyPOSTPENDPOSTPEND任務(wù)與任務(wù)之間的同步(雙向)任務(wù)與任務(wù)之間的同步(單向)TaskxTaskyPOSTPEND在單處理器平臺(tái)上,嵌入式操作系統(tǒng)內(nèi)核提供的同步、互斥與通信機(jī)制主要包括:信號(hào)燈(semaphore),用于互斥與同步事件(組)(eventgroup),用于同步異步信號(hào)(asynchronoussignal),用于同步郵箱(mailbox)、消息隊(duì)列(messagequeue),用于消息通信管道(pipe),提供非結(jié)構(gòu)化數(shù)據(jù)交換和實(shí)現(xiàn)同步概述以下一些機(jī)制也可用于同步與通信(在單處理器或多處理器系統(tǒng)中):全局變量共享內(nèi)存套接字(Sockets)遠(yuǎn)程過程調(diào)用(RemoteProcedureCall)概述Linux下任務(wù)通信手段信號(hào)消息隊(duì)列管道信號(hào)燈套接字共享存儲(chǔ)段第一節(jié)

信號(hào)燈信號(hào)燈的種類及用途互斥信號(hào)燈二值信號(hào)燈計(jì)數(shù)信號(hào)燈信號(hào)燈機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)典型的信號(hào)燈操作信號(hào)燈(Semaphore或稱信號(hào)量)用于實(shí)現(xiàn)任務(wù)與任務(wù)之間、任務(wù)與中斷處理程序之間的同步與互斥。信號(hào)燈一般分為三種:信號(hào)燈的種類及用途用于解決互斥問題。它比較特殊,可能會(huì)引起優(yōu)先級(jí)反轉(zhuǎn)問題。用于解決同步問題用于解決資源計(jì)數(shù)問題互斥信號(hào)燈計(jì)數(shù)信號(hào)燈二值信號(hào)燈用互斥信號(hào)燈保護(hù)的代碼區(qū)稱作“臨界區(qū)”,臨界區(qū)代碼通常用于對(duì)共享資源的訪問。互斥信號(hào)燈的值被初始化成1,表明目前沒有任務(wù)進(jìn)入“臨界區(qū)”,但最多只有一個(gè)任務(wù)可以進(jìn)入“臨界區(qū)”。第一個(gè)試圖進(jìn)入“臨界區(qū)”的任務(wù)將成功獲得互斥信號(hào)燈,而隨后試圖進(jìn)入用同一信號(hào)燈保護(hù)的臨界區(qū)的所有其他任務(wù)就必須等待。當(dāng)任務(wù)離開“臨界區(qū)”時(shí),它將釋放信號(hào)燈并允許正在等待該信號(hào)燈的任務(wù)進(jìn)入“臨界區(qū)”。互斥信號(hào)燈Task1Task2共享資源互斥信號(hào)燈共享資源可能是一段存儲(chǔ)器空間、一個(gè)數(shù)據(jù)結(jié)構(gòu)或I/O設(shè)備,也可能是被兩個(gè)或多個(gè)并發(fā)任務(wù)共享的任何內(nèi)容。使用互斥信號(hào)燈可以實(shí)現(xiàn)對(duì)共享資源的串行訪問,保證只有成功地獲取互斥信號(hào)燈的任務(wù)才能夠釋放它?;コ庑盘?hào)燈是一種特殊的二值信號(hào)燈,一般它支持所有權(quán)、遞歸訪問、任務(wù)刪除安全和一些避免優(yōu)先級(jí)反轉(zhuǎn)、饑餓、死鎖等互斥所固有問題的協(xié)議?;コ庑盘?hào)燈狀態(tài)圖互斥信號(hào)燈狀態(tài)圖開啟鎖定初始化值為1申請(qǐng)并獲得值為0釋放值為1申請(qǐng)(遞歸)并獲得鎖定數(shù)加1釋放(遞歸)鎖定數(shù)減1互斥信號(hào)燈所有權(quán):當(dāng)一個(gè)任務(wù)通過獲取互斥信號(hào)燈而將其鎖定時(shí),得到該互斥信號(hào)燈的所有權(quán)。相反,當(dāng)一個(gè)任務(wù)釋放信號(hào)燈時(shí),失去對(duì)其的所有權(quán)。當(dāng)一個(gè)任務(wù)擁有互斥信號(hào)燈時(shí),其他的任務(wù)不能再鎖定或釋放它,即任務(wù)要釋放互斥信號(hào)燈,必須事前先獲取該信號(hào)燈。二值信號(hào)燈二值信號(hào)燈主要用于任務(wù)與任務(wù)之間、任務(wù)與中斷服務(wù)程序之間的同步用于同步的二值信號(hào)燈初始值為0,表示同步事件尚未產(chǎn)生;任務(wù)申請(qǐng)信號(hào)燈以等待該同步事件的發(fā)生;另一個(gè)任務(wù)或ISR到達(dá)同步點(diǎn)時(shí),釋放信號(hào)燈(將其值設(shè)置為1)表示同步事件已發(fā)生,以喚醒等待的任務(wù)。Task1Task2二值信號(hào)燈初值為0二值信號(hào)燈二值信號(hào)燈狀態(tài)圖可獲得不可獲得申請(qǐng)并獲得(值為0)釋放(值為1)初始化值為0Task1(){……執(zhí)行一些操作;將信號(hào)燈sem1置1;

申請(qǐng)信號(hào)燈sem2;…………}Task2(){……

申請(qǐng)信號(hào)燈sem1;執(zhí)行一些操作;將信號(hào)燈sem2置1;…………}Task2申請(qǐng)信號(hào)燈sem1失敗,系統(tǒng)切換到Task1sem1被置1后,Task2得到sem1并搶占Task1Task2運(yùn)行到某處時(shí)因某種原因被阻塞,系統(tǒng)切換到Task1用二值信號(hào)燈實(shí)現(xiàn)兩個(gè)任務(wù)之間的雙向同步Task2優(yōu)先級(jí)高于Task1sem1和sem2的初始值均為0計(jì)數(shù)信號(hào)燈計(jì)數(shù)信號(hào)燈用于控制系統(tǒng)中共享資源的多個(gè)實(shí)例的使用,允許多個(gè)任務(wù)同時(shí)訪問同一種資源的多個(gè)實(shí)例計(jì)數(shù)信號(hào)燈被初始化為n(非負(fù)整數(shù)),n為該種共享資源的數(shù)目。Task1Task2共享資源實(shí)例nTaskm共享資源實(shí)例1…………計(jì)數(shù)信號(hào)燈計(jì)數(shù)信號(hào)燈狀態(tài)圖可獲得不可獲得初始化值大于0申請(qǐng)并獲得值為0釋放值為1申請(qǐng)并獲得值減1釋放值加1計(jì)數(shù)信號(hào)燈1234…………n生產(chǎn)者任務(wù)消費(fèi)者任務(wù)計(jì)數(shù)信號(hào)燈使用實(shí)例:生產(chǎn)者-消費(fèi)者問題(有界緩沖問題)問題描述:一個(gè)倉庫可以存放n件物品。生產(chǎn)者每生產(chǎn)一件產(chǎn)品,將產(chǎn)品放入倉庫,倉庫滿了就停止生產(chǎn)。消費(fèi)者每次從倉庫中去一件物品,然后進(jìn)行消費(fèi),倉庫空時(shí)就停止消費(fèi)。

生產(chǎn)者任務(wù)do{…產(chǎn)生一個(gè)數(shù)據(jù)項(xiàng)…申請(qǐng)empty申請(qǐng)mutex…將新生成的數(shù)據(jù)項(xiàng)添加到緩沖中…釋放mutex釋放full}while(1);消費(fèi)者任務(wù)do{申請(qǐng)full申請(qǐng)mutex…從緩沖中移出一個(gè)數(shù)據(jù)項(xiàng)的內(nèi)容…釋放mutex釋放empty…消費(fèi)新獲得的數(shù)據(jù)項(xiàng)內(nèi)容…}while(1);計(jì)數(shù)信號(hào)燈full:已被填充的數(shù)據(jù)項(xiàng)數(shù)目,取值范圍0-n,初始值為0計(jì)數(shù)信號(hào)燈empty:空閑數(shù)據(jù)項(xiàng)數(shù)目,取值范圍為0-n,初始值為n;互斥信號(hào)燈mutex:控制生產(chǎn)者任務(wù)和消費(fèi)者任務(wù)對(duì)有界緩沖的訪問,初始值為1。哲學(xué)家就餐問題問題描述:

一個(gè)房間內(nèi)有5個(gè)哲學(xué)家,他們的生活就是思考和進(jìn)食。房間里有一張圓桌,中間放著一盤通心粉(假定通心粉無限多)。桌子周圍放有五把椅子,分別屬于五位哲學(xué)家每兩位哲學(xué)家之間有一把叉子,哲學(xué)家進(jìn)食時(shí)必須同時(shí)使用左右兩把叉子。僅當(dāng)哲學(xué)家的左右兩支筷子都可用時(shí),才允許他拿起筷子進(jìn)餐。利用信號(hào)量的保護(hù)機(jī)制實(shí)現(xiàn)。通過信號(hào)量mutex對(duì)就餐之前的取左側(cè)和右側(cè)叉子的操作進(jìn)行保護(hù),使之成為一個(gè)原子操作,這樣可以防止死鎖的出現(xiàn)。信號(hào)燈機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)SCB1SCB2…………信號(hào)燈控制塊count信號(hào)燈名字或IDTask1Task2……任務(wù)等待列表信號(hào)燈機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)信號(hào)燈控制塊:管理所有創(chuàng)建的信號(hào)燈,內(nèi)核在系統(tǒng)運(yùn)行時(shí)動(dòng)態(tài)分配和回收信號(hào)燈控制塊互斥和二值信號(hào)燈控制塊結(jié)構(gòu):Binary_Semaphore_Control_Blockwait_queue 任務(wù)等待隊(duì)列attributes 信號(hào)燈屬性 lock_nesting_behavior試圖嵌套獲得時(shí)的規(guī)則wait_discipline 任務(wù)等待信號(hào)燈的方式 priority_ceiling 優(yōu)先級(jí)天花板值lock 是否被占有holder 擁有者

nest_count 嵌套層數(shù)計(jì)數(shù)信號(hào)燈控制結(jié)構(gòu)Counting_Semaphore_Control_Block

wait_queue 任務(wù)等待隊(duì)列attributes 計(jì)數(shù)信號(hào)燈屬性

maximum_count 最大計(jì)數(shù)值wait_discipline 任務(wù)等待信號(hào)燈的方式count 當(dāng)前計(jì)數(shù)值信號(hào)燈機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)典型的信號(hào)燈操作創(chuàng)建信號(hào)燈獲?。ㄉ暾?qǐng))信號(hào)燈釋放信號(hào)燈刪除信號(hào)燈清除信號(hào)燈的任務(wù)等待列表獲取有關(guān)信號(hào)燈的各種信息第二節(jié)

消息隊(duì)列通信方式概述消息隊(duì)列機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)典型的消息隊(duì)列操作消息隊(duì)列的其他典型使用任務(wù)間的通信方式直接通信。在通信過程中雙方必須明確地知道(命名)彼此:Send(P,message)–發(fā)送一個(gè)消息到任務(wù)PReceive(Q,message)–從任務(wù)Q接收一個(gè)消息

間接通信。通信雙方不需要指出消息的來源或去向,而通過中間機(jī)制來通信。如:send(A,message)–發(fā)送一個(gè)消息給郵箱Areceive(A,message)–從郵箱A接收一個(gè)消息通信方式概述消息隊(duì)列:屬于間接通信方式消息:內(nèi)存空間中一段長度可變的緩沖區(qū),其長度和內(nèi)容均可以由用戶定義,其內(nèi)容可以是實(shí)際的數(shù)據(jù)、數(shù)據(jù)塊的指針或空。對(duì)消息內(nèi)容的解釋由應(yīng)用完成。從操作系統(tǒng)觀點(diǎn)看,消息沒有定義的格式,所有的消息都是字節(jié)流,沒有特定的含義。從應(yīng)用觀點(diǎn)看,根據(jù)應(yīng)用定義的消息格式,消息被解釋成特定的含義。應(yīng)用可以只把消息當(dāng)成一個(gè)標(biāo)志,這時(shí)消息機(jī)制用于實(shí)現(xiàn)同步概述消息隊(duì)列就是一個(gè)消息的鏈表。每個(gè)消息隊(duì)列都有一個(gè)隊(duì)列頭,用結(jié)構(gòu)structmsg_queue來描述。隊(duì)列頭中包含了該消息隊(duì)列的大量信息,包括消息隊(duì)列鍵值、用戶ID、組ID、消息隊(duì)列中消息數(shù)目等等,甚至記錄了最近對(duì)消息隊(duì)列讀寫進(jìn)程的ID。讀者可以訪問這些信息,也可以設(shè)置其中的某些信息。消息隊(duì)列機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)隊(duì)列控制塊隊(duì)列長度QCB1隊(duì)列名或IDTask3Task4……接收任務(wù)等待列表Task1Task2……發(fā)送任務(wù)等待列表最大消息長度QCB2……消息隊(duì)列及其相關(guān)的參數(shù)和支持?jǐn)?shù)據(jù)結(jié)構(gòu)消息隊(duì)列狀態(tài)圖非空滿隊(duì)列創(chuàng)建消息數(shù)為0消息隊(duì)列狀態(tài)圖消息發(fā)送消息數(shù)加1空消息發(fā)送消息數(shù)為1消息接收消息數(shù)為0消息接收消息數(shù)減1消息接收消息數(shù)減1消息發(fā)送消息數(shù)等于隊(duì)列長度消息隊(duì)列機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)消息隊(duì)列控制塊管理所有創(chuàng)建的消息隊(duì)列,系統(tǒng)運(yùn)行時(shí)動(dòng)態(tài)分配和回收消息隊(duì)列控制塊消息隊(duì)列緩沖區(qū)存放發(fā)送到該隊(duì)列的消息,接收者從緩沖區(qū)中取出消息。消息的發(fā)送或接收有兩種方法(影響消息緩沖區(qū)結(jié)構(gòu)):將數(shù)據(jù)從發(fā)送任務(wù)的空間完全拷貝到接收任務(wù)的空間中(效率較低,執(zhí)行時(shí)間與消息大小有關(guān))只傳遞指向數(shù)據(jù)存儲(chǔ)空間的指針(提高系統(tǒng)性能)number_of_messagemax_message_countnumber_of_messagemax_message_sizewait_disciplinewait_queuequeue_startqueue_inqueue_outqueue_endmessagemessagemessagemessagemessagemessagemessagemessagemessagemax_message_count消息隊(duì)列控制塊消息隊(duì)列緩沖區(qū)消息隊(duì)列機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)消息隊(duì)列的環(huán)形緩沖消息隊(duì)列機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)max_message_countqueue_endqueue_startqueue_outnumber_of_messagequeue_in消息指針Linux中的消息隊(duì)列Linux維護(hù)了一系列消息隊(duì)列的msgque向量表。其中的每一個(gè)單元都指向一個(gè)msqid_ds的數(shù)據(jù)結(jié)構(gòu),完整描述這個(gè)消息隊(duì)列。當(dāng)創(chuàng)建消息隊(duì)列的時(shí)候,從系統(tǒng)內(nèi)存中分配一個(gè)新的msqid_ds的數(shù)據(jù)結(jié)構(gòu)并插入到向量表中。每一個(gè)msqid_ds數(shù)據(jù)結(jié)構(gòu)都包括一個(gè)ipc_perm的數(shù)據(jù)結(jié)構(gòu)和進(jìn)入這個(gè)隊(duì)列的消息的指針。另外,Linux保留隊(duì)列的改動(dòng)時(shí)間,例如上次隊(duì)列寫的時(shí)間等。Msqid_ds隊(duì)列也包括兩個(gè)等待隊(duì)列:一個(gè)用于向消息隊(duì)列寫,另一個(gè)用于讀。每一次一個(gè)進(jìn)程試圖向?qū)戧?duì)列寫消息,它的有效用戶和組的標(biāo)識(shí)符就要和隊(duì)列的ipc_perm數(shù)據(jù)結(jié)構(gòu)的模式比較。如果進(jìn)程可以想這個(gè)隊(duì)列寫,則消息會(huì)從進(jìn)程的地址空間寫到msg數(shù)據(jù)結(jié)構(gòu),放到消息隊(duì)列的最后。每一個(gè)消息都帶有標(biāo)記。因?yàn)長inux限制寫的消息的數(shù)量和長度,可能會(huì)沒有空間容納消息。這時(shí),進(jìn)程會(huì)被放到消息隊(duì)列的寫等待隊(duì)列,然后調(diào)用調(diào)度程序選擇一個(gè)新的進(jìn)程運(yùn)行。當(dāng)一個(gè)或多個(gè)消息從這個(gè)消息隊(duì)列中讀出去的時(shí)候會(huì)被喚醒。從隊(duì)列中讀是一個(gè)相似的過程。進(jìn)程的訪問權(quán)限一樣被檢查。一個(gè)讀進(jìn)程可以選擇是不管消息的類型從隊(duì)列中讀取第一條消息還是選擇特殊類型的消息。如果沒有符合條件的消息,讀進(jìn)程會(huì)被加到消息隊(duì)列的讀等待進(jìn)程,然后運(yùn)行調(diào)度程序。當(dāng)一個(gè)新的消息寫到隊(duì)列的時(shí)候,這個(gè)進(jìn)程會(huì)被喚醒,繼續(xù)運(yùn)行。典型的消息隊(duì)列操作創(chuàng)建消息隊(duì)列發(fā)送普通消息發(fā)送緊急消息發(fā)送廣播消息接收消息刪除消息隊(duì)列獲取有關(guān)消息隊(duì)列的各種信息創(chuàng)建消息隊(duì)列創(chuàng)建消息隊(duì)列時(shí),調(diào)用者可以指定如下參數(shù):消息的最大長度每個(gè)消息隊(duì)列中最多的消息數(shù)消息隊(duì)列的屬性任務(wù)等待消息時(shí)的排隊(duì)方式:FIFO或PRIORITY系統(tǒng)為新創(chuàng)建的消息隊(duì)列分配唯一的ID發(fā)送消息根據(jù)緊急程度的不同,消息通??煞譃槠胀ㄏ⑴c緊急消息。如果有任務(wù)正在等待消息(即消息隊(duì)列為空),則普通消息發(fā)送和緊急消息發(fā)送的執(zhí)行效果是一樣的。任務(wù)從等待隊(duì)列移到就緒隊(duì)列中,消息被拷貝到任務(wù)提供的緩沖區(qū)中(或者由接收任務(wù)得到指向消息的指針)。如果沒有任務(wù)等待,發(fā)送普通消息將消息放在隊(duì)列尾,而發(fā)送緊急消息將消息放在隊(duì)列頭。發(fā)送消息Msg3接收任務(wù)等待列表Msg2Msg1消息隊(duì)列發(fā)送普通消息-先進(jìn)先出(FIFO)次序Msg3接收任務(wù)等待列表Msg2Msg1消息隊(duì)列發(fā)送緊急消息-后進(jìn)先出(LIFO)次序發(fā)送消息如果發(fā)送消息時(shí)隊(duì)列已被填滿,則不同的操作系統(tǒng)可能采取不同的處理辦法:掛起試圖向已滿的消息隊(duì)列中發(fā)送消息的任務(wù)(不適用于中斷服務(wù)程序)簡單地丟棄該條消息并向調(diào)用者返回錯(cuò)誤信息廣播消息。在此之前所有試圖從隊(duì)列中接收消息的任務(wù)此時(shí)都將獲得相同的消息。該功能拷貝消息到各任務(wù)的消息緩沖中(或者讓所有的等待任務(wù)得到指向消息的指針),并喚醒所有的等待任務(wù)。接收消息如果指定的消息隊(duì)列中有消息,則將其中的第一條消息拷貝到調(diào)用者的緩沖區(qū)(或者將第一條消息指針傳遞給調(diào)用者),并從消息隊(duì)列中刪除它。如果此時(shí)消息隊(duì)列中沒有消息,則可能出現(xiàn)以下幾種情況:永遠(yuǎn)等待消息的到達(dá):等待消息的任務(wù)按FIFO或優(yōu)先級(jí)高低順序排列在等待隊(duì)列中等待消息且指定等待時(shí)限:等待消息的任務(wù)按FIFO或優(yōu)先級(jí)高低順序排列在等待隊(duì)列中不等待,強(qiáng)制立即返回接收消息限時(shí)等待可有效預(yù)防死鎖中斷服務(wù)程序接收消息時(shí)必須選擇不等待,因?yàn)橹袛喾?wù)程序是不能被阻塞的。如果消息隊(duì)列被應(yīng)用刪除,則所有等待該消息隊(duì)列的任務(wù)都被返回一個(gè)錯(cuò)誤信息,并回復(fù)到就緒狀態(tài)。接收消息Task4High消息隊(duì)列接收任務(wù)等待列表任務(wù)等待列表-基于優(yōu)先級(jí)的次序Task2mediumTask3mediumTask1LowTask4High消息隊(duì)列接收任務(wù)等待列表任務(wù)等待列表-先進(jìn)先出(FIFO)次序Task2mediumTask3mediumTask1Low刪除消息隊(duì)列從系統(tǒng)中刪除指定的消息隊(duì)列,釋放消息隊(duì)列控制塊及消息隊(duì)列緩沖區(qū)。任何知道此消息隊(duì)列ID號(hào)的代碼都可以刪除它。消息隊(duì)列被刪除后,所有等待從這個(gè)消息隊(duì)列接收消息的任務(wù)都回到就緒態(tài),并得到一個(gè)錯(cuò)誤信息表明消息隊(duì)列已被刪除。消息隊(duì)列的其他典型使用緊耦合的單向數(shù)據(jù)通信:發(fā)送任務(wù)發(fā)送消息后要求一個(gè)響應(yīng)信號(hào),表明接收任務(wù)已經(jīng)成功接收到消息。Task1Task2

消息隊(duì)列的其他典型使用緊耦合的雙向數(shù)據(jù)通信:如果數(shù)據(jù)需要在任務(wù)之間雙向流動(dòng),則可以采用緊耦合的雙向數(shù)據(jù)通信模式(也稱為全雙工通信)。Task1Task2第三節(jié)

事件概述事件機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)典型的事件操作事件機(jī)制的典型應(yīng)用在嵌入式實(shí)時(shí)內(nèi)核中,事件是指一種表明預(yù)先定義的系統(tǒng)事件已經(jīng)發(fā)生的機(jī)制。事件機(jī)制用于任務(wù)與任務(wù)之間、任務(wù)與ISR之間的同步。其主要的特點(diǎn)是可實(shí)現(xiàn)一對(duì)多的同步。

一個(gè)事件就是一個(gè)標(biāo)志,不具備其它信息。一個(gè)或多個(gè)事件構(gòu)成一個(gè)事件集。事件集可以用一個(gè)指定長度的變量(比如一個(gè)8bit,16bit或32bit的無符號(hào)整型變量,不同的操作系統(tǒng)其具體實(shí)現(xiàn)不一樣)來表示,而每個(gè)事件由在事件集變量中的某一位來代表。概述事件及事件集有以下特點(diǎn):事件間相互獨(dú)立事件僅用于同步,不提供數(shù)據(jù)傳輸功能事件無隊(duì)列,即多次發(fā)送同一事件,在未經(jīng)過任何處理的情況下,其效果等同于只發(fā)送一次。提供事件機(jī)制的意義在于:當(dāng)某任務(wù)要與多個(gè)任務(wù)或中斷服務(wù)同步時(shí),就需要使用事件機(jī)制。若任務(wù)需要與一組事件中的任意一個(gè)發(fā)生同步,可稱為獨(dú)立型同步(邏輯“或”關(guān)系)。任務(wù)也可以等待若干事件都發(fā)生時(shí)才同步,稱為關(guān)聯(lián)型同步(邏輯“與”關(guān)系)。概述“或”同步和“與”同步概述任務(wù)任務(wù)任務(wù)任務(wù)ISRISRORAND“與”型同步“或”型同步事件集事件集POSTPOSTPENDPEND用多個(gè)事件的組合發(fā)信號(hào)給多個(gè)任務(wù)概述任務(wù)任務(wù)任務(wù)ISRORAND事件集事件集事件集(8,16或32位)POSTPENDPEND術(shù)語:發(fā)送事件集。指在一次發(fā)送過程中發(fā)往接收者(比如任務(wù))的一個(gè)或多個(gè)事件的組合。待處理事件集。指已被發(fā)送到一個(gè)接收者但還沒有被接收(即正在等待處理)的所有事件的集合。事件條件。指事件接收者在一次接收過程中期待接收的一個(gè)或多個(gè)事件的集合?!盎颉蓖剑捍幚硎录灰ㄊ录l件中的任一事件即可滿足要求;“與”同步:其二是待處理事件集必須包括事件條件中的全部事件方可滿足要求。

概述事件機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)事件集控制塊:管理所有創(chuàng)建的事件集或者事件集附屬于任務(wù),不需創(chuàng)建,其相關(guān)參數(shù)成為任務(wù)控制塊的一部分典型的事件操作創(chuàng)建事件集刪除事件集發(fā)送事件(集)接收事件(集)獲取有關(guān)事件集的各種信息設(shè)置事件②設(shè)置事件②Task1ISR來自某設(shè)備的中斷Task2消息隊(duì)列Q事件標(biāo)志集信號(hào)燈S01000100發(fā)送消息①釋放信號(hào)燈①接收消息④獲取信號(hào)量④③事件機(jī)制的典型應(yīng)用解決復(fù)雜的應(yīng)用設(shè)計(jì)問題①發(fā)送方(Task1或ISR)發(fā)送信息(消息或信號(hào)燈);②發(fā)送方(Task1或ISR)設(shè)置相應(yīng)的事件標(biāo)志(指示消息或信號(hào)燈的發(fā)送);③接收方(Task2)檢測事件標(biāo)志集,判斷是否滿足其接收條件(“與”條件接收或“或”條件接收);④接收方(Task2)根據(jù)事件標(biāo)志集的指示定向接收信息(消息或信號(hào)燈),達(dá)到和不同發(fā)送方(Task1或ISR)同步或通信的目的。

第四節(jié)

管道概述管道機(jī)制的主要數(shù)據(jù)結(jié)構(gòu)典型的管道操作管道機(jī)制的典型應(yīng)用管道機(jī)制概述管道(pipe)是提供非結(jié)構(gòu)化數(shù)據(jù)交換和實(shí)現(xiàn)任務(wù)間同步的內(nèi)核對(duì)象。在傳統(tǒng)的實(shí)現(xiàn)中,管道是單向數(shù)據(jù)交換設(shè)施。Task1Task2管道管道中的數(shù)據(jù)寫描述符讀描述符向管道寫數(shù)據(jù)從管道讀數(shù)據(jù)數(shù)據(jù)在管道內(nèi)像一個(gè)非結(jié)構(gòu)字節(jié)流,按FIFO的次序從管道中讀出。當(dāng)管道空時(shí),阻塞讀者,當(dāng)管道滿時(shí),阻塞寫者。管道機(jī)制概述管道允許有多個(gè)讀者和寫者。Task1Task5管道Task2Task3Task4Task6ISR1ISR2ISR3公共管道操作管道機(jī)制概述管道與消息隊(duì)列的區(qū)別管道不存儲(chǔ)多個(gè)消息,它存儲(chǔ)的數(shù)據(jù)是非結(jié)構(gòu)化的字節(jié)流;管道中的數(shù)據(jù)嚴(yán)格地遵循先進(jìn)先出的順序;管道支持選擇(select)操作,而消息隊(duì)列不支持。管道機(jī)制概述管道的狀態(tài)非空滿創(chuàng)建管道無寫入數(shù)據(jù)讀數(shù)據(jù),有剩余數(shù)據(jù)空寫數(shù)據(jù)讀數(shù)據(jù),無數(shù)據(jù)留下寫數(shù)據(jù),有剩余空間讀數(shù)據(jù)寫數(shù)據(jù),無剩余空

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論