![《嵌入式操作系统原理与面向任务程序设计》课件第四讲M_第1页](http://file4.renrendoc.com/view9/M03/2C/01/wKhkGWdlDbmAWQ92AASH3UPFMFA503.jpg)
![《嵌入式操作系统原理与面向任务程序设计》课件第四讲M_第2页](http://file4.renrendoc.com/view9/M03/2C/01/wKhkGWdlDbmAWQ92AASH3UPFMFA5032.jpg)
![《嵌入式操作系统原理与面向任务程序设计》课件第四讲M_第3页](http://file4.renrendoc.com/view9/M03/2C/01/wKhkGWdlDbmAWQ92AASH3UPFMFA5033.jpg)
![《嵌入式操作系统原理与面向任务程序设计》课件第四讲M_第4页](http://file4.renrendoc.com/view9/M03/2C/01/wKhkGWdlDbmAWQ92AASH3UPFMFA5034.jpg)
![《嵌入式操作系统原理与面向任务程序设计》课件第四讲M_第5页](http://file4.renrendoc.com/view9/M03/2C/01/wKhkGWdlDbmAWQ92AASH3UPFMFA5035.jpg)
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
任务管理信号量管理互斥信号量管理事件标志组管理消息邮箱管理消息队列管理多事件请求管理中断管理宏函数定时器管理动态内存管理……µ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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 科技创新企业如何构建高效的营销团队
- 《少年闰土》教学设计与反思
- 2025年租赁合同提前解除市场影响
- 二级建造师合作合同样本
- 互助市场拓展合作合同书
- 二手房屋购买合同诚意金约定
- 个人质押与抵押合同
- XX公司员工培训合同协议
- 产品设计与研发合作合同范例
- 个人借款合同格式样本
- 2024年泰州职业技术学院高职单招数学历年参考题库含答案解析
- 楼梯 栏杆 栏板(一)22J403-1
- 学生综合素质评定与职业规划的关联性分析
- 特殊家长课后沟通技巧培训
- 【MOOC】数字摄影技术与艺术-西南石油大学 中国大学慕课MOOC答案
- 2025检验检测中心年度工作总结及工作计划
- PEP人教版小学英语六年级下册单词表(含音标)
- 一起重新构想我们的未来:为教育打造新的社会契约
- GB/T 4214.2-2020家用和类似用途电器噪声测试方法真空吸尘器的特殊要求
- GB/T 22482-2008水文情报预报规范
- 蔬菜采购项目投标书
评论
0/150
提交评论