嵌入式操作系統(tǒng)教程-第九章課件_第1頁(yè)
嵌入式操作系統(tǒng)教程-第九章課件_第2頁(yè)
嵌入式操作系統(tǒng)教程-第九章課件_第3頁(yè)
嵌入式操作系統(tǒng)教程-第九章課件_第4頁(yè)
嵌入式操作系統(tǒng)教程-第九章課件_第5頁(yè)
已閱讀5頁(yè),還剩71頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

第九章任務(wù)的同步與通信任務(wù)間的同步和事件控制塊信號(hào)量及其操作任務(wù)優(yōu)先級(jí)反轉(zhuǎn)和互斥型信號(hào)量消息郵箱及其操作消息隊(duì)列及其操作1第九章任務(wù)的同步與通信任務(wù)間的同步和事件控制塊1第九章任務(wù)的同步與通信一、任務(wù)間的同步

鑒于任務(wù)間直接制約或間接制約性的關(guān)系,這種制約性的合作運(yùn)行機(jī)制叫做任務(wù)的同步。

二、事件

用于uC/OS-II任務(wù)間通信媒介的信號(hào)量、郵箱和消息隊(duì)列等數(shù)據(jù)結(jié)構(gòu)會(huì)影響到任務(wù)的程序流程,這些通信媒介又被稱為事件(Events)?!?.1任務(wù)間的同步和事件控制塊

2第九章任務(wù)的同步與通信一、任務(wù)間的同步二、事件§9.11.信號(hào)量互斥型信號(hào)量:通常表現(xiàn)為一個(gè)二值型信號(hào),用一位二進(jìn)制位來(lái)表示(1/0),可以實(shí)現(xiàn)共享資源的獨(dú)占式占用。信號(hào)量:通常表現(xiàn)為一個(gè)遞減的計(jì)數(shù)器信號(hào),可以實(shí)現(xiàn)若干個(gè)同類資源的共享,提高資源使用效率。31.信號(hào)量互斥型信號(hào)量:通常表現(xiàn)為一個(gè)二值型信號(hào),用一位二進(jìn)2.消息郵箱指向保存任務(wù)間傳遞信息的存儲(chǔ)空間(緩存區(qū))的指針結(jié)構(gòu)稱為消息郵箱。42.消息郵箱指向保存任務(wù)間傳遞信息的存儲(chǔ)空間(緩存區(qū)3.消息隊(duì)列若消息郵箱被定義成擁有若干個(gè)元素的數(shù)組,用來(lái)傳遞多個(gè)消息的地址指針,這樣消息的數(shù)據(jù)結(jié)構(gòu)稱為消息隊(duì)列。4.事件的等待任務(wù)隊(duì)列兩個(gè)功能:對(duì)等待事件的所有記錄進(jìn)行登記并排序允許任務(wù)有一定的等待時(shí)間53.消息隊(duì)列若消息郵箱被定義成擁有若干個(gè)元素的數(shù)組,66三、事件控制塊事件控制塊的結(jié)構(gòu)OSEventPtr指針,只有在所定義的事件是郵箱或者消息隊(duì)列時(shí)才使用。當(dāng)所定義的事件是郵箱時(shí),它指向一個(gè)消息,而當(dāng)所定義的事件是消息隊(duì)列時(shí),它指向一個(gè)數(shù)據(jù)結(jié)構(gòu)。typedefstruct{void*OSEventPtr;/*指向消息或者消息隊(duì)列的指針*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任務(wù)列表*/INT16UOSEventCnt;/*計(jì)數(shù)器(當(dāng)事件是信號(hào)量時(shí))*/INT8UOSEventType;/*事件類型*/INT8UOSEventGrp;/*等待任務(wù)所在的組*/}OS_EVENT;7三、事件控制塊事件控制塊的結(jié)構(gòu)typedefstruct.OSEventTbl[]/.OSEventGrp

與前面提過(guò)的OSRdyTbl[]和OSRdyGrp非常相像,只不過(guò)前兩者包含的是等待某事件的任務(wù),而后兩者包含的是系統(tǒng)中處于就緒狀態(tài)的任務(wù)。.OSEventCnt:當(dāng)事件是一個(gè)信號(hào)量時(shí),.OSEventCnt是用于信號(hào)量的計(jì)數(shù)器。.OSEventType:定義了事件的具體類型。它可以是信號(hào)量(OS_EVENT_SEM)、郵箱(OS_EVENT_TYPE_MBOX)或消息隊(duì)列(OS_EVENT_TYPE_Q)中的一種。用戶要根據(jù)該域的具體值來(lái)調(diào)用相應(yīng)的系統(tǒng)函數(shù),以保證對(duì)其進(jìn)行的操作的正確性。8.OSEventTbl[]/.OSEventGrp與前面四、事件控制塊的基本操作函數(shù)1.事件控制塊的初始話函數(shù)

函數(shù)作用:把變量OSEventGrp及任務(wù)等待表中的每一位都清0,即令事件的任務(wù)等代表中不含有任何等待任務(wù)。voidOSEventWaitListInit(OS_EVENT*pevent){INT8Ui;pevent->OSEventGrp=0x00;for(i=0;i<OS_EVENT_TBL_SIZE;i++){pevent->OSEventTbl[i]=0x00;}}9四、事件控制塊的基本操作函數(shù)1.事件控制塊的初始話函數(shù)voi2.使一個(gè)任務(wù)進(jìn)入等待狀態(tài)的函數(shù)

當(dāng)一個(gè)任務(wù)在請(qǐng)求一個(gè)事件而不能獲得時(shí),應(yīng)把次任務(wù)登記在時(shí)間的等待任務(wù)列表中,并把任務(wù)控制塊中的任務(wù)狀態(tài)置為等待狀態(tài)和吧任務(wù)置為非就緒任務(wù)voidOSEventTaskWait(OS_EVENT*pevent){OSTCBCur->OSTCBEventPtr=pevent; (1)if((OSRdyTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0){(2)OSRdyGrp&=~OSTCBCur->OSTCBBitY;}pevent->OSEventTbl[OSTCBCur->OSTCBY]|=OSTCBCur->OSTCBBitX;(3)pevent->OSEventGrp|=OSTCBCur->OSTCBBitY;}102.使一個(gè)任務(wù)進(jìn)入等待狀態(tài)的函數(shù)voidOSEventTa3.正在等待的任務(wù)進(jìn)入就緒狀態(tài)

當(dāng)一個(gè)正在等待的任務(wù)具備了可以運(yùn)行的條件,這時(shí)需調(diào)用此函數(shù)來(lái)使它進(jìn)入就緒狀態(tài)。該函數(shù)的作用就是把調(diào)用這個(gè)函數(shù)的任務(wù)在任務(wù)等待表中的位置清O后,再把任務(wù)子啊任務(wù)就緒表中的對(duì)應(yīng)位置1,然后引起一次任務(wù)調(diào)度。voidOSEventTaskRdy(OS_EVENT*pevent,void*msg,INT8Umsk){OS_TCB*ptcb;INT8Ux;INT8Uy;INT8Ubitx;INT8Ubity;INT8Uprio;……}113.正在等待的任務(wù)進(jìn)入就緒狀態(tài)voidOSEventTas4.等待超時(shí)的任務(wù)轉(zhuǎn)為就緒態(tài)

正在等待事件的任務(wù)在預(yù)先指定的時(shí)間內(nèi)仍然沒(méi)有獲取事件,這時(shí)需調(diào)用此函數(shù)來(lái)轉(zhuǎn)換的它的狀態(tài)。voidOSEventTO(OS_EVENT*pevent){if((pevent->OSEventTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0){(1)pevent->OSEventGrp&=~OSTCBCur->OSTCBBitY;}OSTCBCur->OSTCBStat=OS_STAT_RDY; (2)OSTCBCur->OSTCBEventPtr=(OS_EVENT*)0; (3)}124.等待超時(shí)的任務(wù)轉(zhuǎn)為就緒態(tài)voidOSEventTO五、空事件控制塊的的組織

和任務(wù)控制塊的組織結(jié)構(gòu)類似:所有的事件控制塊也被組織成兩個(gè)鏈表,當(dāng)系統(tǒng)初始化時(shí),通過(guò)控制塊指針OSEventPtr把所有的空時(shí)間控制塊鏈接成一個(gè)空事件控制塊鏈表。13五、空事件控制塊的的組織和任務(wù)控制塊的組織結(jié)構(gòu)類似:§9.1信號(hào)量及其操作一、信號(hào)量

由16位的無(wú)符號(hào)整數(shù)(0到65,535之間)構(gòu)成的信號(hào)量計(jì)數(shù)器和任務(wù)等待表兩部分組成。計(jì)數(shù)器決定共享資源的任務(wù)數(shù)。14§9.1信號(hào)量及其操作一、信號(hào)量14二、信號(hào)量的操作1.信號(hào)量的創(chuàng)建:信號(hào)量一旦建立就不能刪除了,因此也就不可能將一個(gè)已分配的任務(wù)控制塊再放回到空閑ECB鏈表中。OS_EVENT*OSSemCreate(INT16Ucnt){OS_EVENT*pevent;OS_ENTER_CRITICAL();pevent=OSEventFreeList; (1)if(OSEventFreeList!=(OS_EVENT*)0){ (2)OSEventFreeList=(OS_EVENT*)OSEventFreeList->OSEventPtr;}OS_EXIT_CRITICAL();if(pevent!=(OS_EVENT*)0){ (3)pevent->OSEventType=OS_EVENT_TYPE_SEM; (4)pevent->OSEventCnt=cnt; (5)OSEventWaitListInit(pevent); (6)}return(pevent); (7)}信號(hào)量創(chuàng)建15二、信號(hào)量的操作1.信號(hào)量的創(chuàng)建:OS_EVENT*OSS2.等待一個(gè)信號(hào)量,OSSemPend()/OSSemAccept()

voidOSSemPend(OS_EVENT*pevent,//信號(hào)量指針I(yè)NT16Utimeout,//等待時(shí)限INT8U*err);//錯(cuò)誤信息

INT16UOSSEMAccept(OS_EVENT*PEVENT//信號(hào)量指針)3.發(fā)送一個(gè)信號(hào)量,OSSemPost()任務(wù)獲得信號(hào)量,并在訪問(wèn)共享資源結(jié)束以后,必須釋放信號(hào)量,此過(guò)程需調(diào)用函數(shù)OSSemPost()完成。162.等待一個(gè)信號(hào)量,OSSemPend()/OSSemAcINT8UOSSemPost(OS_EVENT*pevent){OS_ENTER_CRITICAL();if(pevent->OSEventType!=OS_EVENT_TYPE_SEM){ (1)OS_EXIT_CRITICAL();return(OS_ERR_EVENT_TYPE);}if(pevent->OSEventGrp){ (2)OSEventTaskRdy(pevent,(void*)0,OS_STAT_SEM); (3)OS_EXIT_CRITICAL();OSSched(); (4)return(OS_NO_ERR);}else{if(pevent->OSEventCnt<65535){pevent->OSEventCnt++; (5)OS_EXIT_CRITICAL();return(OS_NO_ERR);}else{OS_EXIT_CRITICAL();return(OS_SEM_OVF);}}}17INT8UOSSemPost(OS_EVENT*pev3.發(fā)送一個(gè)信號(hào)量,OSSemPost()OS_EVENT*OSSemDel(OS_EVENT*pevent,INT8Uopt,INT8U*err);3.信號(hào)量狀態(tài)查詢,OSSemQuery()INT8UOSSemQuery(OS_EVENT*pevent,OS_SEM_DATA*pdata);Typedefstruct{INT16UOSCnt;INTU8UOSEventb1[OS_EVENT_SIZE];INT8UOSEventGrp;}OS_SEM_DATA;183.發(fā)送一個(gè)信號(hào)量,OSSemPost()OS_EVENT§9.3任務(wù)優(yōu)先級(jí)反轉(zhuǎn)和互斥型信號(hào)量一、任務(wù)優(yōu)先級(jí)的反轉(zhuǎn)現(xiàn)象

在可剝奪型內(nèi)核中,當(dāng)任務(wù)以獨(dú)占方式使用共享資源時(shí),會(huì)出現(xiàn)低優(yōu)先級(jí)任務(wù)先于高優(yōu)先級(jí)任務(wù)而被運(yùn)行的現(xiàn)象,這種現(xiàn)象就成為任務(wù)優(yōu)先級(jí)反轉(zhuǎn)。19§9.3任務(wù)優(yōu)先級(jí)反轉(zhuǎn)和互斥型信號(hào)量一、任務(wù)優(yōu)先級(jí)的反轉(zhuǎn)voidTaskA(void){……SetTaskPriority(RES_X_PRIO);//訪問(wèn)共享資源XSetTaskPriority(TASK_A_PRIO);……}形成原因:使用信號(hào)量的任務(wù)是否能夠運(yùn)行時(shí)受任務(wù)的優(yōu)先級(jí)別以及是否占用信號(hào)量?jī)蓚€(gè)條件約束的,而信號(hào)量的約束高于優(yōu)先級(jí)別的約束。解決方案:一旦獲取信號(hào)量的任務(wù)投入運(yùn)行,其將暫用最高優(yōu)先級(jí)別,直至任務(wù)執(zhí)行完成。20voidTaskA(void){……SetTa二、互斥型信號(hào)量實(shí)現(xiàn)對(duì)共享資源的獨(dú)占式處理。解決任務(wù)的優(yōu)先級(jí)反轉(zhuǎn):變量OSEventPtr占16位,低8位作為信號(hào)量有效性的判斷位;高8位則存放任務(wù)運(yùn)行后臨時(shí)暫用的優(yōu)先級(jí)別。21二、互斥型信號(hào)量實(shí)現(xiàn)對(duì)共享資源的獨(dú)占式處理。211.互斥型信號(hào)量的創(chuàng)建OS_EVENT*OSMutexCreate(INT8Uprio,INT8U*err);2.請(qǐng)求互斥型信號(hào)量:OSMutexPend()/OSMutexAccept()OS_EVENT*OSMutexPend(OS_EVENT*pevent,INT16UTimeout,INT8U*err);221.互斥型信號(hào)量的創(chuàng)建OS_EVENT*OSMutexCr3.發(fā)送互斥型信號(hào)量INT8UOSMutexQuery(OS_EVENT*pevent);4.查詢互斥型信號(hào)量的當(dāng)前狀態(tài)OS_EVENT*OSMutexPend(OS_EVENT*pevent,OS_MUTEX_DATA*pdata);Typedefstruct{INT8UOSValue;INTU8UOSEvenTb1[OS_EVENT_SIZE];INT8UOSEventGrp;INT8UOSOwnerPrio;INT8UOSMutexPIP;}OS_MUTEX_DATA;233.發(fā)送互斥型信號(hào)量INT8UOSMutexQuery(45.刪除互斥型信號(hào)量OS_EVENT*OSMutexPend(OS_EVENT*pevent,INT8Uopt,INT8U*err);245.刪除互斥型信號(hào)量OS_EVENT*OSMutexPen§9.4消息郵箱及其操作一、消息郵箱

任務(wù)與任務(wù)間要傳遞一個(gè)數(shù)據(jù),為了適應(yīng)不同數(shù)據(jù)的需要,最好在存儲(chǔ)中建立一個(gè)數(shù)據(jù)緩沖區(qū),把要傳遞的數(shù)據(jù)放在該緩沖區(qū)中,從而實(shí)現(xiàn)任務(wù)間的數(shù)據(jù)通信。25§9.4消息郵箱及其操作一、消息郵箱25二、消息郵箱的操作OS_EVENT*OSMboxCreate(void*msg){OS_EVENT*pevent;OS_ENTER_CRITICAL();pevent=OSEventFreeList;if(OSEventFreeList!=(OS_EVENT*)0){OSEventFreeList=(OS_EVENT*)OSEventFreeList->OSEventPtr;}OS_EXIT_CRITICAL();if(pevent!=(OS_EVENT*)0){pevent->OSEventType=OS_EVENT_TYPE_MBOX;(1)pevent->OSEventPtr=msg;(2)OSEventWaitListInit(pevent);}return(pevent);(3)}創(chuàng)建郵箱1.郵箱的創(chuàng)建26二、消息郵箱的操作OS_EVENT*OSMboxCreat2.發(fā)送一個(gè)消息到郵箱中:

OSMboxPost()/OSMboxPostOpt()INT8UOSMboxPost(OS_EVENT*pevent,void*msg)INT8UOSMboxPostOpt(OS_EVENT*pevent,void*msg,INT8Uopt)272.發(fā)送一個(gè)消息到郵箱中:

OSMboxPost()/OS3.等待一個(gè)郵箱中的消息:OSMboxPend()/OSMboxAccept()

void*OSMboxPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)void*OSMboxAccept(OS_EVENT*pevent)283.等待一個(gè)郵箱中的消息:OSMboxPend()/OSM4.查詢一個(gè)郵箱的狀態(tài),OSMboxQuery()

INT8UOSMboxQuery(OS_EVENT*pevent,OS_MBOX_DATA*pdata)

Typedefstruct{void*OSMsg;INTU8UOSEvenTb1[OS_EVENT_TBL_SIZE];INT8UOSEventGrp;}OS_MBOX_DATA;5.刪除郵箱,OSMboxDel()

OS_EVENT*OSMboxDel(OS_EVENT*pevent,INT8UoptINT8U*err)

294.查詢一個(gè)郵箱的狀態(tài),OSMboxQuery()§9.5消息隊(duì)列及其操作一、消息隊(duì)列

消息隊(duì)列可以傳遞多條消息,通常由三部分組成:事件控制塊、消息對(duì)列和消息.30§9.5消息隊(duì)列及其操作一、消息隊(duì)列301.消息指針數(shù)組

消息指針數(shù)組結(jié)構(gòu)311.消息指針數(shù)組消息指針數(shù)組結(jié)構(gòu)31OSQPtr在空閑隊(duì)列控制塊中鏈接所有的隊(duì)列控制塊。一旦建立了消息隊(duì)列,該域就不再有用了。OSQStart是指向消息隊(duì)列的指針數(shù)組的起始地址的指針。用戶應(yīng)用程序在使用消息隊(duì)列之前必須先定義該數(shù)組。OSQEnd是指向消息隊(duì)列結(jié)束單元的下一個(gè)地址的指針。該指針使得消息隊(duì)列構(gòu)成一個(gè)循環(huán)的緩沖區(qū)。OSQIn是指向消息隊(duì)列中插入下一條消息的位置的指針。當(dāng)OSQIn和.OSQEnd相等時(shí),OSQIn被調(diào)整指向消息隊(duì)列的起始單元。32OSQPtr在空閑隊(duì)列控制塊中鏈接所有的隊(duì)列控制塊。一旦建立OSQOut是指向消息隊(duì)列中下一個(gè)取出消息的位置的指針。當(dāng)OSQOut和OSQEnd相等時(shí),OSQOut被調(diào)整指向消息隊(duì)列的起始單元。OSQSize是消息隊(duì)列中總的單元數(shù)。該值是在建立消息隊(duì)列時(shí)由用戶應(yīng)用程序決定的。在μC/OS-II中,該值最大可以是65,535。OSQEntries是消息隊(duì)列中當(dāng)前的消息數(shù)量。當(dāng)消息隊(duì)列是空的時(shí),該值為0。當(dāng)消息隊(duì)列滿了以后,該值和OSQSize值一樣。在消息隊(duì)列剛剛建立時(shí),該值為0。33OSQOut是指向消息隊(duì)列中下一個(gè)取出消息的位置的指針。當(dāng)O

系統(tǒng)把消息指針數(shù)組的基本參數(shù)都記錄在一個(gè)叫做隊(duì)列控制塊(OS_Q)的結(jié)構(gòu)中。并用隊(duì)列控制塊中的指針OSQPtr將所有隊(duì)列控制塊鏈接為鏈表。2.隊(duì)列控制塊

34系統(tǒng)把消息指針數(shù)組的基本參數(shù)都記錄在一個(gè)叫做隊(duì)列控制一、消息隊(duì)列的操作1.消息隊(duì)列的創(chuàng)建,OSQCreate()

OS_EVENT*OSQCreate(void**start,INT16Usize)2.等待一個(gè)消息隊(duì)列中的消息,OSQPend()/OSQAccept()void*OSQPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)void*OSQAccept(OS_EVENT*pevent)35一、消息隊(duì)列的操作1.消息隊(duì)列的創(chuàng)建,OSQCreate()3.向消息隊(duì)列發(fā)送一個(gè)消息(FIFO),OSQPost()和OSQPostOpt()

INT8UOSQPost(OS_EVENT*pevent,void*msg)INT8UOSQPostOpt(OS_EVENT*pevent,void*msg.INT8Uopt)363.向消息隊(duì)列發(fā)送一個(gè)消息(FIFO),OSQPost()和4.清空一個(gè)消息隊(duì)列,OSQFlush()

INT8UOSQFlush(OS_EVENT*pevent){OS_Q*pq;OS_ENTER_CRITICAL();if(pevent->OSEventType!=OS_EVENT_TYPE_Q){ (1)OS_EXIT_CRITICAL();return(OS_ERR_EVENT_TYPE);}pq=pevent->OSEventPtr;pq->OSQIn=pq->OSQStart; (2)pq->OSQOut=pq->OSQStart;pq->OSQEntries=0;OS_EXIT_CRITICAL();return(OS_NO_ERR);}374.清空一個(gè)消息隊(duì)列,OSQFlush()INT8UO5.刪除一個(gè)消息隊(duì)列,OSQDEL()

OS_EVENTOSQDel(OS_EVENT*pevent);6.查詢消息隊(duì)列,OSQQuery()

OS_EVENTOSQQuery(OS_EVENT*pevent,OS_Q_DATA*pdata);Typedefstruct{void*OSMsg;INTU8UOSEvenTb1[OS_EVENT_TBL_SIZE];INT8UOSEventGrp;INT16UOSQSize;INT16UOSNMsgs;}OS_FLAG_GRP;385.刪除一個(gè)消息隊(duì)列,OSQDEL()Typedefs

第九章任務(wù)的同步與通信任務(wù)間的同步和事件控制塊信號(hào)量及其操作任務(wù)優(yōu)先級(jí)反轉(zhuǎn)和互斥型信號(hào)量消息郵箱及其操作消息隊(duì)列及其操作39第九章任務(wù)的同步與通信任務(wù)間的同步和事件控制塊1第九章任務(wù)的同步與通信一、任務(wù)間的同步

鑒于任務(wù)間直接制約或間接制約性的關(guān)系,這種制約性的合作運(yùn)行機(jī)制叫做任務(wù)的同步。

二、事件

用于uC/OS-II任務(wù)間通信媒介的信號(hào)量、郵箱和消息隊(duì)列等數(shù)據(jù)結(jié)構(gòu)會(huì)影響到任務(wù)的程序流程,這些通信媒介又被稱為事件(Events)。§9.1任務(wù)間的同步和事件控制塊

40第九章任務(wù)的同步與通信一、任務(wù)間的同步二、事件§9.11.信號(hào)量互斥型信號(hào)量:通常表現(xiàn)為一個(gè)二值型信號(hào),用一位二進(jìn)制位來(lái)表示(1/0),可以實(shí)現(xiàn)共享資源的獨(dú)占式占用。信號(hào)量:通常表現(xiàn)為一個(gè)遞減的計(jì)數(shù)器信號(hào),可以實(shí)現(xiàn)若干個(gè)同類資源的共享,提高資源使用效率。411.信號(hào)量互斥型信號(hào)量:通常表現(xiàn)為一個(gè)二值型信號(hào),用一位二進(jìn)2.消息郵箱指向保存任務(wù)間傳遞信息的存儲(chǔ)空間(緩存區(qū))的指針結(jié)構(gòu)稱為消息郵箱。422.消息郵箱指向保存任務(wù)間傳遞信息的存儲(chǔ)空間(緩存區(qū)3.消息隊(duì)列若消息郵箱被定義成擁有若干個(gè)元素的數(shù)組,用來(lái)傳遞多個(gè)消息的地址指針,這樣消息的數(shù)據(jù)結(jié)構(gòu)稱為消息隊(duì)列。4.事件的等待任務(wù)隊(duì)列兩個(gè)功能:對(duì)等待事件的所有記錄進(jìn)行登記并排序允許任務(wù)有一定的等待時(shí)間433.消息隊(duì)列若消息郵箱被定義成擁有若干個(gè)元素的數(shù)組,446三、事件控制塊事件控制塊的結(jié)構(gòu)OSEventPtr指針,只有在所定義的事件是郵箱或者消息隊(duì)列時(shí)才使用。當(dāng)所定義的事件是郵箱時(shí),它指向一個(gè)消息,而當(dāng)所定義的事件是消息隊(duì)列時(shí),它指向一個(gè)數(shù)據(jù)結(jié)構(gòu)。typedefstruct{void*OSEventPtr;/*指向消息或者消息隊(duì)列的指針*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任務(wù)列表*/INT16UOSEventCnt;/*計(jì)數(shù)器(當(dāng)事件是信號(hào)量時(shí))*/INT8UOSEventType;/*事件類型*/INT8UOSEventGrp;/*等待任務(wù)所在的組*/}OS_EVENT;45三、事件控制塊事件控制塊的結(jié)構(gòu)typedefstruct.OSEventTbl[]/.OSEventGrp

與前面提過(guò)的OSRdyTbl[]和OSRdyGrp非常相像,只不過(guò)前兩者包含的是等待某事件的任務(wù),而后兩者包含的是系統(tǒng)中處于就緒狀態(tài)的任務(wù)。.OSEventCnt:當(dāng)事件是一個(gè)信號(hào)量時(shí),.OSEventCnt是用于信號(hào)量的計(jì)數(shù)器。.OSEventType:定義了事件的具體類型。它可以是信號(hào)量(OS_EVENT_SEM)、郵箱(OS_EVENT_TYPE_MBOX)或消息隊(duì)列(OS_EVENT_TYPE_Q)中的一種。用戶要根據(jù)該域的具體值來(lái)調(diào)用相應(yīng)的系統(tǒng)函數(shù),以保證對(duì)其進(jìn)行的操作的正確性。46.OSEventTbl[]/.OSEventGrp與前面四、事件控制塊的基本操作函數(shù)1.事件控制塊的初始話函數(shù)

函數(shù)作用:把變量OSEventGrp及任務(wù)等待表中的每一位都清0,即令事件的任務(wù)等代表中不含有任何等待任務(wù)。voidOSEventWaitListInit(OS_EVENT*pevent){INT8Ui;pevent->OSEventGrp=0x00;for(i=0;i<OS_EVENT_TBL_SIZE;i++){pevent->OSEventTbl[i]=0x00;}}47四、事件控制塊的基本操作函數(shù)1.事件控制塊的初始話函數(shù)voi2.使一個(gè)任務(wù)進(jìn)入等待狀態(tài)的函數(shù)

當(dāng)一個(gè)任務(wù)在請(qǐng)求一個(gè)事件而不能獲得時(shí),應(yīng)把次任務(wù)登記在時(shí)間的等待任務(wù)列表中,并把任務(wù)控制塊中的任務(wù)狀態(tài)置為等待狀態(tài)和吧任務(wù)置為非就緒任務(wù)voidOSEventTaskWait(OS_EVENT*pevent){OSTCBCur->OSTCBEventPtr=pevent; (1)if((OSRdyTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0){(2)OSRdyGrp&=~OSTCBCur->OSTCBBitY;}pevent->OSEventTbl[OSTCBCur->OSTCBY]|=OSTCBCur->OSTCBBitX;(3)pevent->OSEventGrp|=OSTCBCur->OSTCBBitY;}482.使一個(gè)任務(wù)進(jìn)入等待狀態(tài)的函數(shù)voidOSEventTa3.正在等待的任務(wù)進(jìn)入就緒狀態(tài)

當(dāng)一個(gè)正在等待的任務(wù)具備了可以運(yùn)行的條件,這時(shí)需調(diào)用此函數(shù)來(lái)使它進(jìn)入就緒狀態(tài)。該函數(shù)的作用就是把調(diào)用這個(gè)函數(shù)的任務(wù)在任務(wù)等待表中的位置清O后,再把任務(wù)子啊任務(wù)就緒表中的對(duì)應(yīng)位置1,然后引起一次任務(wù)調(diào)度。voidOSEventTaskRdy(OS_EVENT*pevent,void*msg,INT8Umsk){OS_TCB*ptcb;INT8Ux;INT8Uy;INT8Ubitx;INT8Ubity;INT8Uprio;……}493.正在等待的任務(wù)進(jìn)入就緒狀態(tài)voidOSEventTas4.等待超時(shí)的任務(wù)轉(zhuǎn)為就緒態(tài)

正在等待事件的任務(wù)在預(yù)先指定的時(shí)間內(nèi)仍然沒(méi)有獲取事件,這時(shí)需調(diào)用此函數(shù)來(lái)轉(zhuǎn)換的它的狀態(tài)。voidOSEventTO(OS_EVENT*pevent){if((pevent->OSEventTbl[OSTCBCur->OSTCBY]&=~OSTCBCur->OSTCBBitX)==0){(1)pevent->OSEventGrp&=~OSTCBCur->OSTCBBitY;}OSTCBCur->OSTCBStat=OS_STAT_RDY; (2)OSTCBCur->OSTCBEventPtr=(OS_EVENT*)0; (3)}504.等待超時(shí)的任務(wù)轉(zhuǎn)為就緒態(tài)voidOSEventTO五、空事件控制塊的的組織

和任務(wù)控制塊的組織結(jié)構(gòu)類似:所有的事件控制塊也被組織成兩個(gè)鏈表,當(dāng)系統(tǒng)初始化時(shí),通過(guò)控制塊指針OSEventPtr把所有的空時(shí)間控制塊鏈接成一個(gè)空事件控制塊鏈表。51五、空事件控制塊的的組織和任務(wù)控制塊的組織結(jié)構(gòu)類似:§9.1信號(hào)量及其操作一、信號(hào)量

由16位的無(wú)符號(hào)整數(shù)(0到65,535之間)構(gòu)成的信號(hào)量計(jì)數(shù)器和任務(wù)等待表兩部分組成。計(jì)數(shù)器決定共享資源的任務(wù)數(shù)。52§9.1信號(hào)量及其操作一、信號(hào)量14二、信號(hào)量的操作1.信號(hào)量的創(chuàng)建:信號(hào)量一旦建立就不能刪除了,因此也就不可能將一個(gè)已分配的任務(wù)控制塊再放回到空閑ECB鏈表中。OS_EVENT*OSSemCreate(INT16Ucnt){OS_EVENT*pevent;OS_ENTER_CRITICAL();pevent=OSEventFreeList; (1)if(OSEventFreeList!=(OS_EVENT*)0){ (2)OSEventFreeList=(OS_EVENT*)OSEventFreeList->OSEventPtr;}OS_EXIT_CRITICAL();if(pevent!=(OS_EVENT*)0){ (3)pevent->OSEventType=OS_EVENT_TYPE_SEM; (4)pevent->OSEventCnt=cnt; (5)OSEventWaitListInit(pevent); (6)}return(pevent); (7)}信號(hào)量創(chuàng)建53二、信號(hào)量的操作1.信號(hào)量的創(chuàng)建:OS_EVENT*OSS2.等待一個(gè)信號(hào)量,OSSemPend()/OSSemAccept()

voidOSSemPend(OS_EVENT*pevent,//信號(hào)量指針I(yè)NT16Utimeout,//等待時(shí)限INT8U*err);//錯(cuò)誤信息

INT16UOSSEMAccept(OS_EVENT*PEVENT//信號(hào)量指針)3.發(fā)送一個(gè)信號(hào)量,OSSemPost()任務(wù)獲得信號(hào)量,并在訪問(wèn)共享資源結(jié)束以后,必須釋放信號(hào)量,此過(guò)程需調(diào)用函數(shù)OSSemPost()完成。542.等待一個(gè)信號(hào)量,OSSemPend()/OSSemAcINT8UOSSemPost(OS_EVENT*pevent){OS_ENTER_CRITICAL();if(pevent->OSEventType!=OS_EVENT_TYPE_SEM){ (1)OS_EXIT_CRITICAL();return(OS_ERR_EVENT_TYPE);}if(pevent->OSEventGrp){ (2)OSEventTaskRdy(pevent,(void*)0,OS_STAT_SEM); (3)OS_EXIT_CRITICAL();OSSched(); (4)return(OS_NO_ERR);}else{if(pevent->OSEventCnt<65535){pevent->OSEventCnt++; (5)OS_EXIT_CRITICAL();return(OS_NO_ERR);}else{OS_EXIT_CRITICAL();return(OS_SEM_OVF);}}}55INT8UOSSemPost(OS_EVENT*pev3.發(fā)送一個(gè)信號(hào)量,OSSemPost()OS_EVENT*OSSemDel(OS_EVENT*pevent,INT8Uopt,INT8U*err);3.信號(hào)量狀態(tài)查詢,OSSemQuery()INT8UOSSemQuery(OS_EVENT*pevent,OS_SEM_DATA*pdata);Typedefstruct{INT16UOSCnt;INTU8UOSEventb1[OS_EVENT_SIZE];INT8UOSEventGrp;}OS_SEM_DATA;563.發(fā)送一個(gè)信號(hào)量,OSSemPost()OS_EVENT§9.3任務(wù)優(yōu)先級(jí)反轉(zhuǎn)和互斥型信號(hào)量一、任務(wù)優(yōu)先級(jí)的反轉(zhuǎn)現(xiàn)象

在可剝奪型內(nèi)核中,當(dāng)任務(wù)以獨(dú)占方式使用共享資源時(shí),會(huì)出現(xiàn)低優(yōu)先級(jí)任務(wù)先于高優(yōu)先級(jí)任務(wù)而被運(yùn)行的現(xiàn)象,這種現(xiàn)象就成為任務(wù)優(yōu)先級(jí)反轉(zhuǎn)。57§9.3任務(wù)優(yōu)先級(jí)反轉(zhuǎn)和互斥型信號(hào)量一、任務(wù)優(yōu)先級(jí)的反轉(zhuǎn)voidTaskA(void){……SetTaskPriority(RES_X_PRIO);//訪問(wèn)共享資源XSetTaskPriority(TASK_A_PRIO);……}形成原因:使用信號(hào)量的任務(wù)是否能夠運(yùn)行時(shí)受任務(wù)的優(yōu)先級(jí)別以及是否占用信號(hào)量?jī)蓚€(gè)條件約束的,而信號(hào)量的約束高于優(yōu)先級(jí)別的約束。解決方案:一旦獲取信號(hào)量的任務(wù)投入運(yùn)行,其將暫用最高優(yōu)先級(jí)別,直至任務(wù)執(zhí)行完成。58voidTaskA(void){……SetTa二、互斥型信號(hào)量實(shí)現(xiàn)對(duì)共享資源的獨(dú)占式處理。解決任務(wù)的優(yōu)先級(jí)反轉(zhuǎn):變量OSEventPtr占16位,低8位作為信號(hào)量有效性的判斷位;高8位則存放任務(wù)運(yùn)行后臨時(shí)暫用的優(yōu)先級(jí)別。59二、互斥型信號(hào)量實(shí)現(xiàn)對(duì)共享資源的獨(dú)占式處理。211.互斥型信號(hào)量的創(chuàng)建OS_EVENT*OSMutexCreate(INT8Uprio,INT8U*err);2.請(qǐng)求互斥型信號(hào)量:OSMutexPend()/OSMutexAccept()OS_EVENT*OSMutexPend(OS_EVENT*pevent,INT16UTimeout,INT8U*err);601.互斥型信號(hào)量的創(chuàng)建OS_EVENT*OSMutexCr3.發(fā)送互斥型信號(hào)量INT8UOSMutexQuery(OS_EVENT*pevent);4.查詢互斥型信號(hào)量的當(dāng)前狀態(tài)OS_EVENT*OSMutexPend(OS_EVENT*pevent,OS_MUTEX_DATA*pdata);Typedefstruct{INT8UOSValue;INTU8UOSEvenTb1[OS_EVENT_SIZE];INT8UOSEventGrp;INT8UOSOwnerPrio;INT8UOSMutexPIP;}OS_MUTEX_DATA;613.發(fā)送互斥型信號(hào)量INT8UOSMutexQuery(45.刪除互斥型信號(hào)量OS_EVENT*OSMutexPend(OS_EVENT*pevent,INT8Uopt,INT8U*err);625.刪除互斥型信號(hào)量OS_EVENT*OSMutexPen§9.4消息郵箱及其操作一、消息郵箱

任務(wù)與任務(wù)間要傳遞一個(gè)數(shù)據(jù),為了適應(yīng)不同數(shù)據(jù)的需要,最好在存儲(chǔ)中建立一個(gè)數(shù)據(jù)緩沖區(qū),把要傳遞的數(shù)據(jù)放在該緩沖區(qū)中,從而實(shí)現(xiàn)任務(wù)間的數(shù)據(jù)通信。63§9.4消息郵箱及其操作一、消息郵箱25二、消息郵箱的操作OS_EVENT*OSMboxCreate(void*msg){OS_EVENT*pevent;OS_ENTER_CRITICAL();pevent=OSEventFreeList;if(OSEventFreeList!=(OS_EVENT*)0){OSEventFreeList=(OS_EVENT*)OSEventFreeList->OSEventPtr;}OS_EXIT_CRITICAL();if(pevent!=(OS_EVENT*)0){pevent->OSEventType=OS_EVENT_TYPE_MBOX;(1)pevent->OSEventPtr=msg;(2)OSEventWaitListInit(pevent);}return(pevent);(3)}創(chuàng)建郵箱1.郵箱的創(chuàng)建64二、消息郵箱的操作OS_EVENT*OSMboxCreat2.發(fā)送一個(gè)消息到郵箱中:

OSMboxPost()/OSMboxPostOpt()INT8UOSMboxPost(OS_EVENT*pevent,void*msg)INT8UOSMboxPostOpt(OS_EVENT*pevent,void*msg,INT8Uopt)652.發(fā)送一個(gè)消息到郵箱中:

OSMboxPost()/OS3.等待一個(gè)郵箱中的消息:OSMboxPend()/OSMboxAccept()

void*OSMboxPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)void*OSMboxAccept(OS_EVENT*pevent)663.等待一個(gè)郵箱中的消息:OSMboxPend()/OSM4.查詢一個(gè)郵箱的狀態(tài),OSMboxQuery()

INT8UOSMboxQuery(OS_EVENT*pevent,OS_MBOX_DATA*pdata)

Typedefstruct{void*OSMsg;INTU8UOSEvenTb1[OS_EVENT_TBL_SIZE];INT8UOSEventGrp;}OS_MBOX_DATA;5.刪除郵箱,OSMboxDel()

OS_EVENT*OSMboxDel(OS_EVENT*pevent,INT8UoptINT8U*err)

674.查詢一個(gè)郵箱的狀態(tài),OSMboxQuery()§9.5消息隊(duì)列及其操作一、消息隊(duì)列

消息隊(duì)列可以傳遞多條消息,通常由三部分組成:事件控制塊、消息對(duì)列和消息.68§9.5消息隊(duì)列及其操作一、消息隊(duì)列301.消息指針數(shù)組

消息指針數(shù)組結(jié)構(gòu)691.消息指針數(shù)組消息指針數(shù)組結(jié)構(gòu)31OSQPtr在空閑隊(duì)列控制塊中鏈接所有的隊(duì)列控制塊。一旦建立了消息隊(duì)列,該域就不再有用了。OSQStart是指向消息隊(duì)列的指針數(shù)組的起始地址的指針。用戶應(yīng)用程序在使用消息隊(duì)列之前必須先定義該數(shù)組。OSQEnd是指向消息隊(duì)列結(jié)束單元的下一個(gè)地址的指針。該指針使得消息隊(duì)列構(gòu)成一個(gè)循環(huán)的緩沖區(qū)。OSQIn是指向消息隊(duì)列中插入下一條消息的位置的指針。當(dāng)OSQIn和.OSQEnd相等時(shí),OSQIn被調(diào)整指向消息隊(duì)列的起始單元。70OSQPtr在空閑隊(duì)列控制塊中鏈接所有的隊(duì)列控制塊。一旦建立OSQOut是指向消息隊(duì)列中下一個(gè)取出消息的位置的指針。當(dāng)OSQOut和OSQEnd相等時(shí),OSQOut被調(diào)整指向消息隊(duì)列的起始單元。OSQSize是消息隊(duì)列中總的單元數(shù)。該值是在建立消息隊(duì)列時(shí)由用戶應(yīng)用程序決定的。在μC/OS-II中,該值最大可以是65,535。OSQEntries是消息隊(duì)列中當(dāng)前的消息數(shù)量。當(dāng)消息隊(duì)列是空的時(shí),該值為0。當(dāng)消息隊(duì)列滿了以后,該值和O

溫馨提示

  • 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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論