资源描述
第一章 操作系统的基本概念,*,*,*,嵌入式操作系统基础 第九章 任务的同步与通信,第九章 任务的同步与通信,任务间的同步和事件控制块,信号量及其操作,任务优先级反转和互斥型信号量,消息邮箱及其操作,消息队列及其操作,1,第九章 任务的同步与通信,一、任务间的同步,鉴于任务间直接制约或间接制约性的关系,这种制约性的合作运行机制叫做任务的,同步,。,二、事件,用于,uC,/OS-II,任务间通信媒介的,信号量,、,邮箱,和,消息队列,等数据结构会影响到任务的程序流程,这些通信媒介又被称为事件(,Events,)。,9.1,任务间的同步和事件控制块,2,1.,信号量,互斥型信号量:,通常表现为一个二值型信号,用一位二进制位来表示(,1/0,),可以实现共享资源的独占式占用。,信号量:,通常表现为一个递减的计数器信号,可以实现若干个同类资源的共享,提高资源使用效率。,3,2.,消息邮箱,指向保存任务间传递信息的存储空间,(,缓存区,),的指针结构称为,消息邮箱,。,4,3.,消息队列,若消息邮箱被定义成拥有若干个元素的数组,用来传递多个消息的地址指针,这样消息的数据结构称为,消息队列,。,4.,事件的等待任务队列,两个功能:,对等待事件的所有记录进行登记并排序,允许任务有一定的等待时间,5,6,三,、事件控制块,事件控制块的结构,OSEventPtr,指针,只有在所定义的事件是邮箱或者消息队列时才使用。当所定义的事件是邮箱时,它指向一个消息,而当所定义的事件是消息队列时,它指向一个数据结构。,typedef,struct,void *,OSEventPtr,;/*,指向消息或者消息队列的指针*,/,INT8U,OSEventTblOS_EVENT_TBL_SIZE,;/*,等待任务列表 *,/,INT16U,OSEventCnt,;/*,计数器,(,当事件是信号量时,)*/,INT8U,OSEventType,;/*,事件类型 *,/,INT8U,OSEventGrp,;/*,等待任务所在的组 *,/,OS_EVENT;,7,.,OSEventTbl,/,.,OSEventGrp,与前面提过的,OSRdyTbl,和,OSRdyGrp,非常相像,,只不过前两者包含的是等待某事件的任务,而后两者包含的是系统中处于就绪状态的任务。,.,OSEventCnt,:,当事件是一个信号量时,,.,OSEventCnt,是用于信号量的计数器。,.,OSEventType,:,定义了事件的具体类型。它可以是信号量,(,OS_EVENT_SEM,),、邮箱,(,OS_EVENT_TYPE_MBOX,),或消息队列,(,OS_EVENT_TYPE_Q,),中的一种。用户要根据该域的具体值来调用相应的系统函数,以保证对其进行的操作的正确性。,8,四,、事件控制块,的基本操作函数,1.,事件控制块的初始话函数,函数作用:,把变量,OSEventGrp,及任务等待表中的每一位都清,0,,即令事件的任务等代表中不含有任何等待任务。,void,OSEventWaitListInit,(OS_EVENT*,pevent,),INT8U i;,pevent,-,OSEventGrp,=0 x00;,for(i=0;i,OSEventTbli,=0 x00;,9,2.,使一个任务进入等待状态的函数,当一个任务在请求一个事件而不能获得时,应把次任务登记在时间的等待任务列表中,并把任务控制块中的任务状态置为等待状态和吧任务置为非就绪任务,void,OSEventTaskWait,(OS_EVENT*,pevent,),OSTCBCur,-,OSTCBEventPtr,=,pevent,;(1),if(,OSRdyTblOSTCBCur,-OSTCBY&=,OSTCBCur,-,OSTCBBitX,)=0)(2),OSRdyGrp,&=,OSTCBCur,-,OSTCBBitY,;,pevent,-,OSEventTblOSTCBCur,-OSTCBY|=,OSTCBCur,-,OSTCBBitX,;(3),pevent,-,OSEventGrp,|=,OSTCBCur,-,OSTCBBitY,;,10,3.,正在等待的任务进入就绪状态,当一个正在等待的任务具备了可以运行的条件,这时需调用此函数来使它进入就绪状态。该函数的作用就是把调用这个函数的任务在任务等待表中的位置清,O,后,再把任务子啊任务就绪表中的对应位置,1,,然后引起一次任务调度。,void,OSEventTaskRdy,(OS_EVENT*,pevent,void*,msg,INT8U,msk,),OS_TCB*,ptcb,;,INT8U x;,INT8U y;,INT8U,bitx,;,INT8U,bity,;,INT8U,prio,;,11,4.,等待超时的任务转为就绪态,正在等待事件的任务在预先指定的时间内仍然没有获取事件,这时需调用此函数来转换的它的状态。,void,OSEventTO,(OS_EVENT*,pevent,),if(,pevent,-,OSEventTblOSTCBCur,-OSTCBY&=,OSTCBCur,-,OSTCBBitX,)=0)(1),pevent,-,OSEventGrp,&=,OSTCBCur,-,OSTCBBitY,;,OSTCBCur,-,OSTCBStat,=OS_STAT_RDY;(2),OSTCBCur,-,OSTCBEventPtr,=(OS_EVENT*)0;(3),12,五,、空事件控制块,的的组织,和任务控制块的组织结构类似:所有的事件控制块也被组织成两个链表,当系统初始化时,通过控制块指针,OSEventPtr,把所有的空时间控制块链接成一个空事件控制块链表。,13,9.1,信号量及其操作,一,、信号量,由,16,位的无符号整数(,0,到,65,535,之间)构成的信号量计数器和任务等待表两部分组成。计数器决定共享资源的任务数。,14,二、信号量的操作,1.,信号量的创建,:,信号量一旦,建立就不能删,除了,因此也,就不可能将一,个已分配的任,务控制块再放,回到空闲,ECB,链表中。,OS_EVENT*,OSSemCreate,(INT16U,cnt,),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),信号量创建,15,2.,等待一个信号量,OSSemPend()/OSSemAccept,(),void OSSemPend(OS_EVENT*pevent,/信号量指针,INT16U timeout,/等待时限,INT8U*err);/错误信息,INT16U OSSEMAccept(,OS_EVENT*PEVENT/信号量指针,),3.,发送一个信号量,OSSemPost,(),任务获得信号量,并在访问共享资源结束以后,必须释放信号量,此过程需调用函数,OSSemPost,(),完成。,16,INT8U,OSSemPost,(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,OSEventCnt,+;(5),OS_EXIT_CRITICAL();,return(OS_NO_ERR);,else,OS_EXIT_CRITICAL();,return(OS_SEM_OVF);,17,3.,发送一个信号量,OSSemPost,(),OS_EVENT*,OSSemDel,(,OS_EVENT*,pevent,INT8U opt,INT8U*err,);,3.,信号量状态查询,OSSemQuery,(),INT8U,OSSemQuery,(,OS_EVENT*,pevent,OS_SEM_DATA*,pdata,);,Typedef,struct,INT16U,OSCnt,;,INTU8U OSEventb1OS_EVENT_SIZE;,INT8U,OSEventGrp,;,OS_SEM_DATA;,18,9.3,任务优先级反转和互斥型信号量,一、任务优先级的反转现象,在可剥夺型内核中,当任务以独占方式使用共享资源时,会出现低优先级任务先于高优先级任务而被运行的现象,这种现象就成为任务优先级反转。,19,void,TaskA(void,),SetTaskPriority(RES_X_PRIO,);,/,访问共享资源,X,SetTaskPriority(TASK_A_PRIO,);,形成原因:,使用信号量的任务是否能够运行时受任务的优先级别以及是否占用信号量两个条件约束的,而信号量的约束高于优先级别的约束。,解决方案:,一旦获取信号量的任务投入运行,其将暂用最高优先级别,直至任务执行完成。,20,二、,互斥型信号量,实现对共享资源的独占式处理。,解决任务的优先级反转:变量,OSEventPtr,占,16,位,低,8,位作为信号量有效性的判断位;高,8,位则存放任务运行后临时暂用的优先级别。,21,1.,互斥型信号量的创建,OS_EVENT*,OSMutexCreate,(,INT8U,prio,INT8U*err,);,2.,请求互斥型信号量:,OSMutexPend()/OSMutexAccept,(),OS_EVENT*,OSMutexPend,(,OS_EVENT*,pevent,INT16U Timeout,INT8U*err,);,22,3.,发送互斥型信号量,INT8U,OSMutexQuery,(,OS_EVENT*,pevent,);,4.,查询互斥型信号量的当前状态,OS_EVENT*,OSMutexPend,(,OS_EVENT*,pevent,OS_MUTEX_DATA*,pdata,);,Typedef,struct,INT8U,OSValue,;,INTU8U OSEvenTb1OS_EVENT_SIZE;,INT8U,OSEventGrp,;,INT8U,OSOwnerPrio,;,INT8U,OSMutexPIP,;,OS_MUTEX_DATA;,23,5.,删除,互斥型信号量,OS_EVENT*,OSMutexPend,(,OS_EVENT*,pevent,INT8U opt,INT8U*err,);,24,9.4,消息邮箱及其操作,一、,消息邮箱,任务与任务间要传递一个数据,为了适应不同数据的需要,最好在存储中建立一个数据缓冲区,把要传递的数据放在该缓冲区中,从而实现任务间的数据通信。,25,二、,消息邮箱的操作,OS_EVENT*,OSMboxCreate,(void*,msg,),OS_EVENT*,pevent,;,OS_ENTER_CR
展开阅读全文