




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
任務管理信號量管理互斥信號量管理事件標志組管理消息郵箱管理消息隊列管理多事件請求管理中斷管理宏函數定時器管理動態內存管理……μC/OS-II組件什么是μC/OS-II組件?μC/OS-II組件是指μC/OS-II操作系統向用戶應用程序提供的服務,主要有任務管理、信號量管理、互斥信號量管理、事件標志組管理、消息郵箱管理、消息隊列管理、多事件請求管理、中斷管理、定時器管理、內存管理等,每種服務都包括一些系統函數。4.1任務管理任務管理類函數位于os_task.c文件中,用于實現任務創建、刪除、掛起、恢復、改變任務優先級、查詢任務信息、查詢任務堆棧信息、設置任務名或查詢任務名等操作。這里主要講述OSTaskCreate、OSTaskCreateExt、OSTaskDel和OSTaskStkChk函數的工作原理。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任務管理函數(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系統中有二種創建任務的函數,即OSTaskCreate和OSTaskCreateExt。4.1.2創建任務的步驟一、編寫一個帶有無限循環的函數,由于具有無限循環,故函數沒有返回值。該函數具有一個void*類型的指針,該指針可以指向任何類型的數據,通過該指針在任務創建時向任務傳遞一些數據,這種傳遞只能發生一次,一旦任務開始工作,就無法通過函數參數向任務傳遞數據了。程序段S4-1任務的函數體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}二、為要創建的任務指定優先級號,每個任務都有唯一的優先級號,取值范圍從0至OS_LOWEST_PRIO(為文件os_cfg.h中的宏定義常量,最大為254),一般地,用戶任務優先級從4至OS_LOWEST_PRIO-4。三、為要創建的任務定義堆棧,必須使用OS_STK類型定義堆棧例如
OS_STKAppTask_1_Stk[200]四、
最后,調用OSTaskCreate或OSTaskCreateExt函數創建任務。例如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函數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初始化任務堆棧函數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初始化任務控制塊函數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函數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函數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刪除任務任務創建后,只有調用任務刪除函數OSTaskDel才能使任務進入休眠態,任務進入休眠態說明任務不再被調度器調度,但是任務的函數體仍然駐留在內存中。任務創建后,將按一定的規律無限重復地執行,如果想創建只執行一次就退出的任務,可在任務函數體無限循環中加入OSTaskDel函數。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函數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堆棧檢查函數用于檢查堆棧中未使用的空間和已使用的空間的大小。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堆棧檢查函數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信號量本質上是一個全局計數器的實現機制,釋放信號量的任務使得該計數器的值加1,請求到信號量的任務使該計數器的值減1,如果計數器的值為0,則請求該信號量的任務將掛起等待,直到別的任務釋放該信號量。通過這種方式,使得釋放信號量的任務可以控制請求信號量的任務的運行。4.2信號量管理4.2.1信號量管理函數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;”,這里LedSem為一個事件指針。二、調用OSSemCreate函數創建信號量:例如“LedSem=OSSemCreate(0);”,此時LedSem被裝入一個信號量,初始計數值為0。三、在一個任務中周期性地釋放該信號量:例如“OSSemPost(LedSem);”。四、在另一個任務中請求該信號量:例如“OSSemPend(LedSem,0,&err);”。4.2.2信號量使用方法1OS_EVENT*OSSemCreate(INT16Ucnt)2{3OS_EVENT*pevent;4#ifOS_CRITICAL_METHOD==35OS_CPU_SRcpu_sr=0;6#endif78910if(OSIntNesting>0){4.2.3信號量創建函數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初始化事件等待表函數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信號量請求函數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函數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函數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信號量釋放函數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函數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. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 六年級下冊綜合與實踐總結模版
- 班會教學設計
- 班級民間游戲活動方案
- 水果種植銷售合作協議書
- 演出道具出租合同范本
- 中國農業大學對口協議書
- 兄弟三人共建車庫協議書
- 委托紅酒銷售合同范本
- 青島起重機租賃協議書
- 國有工業土地轉讓協議書
- 初三中考宣誓誓詞82060
- 觸電事故桌面推演方案
- 護理風險評估及填寫要求
- 《中興通訊績效管理制度》-人事制度表格【管理資料】
- 微邦生物技術生活污水處理中的應用
- 鐵路工務技術手冊
- (完整版)硬件測試規范
- 2006年工資標準及套改對應表
- DBJ∕T 13-183-2014 基樁豎向承載力自平衡法靜載試驗技術規程
- 張雙樓煤礦安全評價報告(出版稿10.14)
- [模板]健康教育處方
評論
0/150
提交評論