9-1.Intertask-Communication-Message-box(1)

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

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

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

资源描述

1实时嵌入式操作系统艾云峰aiyunfeng@gmail.comCollegeofComputing&CommunicationEngineeringReal-timeEmbeddedOperatingSystem2引言上次课讨论了利用信号量实现两个或者多个任务执行时的活动同步问题。这样的同步可以帮助任务之间的合作,以便产生一个有效的实时系统。许多情况下,任务活动同步并不足以满足应用的需求,任务之间必须能够交换信息为了实施任务之间的数据通信,内核提供一个消息队列对象和消息队列管理服务3主要内容1.任务间消息传递的例子小米步枪与坦克大炮的区别2.RTOS中的消息队列机制的实现从一般到具体,符合人类的思维过程3.UC/OS-II中消息队列模块的实现MyGod,又是抽象的代码!有待于你课下认真的研读!注:本机内容请参考Real-timeConceptsforEmbeddedSystems一书的第7章和MicroC/OS-IITheReal-TimeKernel(SecondEdition)一书的第8章。4任务间传递消息的方式通过全局变量和状态变量缺点:任务本身维护消息的传递流程消息邮箱实现5主要内容1.任务间消息传递的例子2.RTOS中的消息队列机制的实现2.1消息队列的定义2.2消息队列的状态2.3消息队列中的内容2.4典型的消息队列操作2.5典型的消息队列使用3.UC/OS-II中消息队列模块的实现6消息队列的定义消息队列是一个类似于缓冲区的对象,任务和ISR可通过它发送和接收消息,实现相互通信和与数据的同步。消息队列像一个管道,它暂时保持来自发送者的消息,直到接收者准备读取这些消息。这种临时的缓冲机制可把消息发送和接收工作分配给两个任务完成,避免一个任务必须同时进行接收和发送消息的现象。Amessagequeueisabuffer-likeobjectthroughwhichtasksandISRssendandreceivemessagestocommunicateandsynchornizewithdata.Amessagequeueislikeapipeline.Ittemporarilyholdsmessagesfromasenderuntiltheintendedreceiverisreadytoreadthem.Thistemporarybufferingdecouplesasendingandreceivingtask;thatis,itfreesthetasksfromhavingtosendandreceivemessagessimultaneously2.1定义(1)7消息队列相关参数与数据结构From:Real-TimeConceptsforEmbeddedSystem2.1定义(2)8消息独列描述消息队列创立时,内核为其分配一个惟一的ID并创立它的QCB和任务等待列表,同时可根据用户提供的参数(队列的长度和最大消息长度)决定需要为消息队列分配多少内存消息队列本身由许多元素组成,每个元素可以支持一条单个的消息。其中,保持第一个和最后一个消息的元素分别称之为头(head)和尾(tail);队列的某些元素可以是空的(不包含消息)。队列元素的总数(空的和不空的之和)是队列的总长度一个消息队列有两个相关的任务等待列表。当队列是空的时候,这时从消息队列获取消息将使任务进入接收任务等待列表;当队列是满的时候,这时从消息队列发送消息将使任务进入发送任务等待列表;2.1定义(end)9消息队列的状态图From:Real-TimeConceptsforEmbeddedSystem2.2状态(1)10消息队列状态转换①一个消息队列首次建立时,状态为空(empty)。空状态下,如果有任务来获取消息,任务将进入接收任务等待列表。②消息队列空时,另外的任务发送一条消息给消息队列a)如果接收任务等待列表非空,消息直接发送给等待消息的任务;消息队列状态仍为空;b)如果接收任务等待列表空,则消息队列状态转为非空③非空状态下,随着另外的消息到达队列,队列最终装满消息,状态转为满;当有任务提取消息时,消息队列消息数目减1;当消息数目减到0时,消息队列状态转为空。④消息队列满的状态下,任何任务给它发送消息都不会成功;有的RTOS实现将任务置入发送任务等待列表,有的RTOS实现报错返回;⑤消息队列满的状态下,有任务从队列提取消息时,消息队列消息数目减1,状态转为非空。2.2状态(end)11消息队列的内容消息类型消息本身的内容-数据消息的长度受到消息队列最大消息长度的限制消息是指向数据的指针消息的传递接收任务等待列表空时,一个任务给另外一个任务发送一个消息时,消息被正常的拷贝两次;非空时,拷贝一次。2.3内容(end)12创立和删除消息队列操作创立和删除消息队列2.4操作(1)使用消息队列前必须首先建立消息队列任务调用内核提供的建立消息队列函数时,内核将建立并初始化各种消息队列相关的参数和数据结构(分配和初始化QCB、分配队列ID、初始化两个任务等待列表等)删除消息队列的操作任务调用内核提供的删除消息队列函数删除消息队列,该函数将执行归还QCB、清除任务等待列表等工作。13发送和接收消息操作发送和接收消息2.4操作(2)14发送消息操作(1)任务执行发送消息操作时,消息进入消息队列的顺序:FIFOLIFO2.4操作(3)15发送消息操作(2)内核一般支持几种不同堵塞类型的发送消息操作无阻塞发送消息操作如果一个消息队列已满,那么返回一个错误给调用者,并且继续执行调用者(可能是任务或者ISR)所做的调用带时限的发送消息操作永远阻塞的发送消息操作任务发送消息而被堵塞时,该任务放在消息队列的等待任务列表中,设置为FIFO或者基于优先权的顺序2.4操作(4)16接收消息操作任务可以使用不同的堵塞策略接收消息无堵塞、带时限的堵塞、永久堵塞两种从消息队列的头读取消息的方式破坏性的读:当一个任务成功从一个队列读取一个消息时,该消息永久的从消息队列中删除掉非破坏性的读:当一个任务成功从一个队列读取一个消息时,该消息仍然保存在消息队列中。注意:并不是所有的内核实现都支持非破坏性的读2.4操作(5)17获得队列的消息操作通过该操作,用户任务可以获得内核维护的某个消息队列的相关信息,比如:消息队列ID、消息队列内消息的个数、消息队列的任务等待列表等等。2.4操作(6)18典型的消息队列使用以下是应用中使用消息队列的典型方式非互锁(non-interlocked)的单向数据通信互锁的(interlocked)的单向数据通信互锁的双向数据通信广播通信下面讨论上面列出的每个简单的情况2.5使用(1)19非互锁的单向数据通信(1)该通信方式的描述一个任务通过消息队列向另外一个任务发送消息,两个任务之间的活动不需要同步如果tSinkTask优先级高于tSourceTask,则它首先运行,直到在空消息队列上堵塞。一旦tSourceTask发送消息到队列中,tSinkTask收到消息并再此运行如果tSinkTask优先级低于tSourceTask,则tSourceTask首先用消息填满消息队列。最终,当发送的消息填满消息队列时,tSourceTask被堵塞。此时,tSinkTask被唤醒,并且开始从消息队列中取得消息。此种通信方式可用于ISR和任务之间的通信中。一个像tSinkTask的任务运行在消息队列上等待。当硬件触发ISR时,ISR像消息队列中放入一个或多个消息。ISR完成后,tSinakTask得到机会运行,并且从队列中取得消息。注:ISR发送消息时必须按非堵塞方式。2.5使用(2)20非互锁的单向数据通信(2)实现该通信方式的伪代码2.5使用(3)21互锁的的单向数据通信(1)通信情况描述在某些设计中,发送任务发送消息后,需要等待接收任务的一个握手信号以表明接收任务成功接收消息。如果在一定时间内没有接收到握手信号,则发送任务再此发送消息。实现方式如图:在这中情况下,tSourceTask和tSinkTask最初使用一个初值为0的二值信号灯和一个长度为1的消息队列。tSourceTask发送消息并堵塞在信号灯上;tSinkTask接收消息并且释放一次信号灯,刚刚刚刚可以使用的信号灯唤醒tSourceTask。以上过程重复之。2.5使用(4)22互锁的的单向数据通信(2)实现该通信方式的伪代码2.5使用(5)23互锁的双向数据通信(1)通信情况描述有时,数据必须在任务之间双向流动,成为互锁的双向数据通信,或全双工通信。如图所示:tClientTask经由消息队列给tServerTask发送一个请求,tServerTask通过一个消息回送给tClientTask,完成那个请求该中通信方式适合用于客户/服务器例子中。tServerTask设置为一个优先级较高的任务,允许它很快的实现客户端的请求。如果有多个用户端,所有的客户端可同时使用客户消息队列,tServerTask使用一个独立的消息队列实现不同的客户请求。2.5使用(6)24互锁的双向数据通信(1)实现该通信方式的伪代码2.5使用(7)25广播通信(1)通信情况描述在该中请情况下,一个任务向多个任务广播同样消息的复制件如图所示:广播方式是一对多的方式,tBroadcastTask给多个tSinakTask发送正在等待的消息在上图中,tSinkTask1、2和3全部堵塞在广播消息队列上,等候一个消息。当tBroadcastTask执行时,它给消息队列发送一个消息,导致所有三个等待的任务推出堵塞状态注意:并不是所有的消息队列实现都支持广播功能。2.5使用(8)26广播通信(2)实现该通信方式的伪代码2.5使用(9)27主要内容1.任务间消息传递的例子2.RTOS中的消息队列机制的实现3.UC/OS-II中消息队列模块的实现3.1uc/os-II消息邮箱管理3.2uc/os-II消息队列管理(下次课)283.1uc/os-II消息邮箱管理大纲消息邮箱管理概述消息邮箱的使用例子消息邮箱典型操作的功能的描述消息邮箱各种操作的实现通过情景分析理解消息邮箱典型操作的实现29uc/os-II消息邮箱管理概述(1)邮箱是μC/OS-II中另一种通讯机制,它可以使一个任务或者中断服务子程序向另一个任务发送一个指针型的变量。该指针指向一个包含了特定“消息”的数据结构。μC/OS-II提供了6种对邮箱的操作:OSMboxCreate(),OSMboxPend(),OSMboxPost(),OSMboxPostOpt(),OSMboxAccept()和OSMboxQuery()函数。为了在μC/OS-II中使用邮箱,必须将OS_CFG.H中的OS_MBOX_EN常数置为1,OS_MBOX_EN为1时,各各操作的配置常数如表所示:30uc/os-II消息邮箱管理概述(2)任务、ISR和邮箱之间的关系见下图所示在上图种,I表示邮箱,沙漏表示OSMboxPend()所定义的超时时限。邮箱包含的消息内容是一个指向消息数据的指针,一个邮箱只能包含一个这样的指针。31使用消息邮箱通信的例子在本例子中,任务4向任务5发送一条消息,收到任务B的应答消息后发送下一条消息;任务B收到任务A的消息后,向任务A发送一条应答消息。部分代码如下:32OSMboxCreate()描述函数原型:OS_EVENT*OSMboxCreate(void*msg);功能描述:OSMboxCreate()建立并初始化一个消息邮箱。消息邮箱允许任务或中断向其他一个或几个任务发送消息。参数:msg参数用来初始化建立的消息邮箱。如果该指针不为空,建立的消息邮箱将含有消息返回值:指向分配给所建立的消息邮箱的事件控制块的指针。如果没有可用的事件控制块,返回空指针。功能描述(1)33OSMboxPend()函数原型:Void*OSMboxPend(OS_EVNNT*pevent,I

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

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

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

×
保存成功