嵌入式操作系统教程-第九章

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

嵌入式操作系统基础第九章任务的同步与通信1第九章任务的同步与通信任务间的同步和事件控制块信号量及其操作任务优先级反转和互斥型信号量消息邮箱及其操作消息队列及其操作嵌入式操作系统基础第九章任务的同步与通信2第九章任务的同步与通信一、任务间的同步鉴于任务间直接制约或间接制约性的关系,这种制约性的合作运行机制叫做任务的同步。二、事件用于uC/OS-II任务间通信媒介的信号量、邮箱和消息队列等数据结构会影响到任务的程序流程,这些通信媒介又被称为事件(Events)。§9.1任务间的同步和事件控制块嵌入式操作系统基础第九章任务的同步与通信31.信号量互斥型信号量:通常表现为一个二值型信号,用一位二进制位来表示(1/0),可以实现共享资源的独占式占用。信号量:通常表现为一个递减的计数器信号,可以实现若干个同类资源的共享,提高资源使用效率。嵌入式操作系统基础第九章任务的同步与通信42.消息邮箱指向保存任务间传递信息的存储空间(缓存区)的指针结构称为消息邮箱。嵌入式操作系统基础第九章任务的同步与通信53.消息队列若消息邮箱被定义成拥有若干个元素的数组,用来传递多个消息的地址指针,这样消息的数据结构称为消息队列。4.事件的等待任务队列两个功能:对等待事件的所有记录进行登记并排序允许任务有一定的等待时间嵌入式操作系统基础第九章任务的同步与通信6嵌入式操作系统基础第九章任务的同步与通信7三、事件控制块事件控制块的结构OSEventPtr指针,只有在所定义的事件是邮箱或者消息队列时才使用。当所定义的事件是邮箱时,它指向一个消息,而当所定义的事件是消息队列时,它指向一个数据结构。typedefstruct{void*OSEventPtr;/*指向消息或者消息队列的指针*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任务列表*/INT16UOSEventCnt;/*计数器(当事件是信号量时)*/INT8UOSEventType;/*事件类型*/INT8UOSEventGrp;/*等待任务所在的组*/}OS_EVENT;嵌入式操作系统基础第九章任务的同步与通信8.OSEventTbl[]/.OSEventGrp与前面提过的OSRdyTbl[]和OSRdyGrp非常相像,只不过前两者包含的是等待某事件的任务,而后两者包含的是系统中处于就绪状态的任务。.OSEventCnt:当事件是一个信号量时,.OSEventCnt是用于信号量的计数器。.OSEventType:定义了事件的具体类型。它可以是信号量(OS_EVENT_SEM)、邮箱(OS_EVENT_TYPE_MBOX)或消息队列(OS_EVENT_TYPE_Q)中的一种。用户要根据该域的具体值来调用相应的系统函数,以保证对其进行的操作的正确性。嵌入式操作系统基础第九章任务的同步与通信9四、事件控制块的基本操作函数1.事件控制块的初始话函数函数作用:把变量OSEventGrp及任务等待表中的每一位都清0,即令事件的任务等代表中不含有任何等待任务。voidOSEventWaitListInit(OS_EVENT*pevent){INT8Ui;pevent-OSEventGrp=0x00;for(i=0;iOS_EVENT_TBL_SIZE;i++){pevent-OSEventTbl[i]=0x00;}}嵌入式操作系统基础第九章任务的同步与通信102.使一个任务进入等待状态的函数当一个任务在请求一个事件而不能获得时,应把次任务登记在时间的等待任务列表中,并把任务控制块中的任务状态置为等待状态和吧任务置为非就绪任务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;}嵌入式操作系统基础第九章任务的同步与通信113.正在等待的任务进入就绪状态当一个正在等待的任务具备了可以运行的条件,这时需调用此函数来使它进入就绪状态。该函数的作用就是把调用这个函数的任务在任务等待表中的位置清O后,再把任务子啊任务就绪表中的对应位置1,然后引起一次任务调度。voidOSEventTaskRdy(OS_EVENT*pevent,void*msg,INT8Umsk){OS_TCB*ptcb;INT8Ux;INT8Uy;INT8Ubitx;INT8Ubity;INT8Uprio;……}嵌入式操作系统基础第九章任务的同步与通信124.等待超时的任务转为就绪态正在等待事件的任务在预先指定的时间内仍然没有获取事件,这时需调用此函数来转换的它的状态。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)}嵌入式操作系统基础第九章任务的同步与通信13五、空事件控制块的的组织和任务控制块的组织结构类似:所有的事件控制块也被组织成两个链表,当系统初始化时,通过控制块指针OSEventPtr把所有的空时间控制块链接成一个空事件控制块链表。嵌入式操作系统基础第九章任务的同步与通信14§9.1信号量及其操作一、信号量由16位的无符号整数(0到65,535之间)构成的信号量计数器和任务等待表两部分组成。计数器决定共享资源的任务数。嵌入式操作系统基础第九章任务的同步与通信15二、信号量的操作1.信号量的创建:信号量一旦建立就不能删除了,因此也就不可能将一个已分配的任务控制块再放回到空闲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)}信号量创建嵌入式操作系统基础第九章任务的同步与通信162.等待一个信号量,OSSemPend()/OSSemAccept()voidOSSemPend(OS_EVENT*pevent,//信号量指针INT16Utimeout,//等待时限INT8U*err);//错误信息INT16UOSSEMAccept(OS_EVENT*PEVENT//信号量指针)3.发送一个信号量,OSSemPost()任务获得信号量,并在访问共享资源结束以后,必须释放信号量,此过程需调用函数OSSemPost()完成。嵌入式操作系统基础第九章任务的同步与通信17INT8UOSSemPost(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-OSEventCnt65535){pevent-OSEventCnt++;(5)OS_EXIT_CRITICAL();return(OS_NO_ERR);}else{OS_EXIT_CRITICAL();return(OS_SEM_OVF);}}}嵌入式操作系统基础第九章任务的同步与通信183.发送一个信号量,OSSemPost()OS_EVENT*OSSemDel(OS_EVENT*pevent,INT8Uopt,INT8U*err);3.信号量状态查询,OSSemQuery()INT8UOSSemQuery(OS_EVENT*pevent,OS_SEM_DATA*pdata);Typedefstruct{INT16UOSCnt;INTU8UOSEventb1[OS_EVENT_SIZE];INT8UOSEventGrp;}OS_SEM_DATA;嵌入式操作系统基础第九章任务的同步与通信19§9.3任务优先级反转和互斥型信号量一、任务优先级的反转现象在可剥夺型内核中,当任务以独占方式使用共享资源时,会出现低优先级任务先于高优先级任务而被运行的现象,这种现象就成为任务优先级反转。嵌入式操作系统基础第九章任务的同步与通信20voidTaskA(void){……SetTaskPriority(RES_X_PRIO);//访问共享资源XSetTaskPriority(TASK_A_PRIO);……}形成原因:使用信号量的任务是否能够运行时受任务的优先级别以及是否占用信号量两个条件约束的,而信号量的约束高于优先级别的约束。解决方案:一旦获取信号量的任务投入运行,其将暂用最高优先级别,直至任务执行完成。嵌入式操作系统基础第九章任务的同步与通信21二、互斥型信号量实现对共享资源的独占式处理。解决任务的优先级反转:变量OSEventPtr占16位,低8位作为信号量有效性的判断位;高8位则存放任务运行后临时暂用的优先级别。嵌入式操作系统基础第九章任务的同步与通信221.互斥型信号量的创建OS_EVENT*OSMutexCreate(INT8Uprio,INT8U*err);2.请求互斥型信号量:OSMutexPend()/OSMutexAccept()OS_EVENT*OSMutexPend(OS_EVENT*pevent,INT16UTimeout,INT8U*err);嵌入式操作系统基础第九章任务的同步与通信233.发送互斥型信号量INT8UOSMutexQuery(OS_EVENT*pevent);4.查询互斥型信号量的当前状态OS_EVENT*OSMutexPend(OS_EVENT*pevent,OS_MUTEX_DATA*pdata);Typedefstruct{INT8UOSValue;INTU8UOSEvenTb1[OS_EVENT_SIZE];INT8UOSEventGrp;INT8UOSOwnerPrio;INT8UOSMutexPIP;}OS_MUTEX_DATA;嵌入式操作系统基础第九章任务的同步与通信245.删除互斥型信号量OS_EVENT*OSMutexPend(OS_EVENT*pevent,INT8Uopt,INT8U*err);嵌入式操作系统基础第九章任务的同步与通信25§9.4消息邮箱及其操作一、消息邮箱任务与任务间要传递一个数据,为了适应不同数据的需要,最好在存储中建立一个数据缓冲区,把要传递的数据放在该缓冲区中,从而实现任务间的数

1 / 38
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功