版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
第九章任务的同步与通信任务间的同步和事件控制块信号量及其操作任务优先级反转和互斥型信号量消息邮箱及其操作消息队列及其操作1第九章任务的同步与通信任务间的同步和事件控制块1第九章任务的同步与通信一、任务间的同步
鉴于任务间直接制约或间接制约性的关系,这种制约性的合作运行机制叫做任务的同步。
二、事件
用于uC/OS-II任务间通信媒介的信号量、邮箱和消息队列等数据结构会影响到任务的程序流程,这些通信媒介又被称为事件(Events)。§9.1任务间的同步和事件控制块
2第九章任务的同步与通信一、任务间的同步二、事件§9.11.信号量互斥型信号量:通常表现为一个二值型信号,用一位二进制位来表示(1/0),可以实现共享资源的独占式占用。信号量:通常表现为一个递减的计数器信号,可以实现若干个同类资源的共享,提高资源使用效率。31.信号量互斥型信号量:通常表现为一个二值型信号,用一位二进2.消息邮箱指向保存任务间传递信息的存储空间(缓存区)的指针结构称为消息邮箱。42.消息邮箱指向保存任务间传递信息的存储空间(缓存区3.消息队列若消息邮箱被定义成拥有若干个元素的数组,用来传递多个消息的地址指针,这样消息的数据结构称为消息队列。4.事件的等待任务队列两个功能:对等待事件的所有记录进行登记并排序允许任务有一定的等待时间53.消息队列若消息邮箱被定义成拥有若干个元素的数组,66三、事件控制块事件控制块的结构OSEventPtr指针,只有在所定义的事件是邮箱或者消息队列时才使用。当所定义的事件是邮箱时,它指向一个消息,而当所定义的事件是消息队列时,它指向一个数据结构。typedefstruct{void*OSEventPtr;/*指向消息或者消息队列的指针*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任务列表*/INT16UOSEventCnt;/*计数器(当事件是信号量时)*/INT8UOSEventType;/*事件类型*/INT8UOSEventGrp;/*等待任务所在的组*/}OS_EVENT;7三、事件控制块事件控制块的结构typedefstruct.OSEventTbl[]/.OSEventGrp
与前面提过的OSRdyTbl[]和OSRdyGrp非常相像,只不过前两者包含的是等待某事件的任务,而后两者包含的是系统中处于就绪状态的任务。.OSEventCnt:当事件是一个信号量时,.OSEventCnt是用于信号量的计数器。.OSEventType:定义了事件的具体类型。它可以是信号量(OS_EVENT_SEM)、邮箱(OS_EVENT_TYPE_MBOX)或消息队列(OS_EVENT_TYPE_Q)中的一种。用户要根据该域的具体值来调用相应的系统函数,以保证对其进行的操作的正确性。8.OSEventTbl[]/.OSEventGrp与前面四、事件控制块的基本操作函数1.事件控制块的初始话函数
函数作用:把变量OSEventGrp及任务等待表中的每一位都清0,即令事件的任务等代表中不含有任何等待任务。voidOSEventWaitListInit(OS_EVENT*pevent){INT8Ui;pevent->OSEventGrp=0x00;for(i=0;i<OS_EVENT_TBL_SIZE;i++){pevent->OSEventTbl[i]=0x00;}}9四、事件控制块的基本操作函数1.事件控制块的初始话函数voi2.使一个任务进入等待状态的函数
当一个任务在请求一个事件而不能获得时,应把次任务登记在时间的等待任务列表中,并把任务控制块中的任务状态置为等待状态和吧任务置为非就绪任务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;}102.使一个任务进入等待状态的函数voidOSEventTa3.正在等待的任务进入就绪状态
当一个正在等待的任务具备了可以运行的条件,这时需调用此函数来使它进入就绪状态。该函数的作用就是把调用这个函数的任务在任务等待表中的位置清O后,再把任务子啊任务就绪表中的对应位置1,然后引起一次任务调度。voidOSEventTaskRdy(OS_EVENT*pevent,void*msg,INT8Umsk){OS_TCB*ptcb;INT8Ux;INT8Uy;INT8Ubitx;INT8Ubity;INT8Uprio;……}113.正在等待的任务进入就绪状态voidOSEventTas4.等待超时的任务转为就绪态
正在等待事件的任务在预先指定的时间内仍然没有获取事件,这时需调用此函数来转换的它的状态。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)}124.等待超时的任务转为就绪态voidOSEventTO五、空事件控制块的的组织
和任务控制块的组织结构类似:所有的事件控制块也被组织成两个链表,当系统初始化时,通过控制块指针OSEventPtr把所有的空时间控制块链接成一个空事件控制块链表。13五、空事件控制块的的组织和任务控制块的组织结构类似:§9.1信号量及其操作一、信号量
由16位的无符号整数(0到65,535之间)构成的信号量计数器和任务等待表两部分组成。计数器决定共享资源的任务数。14§9.1信号量及其操作一、信号量14二、信号量的操作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)}信号量创建15二、信号量的操作1.信号量的创建:OS_EVENT*OSS2.等待一个信号量,OSSemPend()/OSSemAccept()
voidOSSemPend(OS_EVENT*pevent,//信号量指针INT16Utimeout,//等待时限INT8U*err);//错误信息
INT16UOSSEMAccept(OS_EVENT*PEVENT//信号量指针)3.发送一个信号量,OSSemPost()任务获得信号量,并在访问共享资源结束以后,必须释放信号量,此过程需调用函数OSSemPost()完成。162.等待一个信号量,OSSemPend()/OSSemAcINT8UOSSemPost(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<65535){pevent->OSEventCnt++; (5)OS_EXIT_CRITICAL();return(OS_NO_ERR);}else{OS_EXIT_CRITICAL();return(OS_SEM_OVF);}}}17INT8UOSSemPost(OS_EVENT*pev3.发送一个信号量,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;183.发送一个信号量,OSSemPost()OS_EVENT§9.3任务优先级反转和互斥型信号量一、任务优先级的反转现象
在可剥夺型内核中,当任务以独占方式使用共享资源时,会出现低优先级任务先于高优先级任务而被运行的现象,这种现象就成为任务优先级反转。19§9.3任务优先级反转和互斥型信号量一、任务优先级的反转voidTaskA(void){……SetTaskPriority(RES_X_PRIO);//访问共享资源XSetTaskPriority(TASK_A_PRIO);……}形成原因:使用信号量的任务是否能够运行时受任务的优先级别以及是否占用信号量两个条件约束的,而信号量的约束高于优先级别的约束。解决方案:一旦获取信号量的任务投入运行,其将暂用最高优先级别,直至任务执行完成。20voidTaskA(void){……SetTa二、互斥型信号量实现对共享资源的独占式处理。解决任务的优先级反转:变量OSEventPtr占16位,低8位作为信号量有效性的判断位;高8位则存放任务运行后临时暂用的优先级别。21二、互斥型信号量实现对共享资源的独占式处理。211.互斥型信号量的创建OS_EVENT*OSMutexCreate(INT8Uprio,INT8U*err);2.请求互斥型信号量:OSMutexPend()/OSMutexAccept()OS_EVENT*OSMutexPend(OS_EVENT*pevent,INT16UTimeout,INT8U*err);221.互斥型信号量的创建OS_EVENT*OSMutexCr3.发送互斥型信号量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;233.发送互斥型信号量INT8UOSMutexQuery(45.删除互斥型信号量OS_EVENT*OSMutexPend(OS_EVENT*pevent,INT8Uopt,INT8U*err);245.删除互斥型信号量OS_EVENT*OSMutexPen§9.4消息邮箱及其操作一、消息邮箱
任务与任务间要传递一个数据,为了适应不同数据的需要,最好在存储中建立一个数据缓冲区,把要传递的数据放在该缓冲区中,从而实现任务间的数据通信。25§9.4消息邮箱及其操作一、消息邮箱25二、消息邮箱的操作OS_EVENT*OSMboxCreate(void*msg){OS_EVENT*pevent;OS_ENTER_CRITICAL();pevent=OSEventFreeList;if(OSEventFreeList!=(OS_EVENT*)0){OSEventFreeList=(OS_EVENT*)OSEventFreeList->OSEventPtr;}OS_EXIT_CRITICAL();if(pevent!=(OS_EVENT*)0){pevent->OSEventType=OS_EVENT_TYPE_MBOX;(1)pevent->OSEventPtr=msg;(2)OSEventWaitListInit(pevent);}return(pevent);(3)}创建邮箱1.邮箱的创建26二、消息邮箱的操作OS_EVENT*OSMboxCreat2.发送一个消息到邮箱中:
OSMboxPost()/OSMboxPostOpt()INT8UOSMboxPost(OS_EVENT*pevent,void*msg)INT8UOSMboxPostOpt(OS_EVENT*pevent,void*msg,INT8Uopt)272.发送一个消息到邮箱中:
OSMboxPost()/OS3.等待一个邮箱中的消息:OSMboxPend()/OSMboxAccept()
void*OSMboxPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)void*OSMboxAccept(OS_EVENT*pevent)283.等待一个邮箱中的消息:OSMboxPend()/OSM4.查询一个邮箱的状态,OSMboxQuery()
INT8UOSMboxQuery(OS_EVENT*pevent,OS_MBOX_DATA*pdata)
Typedefstruct{void*OSMsg;INTU8UOSEvenTb1[OS_EVENT_TBL_SIZE];INT8UOSEventGrp;}OS_MBOX_DATA;5.删除邮箱,OSMboxDel()
OS_EVENT*OSMboxDel(OS_EVENT*pevent,INT8UoptINT8U*err)
294.查询一个邮箱的状态,OSMboxQuery()§9.5消息队列及其操作一、消息队列
消息队列可以传递多条消息,通常由三部分组成:事件控制块、消息对列和消息.30§9.5消息队列及其操作一、消息队列301.消息指针数组
消息指针数组结构311.消息指针数组消息指针数组结构31OSQPtr在空闲队列控制块中链接所有的队列控制块。一旦建立了消息队列,该域就不再有用了。OSQStart是指向消息队列的指针数组的起始地址的指针。用户应用程序在使用消息队列之前必须先定义该数组。OSQEnd是指向消息队列结束单元的下一个地址的指针。该指针使得消息队列构成一个循环的缓冲区。OSQIn是指向消息队列中插入下一条消息的位置的指针。当OSQIn和.OSQEnd相等时,OSQIn被调整指向消息队列的起始单元。32OSQPtr在空闲队列控制块中链接所有的队列控制块。一旦建立OSQOut是指向消息队列中下一个取出消息的位置的指针。当OSQOut和OSQEnd相等时,OSQOut被调整指向消息队列的起始单元。OSQSize是消息队列中总的单元数。该值是在建立消息队列时由用户应用程序决定的。在µC/OS-II中,该值最大可以是65,535。OSQEntries是消息队列中当前的消息数量。当消息队列是空的时,该值为0。当消息队列满了以后,该值和OSQSize值一样。在消息队列刚刚建立时,该值为0。33OSQOut是指向消息队列中下一个取出消息的位置的指针。当O
系统把消息指针数组的基本参数都记录在一个叫做队列控制块(OS_Q)的结构中。并用队列控制块中的指针OSQPtr将所有队列控制块链接为链表。2.队列控制块
34系统把消息指针数组的基本参数都记录在一个叫做队列控制一、消息队列的操作1.消息队列的创建,OSQCreate()
OS_EVENT*OSQCreate(void**start,INT16Usize)2.等待一个消息队列中的消息,OSQPend()/OSQAccept()void*OSQPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)void*OSQAccept(OS_EVENT*pevent)35一、消息队列的操作1.消息队列的创建,OSQCreate()3.向消息队列发送一个消息(FIFO),OSQPost()和OSQPostOpt()
INT8UOSQPost(OS_EVENT*pevent,void*msg)INT8UOSQPostOpt(OS_EVENT*pevent,void*msg.INT8Uopt)363.向消息队列发送一个消息(FIFO),OSQPost()和4.清空一个消息队列,OSQFlush()
INT8UOSQFlush(OS_EVENT*pevent){OS_Q*pq;OS_ENTER_CRITICAL();if(pevent->OSEventType!=OS_EVENT_TYPE_Q){ (1)OS_EXIT_CRITICAL();return(OS_ERR_EVENT_TYPE);}pq=pevent->OSEventPtr;pq->OSQIn=pq->OSQStart; (2)pq->OSQOut=pq->OSQStart;pq->OSQEntries=0;OS_EXIT_CRITICAL();return(OS_NO_ERR);}374.清空一个消息队列,OSQFlush()INT8UO5.删除一个消息队列,OSQDEL()
OS_EVENTOSQDel(OS_EVENT*pevent);6.查询消息队列,OSQQuery()
OS_EVENTOSQQuery(OS_EVENT*pevent,OS_Q_DATA*pdata);Typedefstruct{void*OSMsg;INTU8UOSEvenTb1[OS_EVENT_TBL_SIZE];INT8UOSEventGrp;INT16UOSQSize;INT16UOSNMsgs;}OS_FLAG_GRP;385.删除一个消息队列,OSQDEL()Typedefs
第九章任务的同步与通信任务间的同步和事件控制块信号量及其操作任务优先级反转和互斥型信号量消息邮箱及其操作消息队列及其操作39第九章任务的同步与通信任务间的同步和事件控制块1第九章任务的同步与通信一、任务间的同步
鉴于任务间直接制约或间接制约性的关系,这种制约性的合作运行机制叫做任务的同步。
二、事件
用于uC/OS-II任务间通信媒介的信号量、邮箱和消息队列等数据结构会影响到任务的程序流程,这些通信媒介又被称为事件(Events)。§9.1任务间的同步和事件控制块
40第九章任务的同步与通信一、任务间的同步二、事件§9.11.信号量互斥型信号量:通常表现为一个二值型信号,用一位二进制位来表示(1/0),可以实现共享资源的独占式占用。信号量:通常表现为一个递减的计数器信号,可以实现若干个同类资源的共享,提高资源使用效率。411.信号量互斥型信号量:通常表现为一个二值型信号,用一位二进2.消息邮箱指向保存任务间传递信息的存储空间(缓存区)的指针结构称为消息邮箱。422.消息邮箱指向保存任务间传递信息的存储空间(缓存区3.消息队列若消息邮箱被定义成拥有若干个元素的数组,用来传递多个消息的地址指针,这样消息的数据结构称为消息队列。4.事件的等待任务队列两个功能:对等待事件的所有记录进行登记并排序允许任务有一定的等待时间433.消息队列若消息邮箱被定义成拥有若干个元素的数组,446三、事件控制块事件控制块的结构OSEventPtr指针,只有在所定义的事件是邮箱或者消息队列时才使用。当所定义的事件是邮箱时,它指向一个消息,而当所定义的事件是消息队列时,它指向一个数据结构。typedefstruct{void*OSEventPtr;/*指向消息或者消息队列的指针*/INT8UOSEventTbl[OS_EVENT_TBL_SIZE];/*等待任务列表*/INT16UOSEventCnt;/*计数器(当事件是信号量时)*/INT8UOSEventType;/*事件类型*/INT8UOSEventGrp;/*等待任务所在的组*/}OS_EVENT;45三、事件控制块事件控制块的结构typedefstruct.OSEventTbl[]/.OSEventGrp
与前面提过的OSRdyTbl[]和OSRdyGrp非常相像,只不过前两者包含的是等待某事件的任务,而后两者包含的是系统中处于就绪状态的任务。.OSEventCnt:当事件是一个信号量时,.OSEventCnt是用于信号量的计数器。.OSEventType:定义了事件的具体类型。它可以是信号量(OS_EVENT_SEM)、邮箱(OS_EVENT_TYPE_MBOX)或消息队列(OS_EVENT_TYPE_Q)中的一种。用户要根据该域的具体值来调用相应的系统函数,以保证对其进行的操作的正确性。46.OSEventTbl[]/.OSEventGrp与前面四、事件控制块的基本操作函数1.事件控制块的初始话函数
函数作用:把变量OSEventGrp及任务等待表中的每一位都清0,即令事件的任务等代表中不含有任何等待任务。voidOSEventWaitListInit(OS_EVENT*pevent){INT8Ui;pevent->OSEventGrp=0x00;for(i=0;i<OS_EVENT_TBL_SIZE;i++){pevent->OSEventTbl[i]=0x00;}}47四、事件控制块的基本操作函数1.事件控制块的初始话函数voi2.使一个任务进入等待状态的函数
当一个任务在请求一个事件而不能获得时,应把次任务登记在时间的等待任务列表中,并把任务控制块中的任务状态置为等待状态和吧任务置为非就绪任务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;}482.使一个任务进入等待状态的函数voidOSEventTa3.正在等待的任务进入就绪状态
当一个正在等待的任务具备了可以运行的条件,这时需调用此函数来使它进入就绪状态。该函数的作用就是把调用这个函数的任务在任务等待表中的位置清O后,再把任务子啊任务就绪表中的对应位置1,然后引起一次任务调度。voidOSEventTaskRdy(OS_EVENT*pevent,void*msg,INT8Umsk){OS_TCB*ptcb;INT8Ux;INT8Uy;INT8Ubitx;INT8Ubity;INT8Uprio;……}493.正在等待的任务进入就绪状态voidOSEventTas4.等待超时的任务转为就绪态
正在等待事件的任务在预先指定的时间内仍然没有获取事件,这时需调用此函数来转换的它的状态。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)}504.等待超时的任务转为就绪态voidOSEventTO五、空事件控制块的的组织
和任务控制块的组织结构类似:所有的事件控制块也被组织成两个链表,当系统初始化时,通过控制块指针OSEventPtr把所有的空时间控制块链接成一个空事件控制块链表。51五、空事件控制块的的组织和任务控制块的组织结构类似:§9.1信号量及其操作一、信号量
由16位的无符号整数(0到65,535之间)构成的信号量计数器和任务等待表两部分组成。计数器决定共享资源的任务数。52§9.1信号量及其操作一、信号量14二、信号量的操作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)}信号量创建53二、信号量的操作1.信号量的创建:OS_EVENT*OSS2.等待一个信号量,OSSemPend()/OSSemAccept()
voidOSSemPend(OS_EVENT*pevent,//信号量指针INT16Utimeout,//等待时限INT8U*err);//错误信息
INT16UOSSEMAccept(OS_EVENT*PEVENT//信号量指针)3.发送一个信号量,OSSemPost()任务获得信号量,并在访问共享资源结束以后,必须释放信号量,此过程需调用函数OSSemPost()完成。542.等待一个信号量,OSSemPend()/OSSemAcINT8UOSSemPost(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<65535){pevent->OSEventCnt++; (5)OS_EXIT_CRITICAL();return(OS_NO_ERR);}else{OS_EXIT_CRITICAL();return(OS_SEM_OVF);}}}55INT8UOSSemPost(OS_EVENT*pev3.发送一个信号量,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;563.发送一个信号量,OSSemPost()OS_EVENT§9.3任务优先级反转和互斥型信号量一、任务优先级的反转现象
在可剥夺型内核中,当任务以独占方式使用共享资源时,会出现低优先级任务先于高优先级任务而被运行的现象,这种现象就成为任务优先级反转。57§9.3任务优先级反转和互斥型信号量一、任务优先级的反转voidTaskA(void){……SetTaskPriority(RES_X_PRIO);//访问共享资源XSetTaskPriority(TASK_A_PRIO);……}形成原因:使用信号量的任务是否能够运行时受任务的优先级别以及是否占用信号量两个条件约束的,而信号量的约束高于优先级别的约束。解决方案:一旦获取信号量的任务投入运行,其将暂用最高优先级别,直至任务执行完成。58voidTaskA(void){……SetTa二、互斥型信号量实现对共享资源的独占式处理。解决任务的优先级反转:变量OSEventPtr占16位,低8位作为信号量有效性的判断位;高8位则存放任务运行后临时暂用的优先级别。59二、互斥型信号量实现对共享资源的独占式处理。211.互斥型信号量的创建OS_EVENT*OSMutexCreate(INT8Uprio,INT8U*err);2.请求互斥型信号量:OSMutexPend()/OSMutexAccept()OS_EVENT*OSMutexPend(OS_EVENT*pevent,INT16UTimeout,INT8U*err);601.互斥型信号量的创建OS_EVENT*OSMutexCr3.发送互斥型信号量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;613.发送互斥型信号量INT8UOSMutexQuery(45.删除互斥型信号量OS_EVENT*OSMutexPend(OS_EVENT*pevent,INT8Uopt,INT8U*err);625.删除互斥型信号量OS_EVENT*OSMutexPen§9.4消息邮箱及其操作一、消息邮箱
任务与任务间要传递一个数据,为了适应不同数据的需要,最好在存储中建立一个数据缓冲区,把要传递的数据放在该缓冲区中,从而实现任务间的数据通信。63§9.4消息邮箱及其操作一、消息邮箱25二、消息邮箱的操作OS_EVENT*OSMboxCreate(void*msg){OS_EVENT*pevent;OS_ENTER_CRITICAL();pevent=OSEventFreeList;if(OSEventFreeList!=(OS_EVENT*)0){OSEventFreeList=(OS_EVENT*)OSEventFreeList->OSEventPtr;}OS_EXIT_CRITICAL();if(pevent!=(OS_EVENT*)0){pevent->OSEventType=OS_EVENT_TYPE_MBOX;(1)pevent->OSEventPtr=msg;(2)OSEventWaitListInit(pevent);}return(pevent);(3)}创建邮箱1.邮箱的创建64二、消息邮箱的操作OS_EVENT*OSMboxCreat2.发送一个消息到邮箱中:
OSMboxPost()/OSMboxPostOpt()INT8UOSMboxPost(OS_EVENT*pevent,void*msg)INT8UOSMboxPostOpt(OS_EVENT*pevent,void*msg,INT8Uopt)652.发送一个消息到邮箱中:
OSMboxPost()/OS3.等待一个邮箱中的消息:OSMboxPend()/OSMboxAccept()
void*OSMboxPend(OS_EVENT*pevent,INT16Utimeout,INT8U*err)void*OSMboxAccept(OS_EVENT*pevent)663.等待一个邮箱中的消息:OSMboxPend()/OSM4.查询一个邮箱的状态,OSMboxQuery()
INT8UOSMboxQuery(OS_EVENT*pevent,OS_MBOX_DATA*pdata)
Typedefstruct{void*OSMsg;INTU8UOSEvenTb1[OS_EVENT_TBL_SIZE];INT8UOSEventGrp;}OS_MBOX_DATA;5.删除邮箱,OSMboxDel()
OS_EVENT*OSMboxDel(OS_EVENT*pevent,INT8UoptINT8U*err)
674.查询一个邮箱的状态,OSMboxQuery()§9.5消息队列及其操作一、消息队列
消息队列可以传递多条消息,通常由三部分组成:事件控制块、消息对列和消息.68§9.5消息队列及其操作一、消息队列301.消息指针数组
消息指针数组结构691.消息指针数组消息指针数组结构31OSQPtr在空闲队列控制块中链接所有的队列控制块。一旦建立了消息队列,该域就不再有用了。OSQStart是指向消息队列的指针数组的起始地址的指针。用户应用程序在使用消息队列之前必须先定义该数组。OSQEnd是指向消息队列结束单元的下一个地址的指针。该指针使得消息队列构成一个循环的缓冲区。OSQIn是指向消息队列中插入下一条消息的位置的指针。当OSQIn和.OSQEnd相等时,OSQIn被调整指向消息队列的起始单元。70OSQPtr在空闲队列控制块中链接所有的队列控制块。一旦建立OSQOut是指向消息队列中下一个取出消息的位置的指针。当OSQOut和OSQEnd相等时,OSQOut被调整指向消息队列的起始单元。OSQSize是消息队列中总的单元数。该值是在建立消息队列时由用户应用程序决定的。在µC/OS-II中,该值最大可以是65,535。OSQEntries是消息队列中当前的消息数量。当消息队列是空的时,该值为0。当消息队列满了以后,该值和O
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026区块链技术市场分析及前景预测与投融资机会研究报告
- 2026-2030智利城市供暖工程承包行业现状调查与竞争格局展望研究研究报告
- 2026-2030艾叶产业发展分析及发展趋势与投资前景预测报告
- 2026年河北省智慧交通行业分析报告及未来发展趋势报告
- 2026年眼镜批发和零售行业分析报告及未来发展趋势报告
- 2026年无锡市轨道交通行业分析报告及未来发展趋势报告
- 2026年行业云行业分析报告及未来发展趋势报告
- 城际物流网2025年物流企业人才招聘与培训研究报告
- 2026青岛啤酒股份有限公司招聘88人备考题库含答案详解
- 2026上海音乐学院附中工作人员招聘2人备考题库(第一批)及答案详解(全优)
- 2026年有限空间作业人员安全知识考试试题(含答案)
- 广东省广州市增城区2025-2026学年九年级上学期1月期末考试语文试题
- 2026年国家电网面试题库及参考答案
- 阴道镜门诊工作制度
- 2025-2030中国激光脱毛产品市场未来趋势与营销战略规划研究报告
- 2026年重大事故隐患判定标准宣贯培训材料
- 压力性损伤的家属教育
- 漂亮的羽毛课件
- 景区卫生环境管理制度
- AI在室内设计中的应用:技术革新与行业变革
- 建筑工程施工现场材料管理方案
评论
0/150
提交评论