《嵌入式操作系統(tǒng)原理與面向任務(wù)程序設(shè)計(jì)》課件第四講M_第1頁(yè)
《嵌入式操作系統(tǒng)原理與面向任務(wù)程序設(shè)計(jì)》課件第四講M_第2頁(yè)
《嵌入式操作系統(tǒng)原理與面向任務(wù)程序設(shè)計(jì)》課件第四講M_第3頁(yè)
《嵌入式操作系統(tǒng)原理與面向任務(wù)程序設(shè)計(jì)》課件第四講M_第4頁(yè)
《嵌入式操作系統(tǒng)原理與面向任務(wù)程序設(shè)計(jì)》課件第四講M_第5頁(yè)
已閱讀5頁(yè),還剩72頁(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ù)管理信號(hào)量管理互斥信號(hào)量管理事件標(biāo)志組管理消息郵箱管理消息隊(duì)列管理多事件請(qǐng)求管理中斷管理宏函數(shù)定時(shí)器管理動(dòng)態(tài)內(nèi)存管理……μC/OS-II組件什么是μC/OS-II組件?μC/OS-II組件是指μC/OS-II操作系統(tǒng)向用戶應(yīng)用程序提供的服務(wù),主要有任務(wù)管理、信號(hào)量管理、互斥信號(hào)量管理、事件標(biāo)志組管理、消息郵箱管理、消息隊(duì)列管理、多事件請(qǐng)求管理、中斷管理、定時(shí)器管理、內(nèi)存管理等,每種服務(wù)都包括一些系統(tǒng)函數(shù)。4.1任務(wù)管理任務(wù)管理類(lèi)函數(shù)位于os_task.c文件中,用于實(shí)現(xiàn)任務(wù)創(chuàng)建、刪除、掛起、恢復(fù)、改變?nèi)蝿?wù)優(yōu)先級(jí)、查詢?nèi)蝿?wù)信息、查詢?nèi)蝿?wù)堆棧信息、設(shè)置任務(wù)名或查詢?nèi)蝿?wù)名等操作。這里主要講述OSTaskCreate、OSTaskCreateExt、OSTaskDel和OSTaskStkChk函數(shù)的工作原理。INT8UOSTaskCreate(void(*task)(void*p_arg),void*p_arg,OS_STK*ptos,INT8Uprio);INT8UOSTaskCreateExt(void(*task)(void*p_arg),void*p_arg,OS_STK*ptos,INT8Uprio,INT16Uid,OS_STK*pbos,

INT32Ustk_size,void*pext,INT16Uopt);4.1.1任務(wù)管理函數(shù)(OS_TASK.C中)INT8UOSTaskDel(INT8Uprio);INT8UOSTaskDelReq(INT8Uprio);INT8UOSTaskChangePrio(INT8Uoldprio,INT8Unewprio);INT8UOSTaskSuspend(INT8Uprio);INT8UOSTaskResume(INT8Uprio);INT8UOSTaskQuery(INT8Uprio,OS_TCB*p_task_data);INT8UOSTaskStkChk(INT8Uprio,OS_STK_DATA*p_stk_data);INT8UOSTaskNameGet(INT8Uprio,INT8U*pname,INT8U*perr);voidOSTaskNameSet(INT8Uprio,INT8U*pname,INT8U*perr);μC/OS-II系統(tǒng)中有二種創(chuàng)建任務(wù)的函數(shù),即OSTaskCreate和OSTaskCreateExt。4.1.2創(chuàng)建任務(wù)的步驟一、編寫(xiě)一個(gè)帶有無(wú)限循環(huán)的函數(shù),由于具有無(wú)限循環(huán),故函數(shù)沒(méi)有返回值。該函數(shù)具有一個(gè)void*類(lèi)型的指針,該指針可以指向任何類(lèi)型的數(shù)據(jù),通過(guò)該指針在任務(wù)創(chuàng)建時(shí)向任務(wù)傳遞一些數(shù)據(jù),這種傳遞只能發(fā)生一次,一旦任務(wù)開(kāi)始工作,就無(wú)法通過(guò)函數(shù)參數(shù)向任務(wù)傳遞數(shù)據(jù)了。程序段S4-1任務(wù)的函數(shù)體1voidAppTask_1(void*pdata)2{3INT8Uerr;4//SomeProcesshere,Onlyoncewhenfirstrunningtask5OSTaskNameSet(OS_PRIO_SELF,"AppTask_1",&err);6for(;;)7{8LED_Flash(1);//Yourwork,here910OSTimeDlyHMSM(0,0,1,0);11}12}二、為要?jiǎng)?chuàng)建的任務(wù)指定優(yōu)先級(jí)號(hào),每個(gè)任務(wù)都有唯一的優(yōu)先級(jí)號(hào),取值范圍從0至OS_LOWEST_PRIO(為文件os_cfg.h中的宏定義常量,最大為254),一般地,用戶任務(wù)優(yōu)先級(jí)從4至OS_LOWEST_PRIO-4。三、為要?jiǎng)?chuàng)建的任務(wù)定義堆棧,必須使用OS_STK類(lèi)型定義堆棧例如

OS_STKAppTask_1_Stk[200]四、

最后,調(diào)用OSTaskCreate或OSTaskCreateExt函數(shù)創(chuàng)建任務(wù)。例如OSTaskCreate(AppTask_1,(void*)0,&AppTask_1_Stk[199],AppTask_1_Prio);或OSTaskCreateExt(AppTask_1,(void*)0,&AppTask_1_Stk[199],AppTask_1_Prio,6,&AppTask_1_Stk[0],200,(void*)0,OS_TASK_OPT_STK_CHK|OS_TASK_OPT_STK_CLR);1#ifOS_TASK_CREATE_EN>02INT8UOSTaskCreate(void(*task)(void*p_arg),void*p_arg,OS_STK*ptos,INT8Uprio)3{4OS_STK*psp;5INT8Uerr;6#ifOS_CRITICAL_METHOD=37OS_CPU_SRcpu_sr=0;8#endif9104.1.3OSTaskCreate函數(shù)1112#ifOS_ARG_CHK_EN>013if(prio>OS_LOWEST_PRIO){14return(OS_ERR_PRIO_INVALID);15}16#endif17OS_ENTER_CRITICAL();18if(OSIntNesting>0){19OS_EXIT_CRITICAL();20return(OS_ERR_TASK_CREATE_ISR);21}22if(OSTCBPrioTbl[prio]==(OS_TCB*)0){23OSTCBPrioTbl[prio]=OS_TCB_RESERVED2425OS_EXIT_CRITICAL();26psp=OSTaskStkInit(task,p_arg,ptos,0);27err=OS_TCBInit(prio,psp,(OS_STK*)0,0,0,(void*)0,0);28if(err==OS_ERR_NONE){29if(OSRunning==OS_TRUE){30OS_Sched();31}32}else{33OS_ENTER_CRITICAL();34OSTCBPrioTbl[prio]=(OS_TCB*)0;35OS_EXIT_CRITICAL();36}37return(err);38}39OS_EXIT_CRITICAL();40return(OS_ERR_PRIO_EXIST);41}42#endif1OS_STK*OSTaskStkInit(void(*task)(void*p_arg),void*p_arg,OS_STK*ptos,INT16Uopt)2{3OS_STK*stk;4INT32Utask_addr;567opt=opt;8stk=ptos;9task_addr=(INT32U)task&~1;10*(stk)=(INT32U)task_addr;4.1.4初始化任務(wù)堆棧函數(shù)OSTaskStkInit11*(--stk)=(INT32U)0x14141414L;12*(--stk)=(INT32U)0x12121212L;13*(--stk)=(INT32U)0x11111111L;14*(--stk)=(INT32U)0x10101010L;15*(--stk)=(INT32U)0x09090909L;16*(--stk)=(INT32U)0x08080808L;17*(--stk)=(INT32U)0x07070707L;18*(--stk)=(INT32U)0x06060606L;19*(--stk)=(INT32U)0x05050505L;20*(--stk)=(INT32U)0x04040404L;

21*(--stk)=(INT32U)0x03030303L;22*(--stk)=(INT32U)0x02020202L;23*(--stk)=(INT32U)0x01010101L;24*(--stk)=(INT32U)p_arg;25if((INT32U)task&0x01){26*(--stk)=(INT32U)ARM_SVC_MODE_THUMB;27}else{28*(--stk)=(INT32U)ARM_SVC_MODE_ARM29}3031return(stk);32}1INT8UOS_TCBInit(INT8Uprio,OS_STK*ptos,OS_STK*pbos,INT16Uid,INT32Ustk_size,void*pext,INT16Uopt)2{3OS_TCB*ptcb;4#ifOS_CRITICAL_METHOD==35OS_CPU_SRcpu_sr=0;6#endif78910OS_ENTER_CRITICAL();4.1.5初始化任務(wù)控制塊函數(shù)OS_TCBInit11ptcb=OSTCBFreeList;12if(ptcb!=(OS_TCB*)0){13OSTCBFreeList=ptcb->OSTCBNext;14OS_EXIT_CRITICAL();15ptcb->OSTCBStkPtr=ptos;16ptcb->OSTCBPrio=prio;17ptcb->OSTCBStat=OS_STAT_RDY;18ptcb->OSTCBStatPend=OS_STAT_PEND_OK;19ptcb->OSTCBDly=0;2021#ifOS_TASK_CREATE_EXT_EN>022ptcb->OSTCBExtPtr=pext;23ptcb->OSTCBStkSize=stk_size;24ptcb->OSTCBStkBottom=pbos;25ptcb->OSTCBOpt=opt;26ptcb->OSTCBId=id;27#else28pext=pext;29stk_size=stk_size;30pbos=pbos;31opt=opt;32id=id;33#endif3435#ifOS_TASK_DEL_EN>036ptcb->OSTCBDelReq=OS_ERR_NONE;37#endif3839#ifOS_LOWEST_PRIO<=6340ptcb->OSTCBY=(INT8U)(prio>>3);41ptcb->OSTCBX=(INT8U)(prio&0x07);42ptcb->OSTCBBitY=(INT8U)(1<<ptcb->OSTCBY);43ptcb->OSTCBBitX=(INT8U)(1<<ptcb->OSTCBX);44#else45ptcb->OSTCBY=(INT8U)((prio>>4)&0xFF);46ptcb->OSTCBX=(INT8U)(prio&0x0F);47ptcb->OSTCBBitY=(INT16U)(1<<ptcb->OSTCBY);48ptcb->OSTCBBitX=(INT16U)(1<<ptcb->OSTCBX);49#endif5051#if(OS_EVENT_EN)52ptcb->OSTCBEventPtr=(OS_EVENT*)0;53#if(OS_EVENT_MULTI_EN>0)54ptcb->OSTCBEventMultiPtr=(OS_EVENT**)0;55#endif56#endif5758#if(OS_FLAG_EN>0)&&(OS_MAX_FLAGS>0)&&(OS_TASK_DEL_EN>0)59ptcb->OSTCBFlagNode=(OS_FLAG_NODE*)0;60#endif6162#if(OS_MBOX_EN>0)||((OS_Q_EN>0)&&(OS_MAX_QS>0))63ptcb->OSTCBMsg=(void*)0;64#endif6566#ifOS_TASK_PROFILE_EN>067ptcb->OSTCBCtxSwCtr=0L;/*Initializeprofilingvariables*/68ptcb->OSTCBCyclesStart=0L;69ptcb->OSTCBCyclesTot=0L;70ptcb->OSTCBStkBase=(OS_STK*)0;71ptcb->OSTCBStkUsed=0L;72#endif7374#ifOS_TASK_NAME_SIZE>175ptcb->OSTCBTaskName[0]='?';/*Unknownnameattaskcreation*/76ptcb->OSTCBTaskName[1]=OS_ASCII_NUL;77#endif7879OSTCBInitHook(ptcb);8081OSTaskCreateHook(ptcb);8283OS_ENTER_CRITICAL();84OSTCBPrioTbl[prio]=ptcb;85ptcb->OSTCBNext=OSTCBList;86ptcb->OSTCBPrev=(OS_TCB*)0;87if(OSTCBList!=(OS_TCB*)0){88OSTCBList->OSTCBPrev=ptcb;89}90OSTCBList=ptcb;91OSRdyGrp|=ptcb->OSTCBBitY;92OSRdyTbl[ptcb->OSTCBY]|=ptcb->OSTCBBitX;93OSTaskCtr++;94OS_EXIT_CRITICAL();95return(OS_ERR_NONE);96}97OS_EXIT_CRITICAL();98return(OS_ERR_TASK_NO_MORE_TCB);99}1#ifOS_TASK_CREATE_EXT_EN>02INT8UOSTaskCreateExt(void(*task)(void*p_arg),3void*p_arg,4OS_STK*ptos,5INT8Uprio,6INT16Uid,7OS_STK*pbos,8INT32Ustk_size,9void*pext,10INT16Uopt)4.1.6函數(shù)OSTaskCreateExt11{12OS_STK*psp;13INT8Uerr;14#ifOS_CRITICAL_METHOD==315OS_CPU_SRcpu_sr=0;16#endif17181920#ifOS_ARG_CHK_EN>021if(prio>OS_LOWEST_PRIO){22return(OS_ERR_PRIO_INVALID);23}24#endif25OS_ENTER_CRITICAL();26if(OSIntNesting>0){27OS_EXIT_CRITICAL();28return(OS_ERR_TASK_CREATE_ISR);29}30if(OSTCBPrioTbl[prio]==(OS_TCB*)0){31OSTCBPrioTbl[prio]=OS_TCB_RESERVED;3233OS_EXIT_CRITICAL();3435#if(OS_TASK_STAT_STK_CHK_EN>0)36OS_TaskStkClr(pbos,stk_size,opt);37#endif3839psp=OSTaskStkInit(task,p_arg,ptos,opt);40err=OS_TCBInit(prio,psp,pbos,id,stk_size,pext,opt);41if(err==OS_ERR_NONE){42if(OSRunning==OS_TRUE){43OS_Sched();44}45}else{46OS_ENTER_CRITICAL();47OSTCBPrioTbl[prio]=(OS_TCB*)0;48OS_EXIT_CRITICAL();49}50return(err);51}52OS_EXIT_CRITICAL();53return(OS_ERR_PRIO_EXIST);54}55#endif4.1.7OS_TaskStkClr函數(shù)1#if(OS_TASK_STAT_STK_CHK_EN>0)&&(OS_TASK_CREATE_EXT_EN>0)2voidOS_TaskStkClr(OS_STK*pbos,INT32Usize,INT16Uopt)3{4if((opt&OS_TASK_OPT_STK_CHK)!=0x0000){5if((opt&OS_TASK_OPT_STK_CLR)!=0x0000){6#ifOS_STK_GROWTH==17while(size>0){8size--;9*pbos++=(OS_STK)0;10}11#else12while(size>0){13size--;14*pbos--=(OS_STK)0;15}16#endif17}18}19}20#endif4.1.8刪除任務(wù)任務(wù)創(chuàng)建后,只有調(diào)用任務(wù)刪除函數(shù)OSTaskDel才能使任務(wù)進(jìn)入休眠態(tài),任務(wù)進(jìn)入休眠態(tài)說(shuō)明任務(wù)不再被調(diào)度器調(diào)度,但是任務(wù)的函數(shù)體仍然駐留在內(nèi)存中。任務(wù)創(chuàng)建后,將按一定的規(guī)律無(wú)限重復(fù)地執(zhí)行,如果想創(chuàng)建只執(zhí)行一次就退出的任務(wù),可在任務(wù)函數(shù)體無(wú)限循環(huán)中加入OSTaskDel函數(shù)。1#ifOS_TASK_DEL_EN>02INT8UOSTaskDel(INT8Uprio)3{4#if(OS_FLAG_EN>0)&&(OS_MAX_FLAGS>0)5OS_FLAG_NODE*pnode;6#endif7OS_TCB*ptcb;8#ifOS_CRITICAL_METHOD==39OS_CPU_SRcpu_sr=0;10#endif4.1.9OSTaskDel函數(shù)1112if(OSIntNesting>0){13return(OS_ERR_TASK_DEL_ISR);14}15if(prio==OS_TASK_IDLE_PRIO){16return(OS_ERR_TASK_DEL_IDLE);17}18#ifOS_ARG_CHK_EN>019if(prio>=OS_LOWEST_PRIO){20if(prio!=OS_PRIO_SELF){21return(OS_ERR_PRIO_INVALID);22}23}24#endif2526OS_ENTER_CRITICAL();27if(prio==OS_PRIO_SELF){28prio=OSTCBCur->OSTCBPrio;29}30ptcb=OSTCBPrioTbl[prio];31if(ptcb==(OS_TCB*)0){32OS_EXIT_CRITICAL();33return(OS_ERR_TASK_NOT_EXIST);34}35if(ptcb==OS_TCB_RESERVED){36OS_EXIT_CRITICAL();37return(OS_ERR_TASK_DEL);38}3940OSRdyTbl[ptcb->OSTCBY]&=~ptcb->OSTCBBitX;41if(OSRdyTbl[ptcb->OSTCBY]==0){42OSRdyGrp&=~ptcb->OSTCBBitY;43}4445#if(OS_EVENT_EN)46if(ptcb->OSTCBEventPtr!=(OS_EVENT*)0){47OS_EventTaskRemove(ptcb,ptcb->OSTCBEventPtr);48}49#if(OS_EVENT_MULTI_EN>0)50if(ptcb->OSTCBEventMultiPtr!=(OS_EVENT**)0){51OS_EventTaskRemoveMulti(ptcb,ptcb->OSTCBEventMultiPtr);52}53#endif#endif5556#if(OS_FLAG_EN>0)&&(OS_MAX_FLAGS>0)57pnode=ptcb->OSTCBFlagNode;58if(pnode!=(OS_FLAG_NODE*)0){59OS_FlagUnlink(pnode);60}61#endif6263ptcb->OSTCBDly=0;64ptcb->OSTCBStat=OS_STAT_RDY;65ptcb->OSTCBStatPend=OS_STAT_PEND_OK;66if(OSLockNesting<255u){67OSLockNesting++;68}69OS_EXIT_CRITICAL();70OS_Dummy();71OS_ENTER_CRITICAL();72if(OSLockNesting>0){73OSLockNesting--;74}75OSTaskDelHook(ptcb);76OSTaskCtr--;77OSTCBPrioTbl[prio]=(OS_TCB*)0;78if(ptcb->OSTCBPrev==(OS_TCB*)0){79ptcb->OSTCBNext->OSTCBPrev=(OS_TCB*)0;80OSTCBList=ptcb->OSTCBNext;81}else{82ptcb->OSTCBPrev->OSTCBNext=ptcb->OSTCBNext;83ptcb->OSTCBNext->OSTCBPrev=ptcb->OSTCBPrev;84}85ptcb->OSTCBNext=OSTCBFreeList;86OSTCBFreeList=ptcb;87#ifOS_TASK_NAME_SIZE>188ptcb->OSTCBTaskName[0]='?';89ptcb->OSTCBTaskName[1]=OS_ASCII_NUL;90#endif91OS_EXIT_CRITICAL();92if(OSRunning==OS_TRUE){93OS_Sched();94}95return(OS_ERR_NONE);96}97#endif堆棧檢查函數(shù)用于檢查堆棧中未使用的空間和已使用的空間的大小。4.1.10堆棧檢查#ifOS_TASK_CREATE_EXT_EN>0typedefstructos_stk_data{INT32UOSFree;INT32UOSUsed;}OS_STK_DATA;#endif1#if(OS_TASK_STAT_STK_CHK_EN>0)&&(OS_TASK_CREATE_EXT_EN>0)2INT8UOSTaskStkChk(INT8Uprio,OS_STK_DATA*p_stk_data)3{4OS_TCB*ptcb;5OS_STK*pchk;6INT32Unfree;7INT32Usize;8#ifOS_CRITICAL_METHOD==39OS_CPU_SRcpu_sr=0;10#endif4.1.11堆棧檢查函數(shù)OSTaskStkChk11121314#ifOS_ARG_CHK_EN>015if(prio>OS_LOWEST_PRIO){16if(prio!=OS_PRIO_SELF){17return(OS_ERR_PRIO_INVALID);18}19}20if(p_stk_data==(OS_STK_DATA*)0){21return(OS_ERR_PDATA_NULL);22}23#endif24p_stk_data->OSFree=0;25p_stk_data->OSUsed=0;26OS_ENTER_CRITICAL();27if(prio==OS_PRIO_SELF){28prio=OSTCBCur->OSTCBPrio;29}30ptcb=OSTCBPrioTbl[prio];31if(ptcb==(OS_TCB*)0){32OS_EXIT_CRITICAL();33return(OS_ERR_TASK_NOT_EXIST);34}35if(ptcb==OS_TCB_RESERVED){36OS_EXIT_CRITICAL();37return(OS_ERR_TASK_NOT_EXIST);38}39if((ptcb->OSTCBOpt&OS_TASK_OPT_STK_CHK)==0){40OS_EXIT_CRITICAL();41return(OS_ERR_TASK_OPT);42}43nfree=0;44size=ptcb->OSTCBStkSize;45pchk=ptcb->OSTCBStkBottom;46OS_EXIT_CRITICAL();47#ifOS_STK_GROWTH==148while(*pchk++==(OS_STK)0){49nfree++;50}51#else52while(*pchk--==(OS_STK)0){53nfree++;54}55#endif56p_stk_data->OSFree=nfree*sizeof(OS_STK);57p_stk_data->OSUsed=(size-nfree)*sizeof(OS_STK);58return(OS_ERR_NONE);59}60#endif信號(hào)量本質(zhì)上是一個(gè)全局計(jì)數(shù)器的實(shí)現(xiàn)機(jī)制,釋放信號(hào)量的任務(wù)使得該計(jì)數(shù)器的值加1,請(qǐng)求到信號(hào)量的任務(wù)使該計(jì)數(shù)器的值減1,如果計(jì)數(shù)器的值為0,則請(qǐng)求該信號(hào)量的任務(wù)將掛起等待,直到別的任務(wù)釋放該信號(hào)量。通過(guò)這種方式,使得釋放信號(hào)量的任務(wù)可以控制請(qǐng)求信號(hào)量的任務(wù)的運(yùn)行。4.2信號(hào)量管理4.2.1信號(hào)量管理函數(shù)OS_EVENT*OSSemCreate(INT16Ucnt);voidOSSemPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err);INT8UOSSemPost(OS_EVENT*pevent);OS_EVENT*OSSemDel(OS_EVENT*pevent,INT8Uopt,INT8U*perr);INT8UOSSemQuery(OS_EVENT*pevent,OS_SEM_DATA*p_sem_data);INT8UOSSemPendAbort(OS_EVENT*pevent,INT8Uopt,INT8U*err);voidOSSemSet(OS_EVENT*pevent,INT16Ucnt,INT8U*perr);INT16UOSSemAccept(OS_EVENT*pevent);一、定義事件指針:例如“OS_EVENT*LedSem;”,這里L(fēng)edSem為一個(gè)事件指針。二、調(diào)用OSSemCreate函數(shù)創(chuàng)建信號(hào)量:例如“LedSem=OSSemCreate(0);”,此時(shí)LedSem被裝入一個(gè)信號(hào)量,初始計(jì)數(shù)值為0。三、在一個(gè)任務(wù)中周期性地釋放該信號(hào)量:例如“OSSemPost(LedSem);”。四、在另一個(gè)任務(wù)中請(qǐng)求該信號(hào)量:例如“OSSemPend(LedSem,0,&err);”。4.2.2信號(hào)量使用方法1OS_EVENT*OSSemCreate(INT16Ucnt)2{3OS_EVENT*pevent;4#ifOS_CRITICAL_METHOD==35OS_CPU_SRcpu_sr=0;6#endif78910if(OSIntNesting>0){4.2.3信號(hào)量創(chuàng)建函數(shù)11return((OS_EVENT*)0);12}13OS_ENTER_CRITICAL();14pevent=OSEventFreeList;15if(OSEventFreeList!=(OS_EVENT*)0){16OSEventFreeList=(OS_EVENT*)OSEventFreeList->OSEventPtr;17}18OS_EXIT_CRITICAL();19if(pevent!=(OS_EVENT*)0){20pevent->OSEventType=OS_EVENT_TYPE_SEM;21pevent->OSEventCnt=cnt;22pevent->OSEventPtr=(void*)0;23#ifOS_EVENT_NAME_SIZE>124pevent->OSEventName[0]='?';25pevent->OSEventName[1]=OS_ASCII_NUL;26#endif27OS_EventWaitListInit(pevent);28}29return(pevent);30}4.2.4初始化事件等待表函數(shù)OS_EventWaitListInit1#if(OS_EVENT_EN)2voidOS_EventWaitListInit(OS_EVENT*pevent)3{4#ifOS_LOWEST_PRIO<=635INT8U*ptbl;6#else7INT16U*ptbl;8#endif9INT8Ui;101112pevent->OSEventGrp=0;13ptbl=&pevent->OSEventTbl[0];1415for(i=0;i<OS_EVENT_TBL_SIZE;i++){16*ptbl++=0;17}18}19#endif1voidOSSemPend(OS_EVENT*pevent,INT16Utimeout,INT8U*perr)2{3#ifOS_CRITICAL_METHOD==34OS_CPU_SRcpu_sr=0;5#endif6789#ifOS_ARG_CHK_EN>010if(perr==(INT8U*)0){4.2.5信號(hào)量請(qǐng)求函數(shù)OSSemPend11return;12}13if(pevent==(OS_EVENT*)0){14*perr=OS_ERR_PEVENT_NULL;15return;16}17#endif18if(pevent->OSEventType!=OS_EVENT_TYPE_SEM){19*perr=OS_ERR_EVENT_TYPE;20return;21}22if(OSIntNesting>0){23*perr=OS_ERR_PEND_ISR;24return;25}26if(OSLockNesting>0){27*perr=OS_ERR_PEND_LOCKED;28return;29}30OS_ENTER_CRITICAL();31if(pevent->OSEventCnt>0){32pevent->OSEventCnt--;33OS_EXIT_CRITICAL();34*perr=OS_ERR_NONE;35return;36}3738OSTCBCur->OSTCBStat|=OS_STAT_SEM;39OSTCBCur->OSTCBStatPend=OS_STAT_PEND_OK;40OSTCBCur->OSTCBDly=timeout;41OS_EventTaskWait(pevent);42OS_EXIT_CRITICAL();43OS_Sched();44OS_ENTER_CRITICAL();45switch(OSTCBCur->OSTCBStatPend){46caseOS_STAT_PEND_OK:47*perr=OS_ERR_NONE;48break;4950caseOS_STAT_PEND_ABORT:51*perr=OS_ERR_PEND_ABORT;52break;5354caseOS_STAT_PEND_TO:55default:56OS_EventTaskRemove(OSTCBCur,pevent);57*perr=OS_ERR_TIMEOUT;58break;59}60OSTCBCur->OSTCBStat=OS_STAT_RDY;61OSTCBCur->OSTCBStatPend=OS_STAT_PEND_OK;62OSTCBCur->OSTCBEventPtr=(OS_EVENT*)0;63#if(OS_EVENT_MULTI_EN>0)64OSTCBCur->OSTCBEventMultiPtr=(OS_EVENT**)0;65#endif66OS_EXIT_CRITICAL();67}4.2.6OS_EventTaskWait函數(shù)1#if(OS_EVENT_EN)2voidOS_EventTaskWait(OS_EVENT*pevent)3{4INT8Uy;567OSTCBCur->OSTCBEventPtr=pevent;89pevent->OSEventTbl[OSTCBCur->OSTCBY]|=OSTCBCur->OSTCBBitX;10pevent->OSEventGrp|=OSTCBCur->OSTCBBitY;1112y=OSTCBCur->OSTCBY;13OSRdyTbl[y]&=~OSTCBCur->OSTCBBitX;14if(OSRdyTbl[y]==0){15OSRdyGrp&=~OSTCBCur->OSTCBBitY;16}17}18#endif4.2.7OS_EventTaskRemove函數(shù)1#if(OS_EVENT_EN)2voidOS_EventTaskRemove(OS_TCB*ptcb,3OS_EVENT*pevent)4{5INT8Uy;67y=ptcb->OSTCBY;8pevent->OSEventTbl[y]&=~ptcb->OSTCBBitX;9if(pevent->OSEventTbl[y]==0){10pevent->OSEventGrp&=~ptcb->OSTCBBitY;11}12}13#endif4.2.8信號(hào)量釋放函數(shù)OSSemPost1INT8UOSSemPost(OS_EVENT*pevent)2{3#ifOS_CRITICAL_METHOD==34OS_CPU_SRcpu_sr=0;5#endif67#ifOS_ARG_CHK_EN>08if(pevent==(OS_EVENT*)0){9return(OS_ERR_PEVENT_NULL);10}11#endif12if(pevent->OSEventType!=OS_EVENT_TYPE_SEM){13return(OS_ERR_EVENT_TYPE);14}15OS_ENTER_CRITICAL();16if(pevent->OSEventGrp!=0){1718(void)OS_EventTaskRdy(pevent,(void*)0,OS_STAT_SEM,OS_STAT_PEND_OK);19OS_EXIT_CRITICAL();20OS_Sched();21return(OS_ERR_NONE);22}23if(pevent->OSEventCnt<65535u){24pevent->OSEventCnt++;25OS_EXIT_CRITICAL();26return(OS_ERR_NONE);27}28OS_EXIT_CRITICAL();29return(OS_ERR_SEM_OVF);30}4.2.9OS_EventTaskRdy函數(shù)1#if(OS_EVENT_EN)2INT8UOS_EventTaskRdy(OS_EVENT*pevent,void*pmsg,INT8Umsk,INT8Upend_stat)3{4OS_TCB*ptcb;5INT8Uy;6INT8Ux;7INT8Uprio;8#ifOS_LOWEST_PRIO>639INT16U*ptbl;10#endif111213#ifOS_LOWEST_PRIO<=6314y=OSUnMapTbl[pevent->OSEventGrp];15x=OSUnMapTbl[pevent->OSEventTbl[y]];16prio=(INT8U)((y<<3)+x);17#else18if((pevent->OSEventGrp&0xFF)!=0){19y=OSUnMapTbl[pevent->OSEventGrp&0xFF];20}else{21y=OSUnMapTbl[(pevent->OSEventGrp>>8)&0xFF]+8;22}23ptbl=&pevent->OSEventTbl[y];24if((*ptbl&0xFF)!=0){25x=OSUnMapTbl[*ptbl&0xFF];26}else{27x=OSUnMapTbl[(*ptbl>>8)&0xFF]+8;28}

溫馨提示

  • 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)論