收藏 分享(赏)

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

上传人:weiwoduzun 文档编号:5007010 上传时间:2019-01-30 格式:PPT 页数:38 大小:547KB
下载 相关 举报
嵌入式操作系统教程-第九章.ppt_第1页
第1页 / 共38页
嵌入式操作系统教程-第九章.ppt_第2页
第2页 / 共38页
嵌入式操作系统教程-第九章.ppt_第3页
第3页 / 共38页
嵌入式操作系统教程-第九章.ppt_第4页
第4页 / 共38页
嵌入式操作系统教程-第九章.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、1,第九章 任务的同步与通信,任务间的同步和事件控制块 信号量及其操作 任务优先级反转和互斥型信号量 消息邮箱及其操作 消息队列及其操作,2,第九章 任务的同步与通信,一、任务间的同步鉴于任务间直接制约或间接制约性的关系,这种制约性的合作运行机制叫做任务的同步。,二、事件用于uC/OS-II任务间通信媒介的信号量、邮箱和消息队列等数据结构会影响到任务的程序流程,这些通信媒介又被称为事件(Events)。,9.1 任务间的同步和事件控制块,3,1.信号量,互斥型信号量:通常表现为一个二值型信号,用一位二进制位来表示(1/0),可以实现共享资源的独占式占用。信号量:通常表现为一个递减的计数器信号,

2、可以实现若干个同类资源的共享,提高资源使用效率。,4,2.消息邮箱,指向保存任务间传递信息的存储空间(缓存区)的指针结构称为消息邮箱。,5,3.消息队列,若消息邮箱被定义成拥有若干个元素的数组,用来传递多个消息的地址指针,这样消息的数据结构称为消息队列。,4.事件的等待任务队列,两个功能: 对等待事件的所有记录进行登记并排序 允许任务有一定的等待时间,6,7,三、事件控制块,事件控制块的结构OSEventPtr指针,只有在所定义的事件是邮箱或者消息队列时才使用。当所定义的事件是邮箱时,它指向一个消息,而当所定义的事件是消息队列时,它指向一个数据结构。,8,.OSEventTbl /.OSEve

3、ntGrp 与前面提过的OSRdyTbl和OSRdyGrp非常相像,只不过前两者包含的是等待某事件的任务,而后两者包含的是系统中处于就绪状态的任务。 .OSEventCnt :当事件是一个信号量时,.OSEventCnt是用于信号量的计数器。 .OSEventType:定义了事件的具体类型。它可以是信号量(OS_EVENT_SEM)、邮箱(OS_EVENT_TYPE_MBOX)或消息队列(OS_EVENT_TYPE_Q)中的一种。用户要根据该域的具体值来调用相应的系统函数,以保证对其进行的操作的正确性。,9,四、事件控制块的基本操作函数,1.事件控制块的初始话函数函数作用:把变量OSEvent

4、Grp及任务等待表中的每一位都清0,即令事件的任务等代表中不含有任何等待任务。,10,2.使一个任务进入等待状态的函数当一个任务在请求一个事件而不能获得时,应把次任务登记在时间的等待任务列表中,并把任务控制块中的任务状态置为等待状态和吧任务置为非就绪任务,11,3.正在等待的任务进入就绪状态当一个正在等待的任务具备了可以运行的条件,这时需调用此函数来使它进入就绪状态。该函数的作用就是把调用这个函数的任务在任务等待表中的位置清O后,再把任务子啊任务就绪表中的对应位置1,然后引起一次任务调度。,12,4.等待超时的任务转为就绪态正在等待事件的任务在预先指定的时间内仍然没有获取事件,这时需调用此函数

5、来转换的它的状态。,13,五、空事件控制块的的组织,和任务控制块的组织结构类似:所有的事件控制块也被组织成两个链表,当系统初始化时,通过控制块指针OSEventPtr把所有的空时间控制块链接成一个空事件控制块链表。,14,9.1 信号量及其操作,一、信号量由16位的无符号整数(0 到65,535之间)构成的信号量计数器和任务等待表两部分组成。计数器决定共享资源的任务数。,15,二、信号量的操作,1.信号量的创建:信号量一旦 建立就不能删 除了,因此也 就不可能将一 个已分配的任 务控制块再放 回到空闲ECB 链表中。,信号量创建,16,2.等待一个信号量, OSSemPend()/OSSemA

6、ccept(),void OSSemPend(OS_EVENT *pevent, /信号量指针INT16U timeout, /等待时限INT8U *err); /错误信息INT16U OSSEMAccept(OS_EVENT *PEVENT /信号量指针),3.发送一个信号量, OSSemPost(),任务获得信号量,并在访问共享资源结束以后,必须释放信号量,此过程需调用函数OSSemPost()完成。,17,18,3.发送一个信号量, OSSemPost(),OS_EVENT *OSSemDel(OS_EVENT *pevent,INT8U opt,INT8U *err);,3.信号量状态

7、查询, OSSemQuery(),INT8U OSSemQuery(OS_EVENT *pevent,OS_SEM_DATA *pdata);,Typedef struct INT16U OSCnt; INTU8U OSEventb1OS_EVENT_SIZE; INT8U OSEventGrp; OS_SEM_DATA;,19,9.3 任务优先级反转和互斥型信号量,一、任务优先级的反转现象在可剥夺型内核中,当任务以独占方式使用共享资源时,会出现低优先级任务先于高优先级任务而被运行的现象,这种现象就成为任务优先级反转。,20,形成原因:使用信号量的任务是否能够运行时受任务的优先级别以及是否占用

8、信号量两个条件约束的,而信号量的约束高于优先级别的约束。 解决方案:一旦获取信号量的任务投入运行,其将暂用最高优先级别,直至任务执行完成。,21,二、互斥型信号量,实现对共享资源的独占式处理。 解决任务的优先级反转:变量OSEventPtr占16位,低8位作为信号量有效性的判断位;高8位则存放任务运行后临时暂用的优先级别。,22,1.互斥型信号量的创建,2.请求互斥型信号量: OSMutexPend()/OSMutexAccept(),23,3.发送互斥型信号量,INT8U OSMutexQuery(OS_EVENT *pevent);,4.查询互斥型信号量的当前状态,Typedef stru

9、ct INT8U OSValue; INTU8U OSEvenTb1OS_EVENT_SIZE; INT8U OSEventGrp; INT8U OSOwnerPrio; INT8U OSMutexPIP; OS_MUTEX_DATA;,24,5.删除互斥型信号量,25,9.4 消息邮箱及其操作,一、消息邮箱任务与任务间要传递一个数据,为了适应不同数据的需要,最好在存储中建立一个数据缓冲区,把要传递的数据放在该缓冲区中,从而实现任务间的数据通信。,26,二、消息邮箱的操作,创建邮箱,1.邮箱的创建,27,2.发送一个消息到邮箱中: OSMboxPost()/ OSMboxPostOpt(),I

10、NT8U OSMboxPost (OS_EVENT *pevent, void *msg) INT8U OSMboxPostOpt (OS_EVENT *pevent, void *msg,INT8U opt),28,3.等待一个邮箱中的消息: OSMboxPend()/OSMboxAccept(),void *OSMboxPend(OS_EVENT *pevent, INT16U timeout,INT8U *err) void *OSMboxAccept(OS_EVENT *pevent),29,4.查询一个邮箱的状态, OSMboxQuery(),INT8U OSMboxQuery (O

11、S_EVENT*pevent,OS_MBOX_DATA *pdata),Typedef struct void *OSMsg; INTU8U OSEvenTb1OS_EVENT_TBL_SIZE; INT8U OSEventGrp; OS_MBOX_DATA;,5.删除邮箱, OSMboxDel(),OS_EVENT *OSMboxDel (OS_EVENT*pevent,INT8U optINT8U *err),30,9.5 消息队列及其操作,一、消息队列消息队列可以传递多条消息,通常由三部分组成:事件控制块、消息对列和消息.,31,1.消息指针数组,消息指针数组结构,32,OSQPtr在空

12、闲队列控制块中链接所有的队列控制块。一旦建立了消息队列,该域就不再有用了。 OSQStart是指向消息队列的指针数组的起始地址的指针。用户应用程序在使用消息队列之前必须先定义该数组。 OSQEnd是指向消息队列结束单元的下一个地址的指针。该指针使得消息队列构成一个循环的缓冲区。 OSQIn是指向消息队列中插入下一条消息的位置的指针。当OSQIn和.OSQEnd相等时,OSQIn被调整指向消息队列的起始单元。,33,OSQOut是指向消息队列中下一个取出消息的位置的指针。当OSQOut和OSQEnd相等时,OSQOut被调整指向消息队列的起始单元。 OSQSize是消息队列中总的单元数。该值是在

13、建立消息队列时由用户应用程序决定的。在C/OS-II中,该值最大可以是65,535。 OSQEntries是消息队列中当前的消息数量。当消息队列是空的时,该值为0。当消息队列满了以后,该值和OSQSize值一样。 在消息队列刚刚建立时,该值为0。,34,系统把消息指针数组的基本参数都记录在一个叫做队列控制块(OS_Q)的结构中。并用队列控制块中的指针OSQPtr将所有队列控制块链接为链表。,2.队列控制块,35,一、消息队列的操作,1.消息队列的创建,OSQCreate() OS_EVENT *OSQCreate (void *start,INT16U size) 2.等待一个消息队列中的消息

14、,OSQPend()/OSQAccept()void *OSQPend (OS_EVENT *pevent,INT16U timeout, INT8U *err ) void *OSQAccept (OS_EVENT *pevent),36,3.向消息队列发送一个消息(FIFO),OSQPost()和OSQPostOpt()INT8U OSQPost (OS_EVENT *pevent, void *msg) INT8U OSQPostOpt (OS_EVENT *pevent, void *msg.INT8U opt),37,4.清空一个消息队列, OSQFlush(),38,5.删除一个消息队列, OSQDEL() OS_EVENT OSQDel (OS_EVENT *pevent ) ; 6.查询消息队列,OSQQuery()OS_EVENT OSQQuery (OS_EVENT *pevent, OS_Q_DATA *pdata) ;,Typedef struct void *OSMsg; INTU8U OSEvenTb1OS_EVENT_TBL_SIZE; INT8U OSEventGrp; INT16U OSQSize; INT16U OSNMsgs; OS_FLAG_GRP;,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 实用文档 > 简明教程

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报