版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 土石方工程施工合作協(xié)議范本
- 砌磚分包商合同模板
- 旅游租車協(xié)議書范本
- 蔬菜采購(gòu)合同的修改記錄
- 二手房屋買賣合同范本點(diǎn)評(píng)
- 工程勞務(wù)分包結(jié)算單填寫指南
- 雞苗買賣合同示例
- 國(guó)際采購(gòu)合同條款解析
- 河北工程分包協(xié)議樣本
- 保健品交易合同
- 韋尼克腦病病因介紹
- 死亡醫(yī)學(xué)證明管理規(guī)定(3篇)
- 2024-2030年中國(guó)三氧化二砷行業(yè)運(yùn)行狀況及發(fā)展可行性分析報(bào)告
- 2024年制造業(yè)代工生產(chǎn)保密協(xié)議樣本版
- 醫(yī)院維修維保工程合同范文
- 2024年度學(xué)校工作總結(jié)校長(zhǎng)匯報(bào):六大支柱筑夢(mèng)教育新征程
- 學(xué)生體質(zhì)健康狀況與體能發(fā)展質(zhì)量的幾個(gè)問(wèn)題課件
- 《奇效的敷臍療法》課件
- 2024《整治形式主義為基層減負(fù)若干規(guī)定》全文課件
- 常用統(tǒng)計(jì)軟件應(yīng)用智慧樹(shù)知到期末考試答案章節(jié)答案2024年揚(yáng)州大學(xué)
- 中國(guó)法律史-第三次平時(shí)作業(yè)-國(guó)開(kāi)-參考資料
評(píng)論
0/150
提交評(píng)論