- 1
- 0
- 约1.06万字
- 约 62页
- 2018-03-27 发布于浙江
- 举报
[工学]7IntertaskCommunication-Messagebox_1
实时嵌入式操作系统 艾云峰 aiyunfeng@ College of Computing Communication Engineering 引言 上次课讨论了利用信号量实现两个或者多个任务执行时的活动同步问题。这样的同步可以帮助任务之间的合作,以便产生一个有效的实时系统。 许多情况下,任务活动同步并不足以满足应用的需求,任务之间必须能够交换信息 为了实施任务之间的数据通信,内核提供一个消息队列对象和消息队列管理服务 主要内容 1. 任务间消息传递的例子 小米步枪与坦克大炮的区别 2. RTOS中的消息队列机制的实现 从一般到具体,符合人类的思维过程 3. UC/OS-II中消息队列模块的实现 My God,又是抽象的代码! 有待于你课下认真的研读! 任务间传递消息的方式 通过全局变量和状态变量 主要内容 1. 任务间消息传递的例子 2. RTOS中的消息队列机制的实现 2.1 消息队列的定义 2.2 消息队列的状态 2.3 消息队列中的内容 2.4 典型的消息队列操作 2.5 典型的消息队列使用 3. UC/OS-II中消息队列模块的实现 消息队列的定义 消息队列是一个类似于缓冲区的对象,任务和ISR可通过它发送和接收消息,实现相互通信和与数据的同步。消息队列像一个管道,它暂时保持来自发送者的消息,直到接收者准备读取这些消息。这种临时的缓冲机制可把消息发送和接收工作分配给两个任务完成,避免一个任务必须同时进行接收和发送消息的现象。 A message queue is a buffer-like object through which tasks and ISRs send and receive messages to communicate and synchornize with data. A message queue is like a pipeline. It temporarily holds messages from a sender until the intended receiver is ready to read them. This temporary buffering decouples a sending and receiving task; that is, it frees the tasks from having to send and receive messages simultaneously 消息队列相关参数与数据结构 消息独列描述 消息队列创立时,内核为其分配一个惟一的ID并创立它的QCB和任务等待列表,同时可根据用户提供的参数(队列的长度和最大消息长度)决定需要为消息队列分配多少内存 消息队列本身由许多元素组成,每个元素可以支持一条单个的消息。其中,保持第一个和最后一个消息的元素分别称之为头(head)和尾(tail);队列的某些元素可以是空的(不包含消息)。队列元素的总数(空的和不空的之和)是队列的总长度 一个消息队列有两个相关的任务等待列表。当队列是空的时候,这时从消息队列获取消息将使任务进入接收任务等待列表;当队列是满的时候,这时从消息队列发送消息将使任务进入发送任务等待列表; 消息队列的状态图 消息队列状态转换 一个消息队列首次建立时,状态为空(empty)。空状态下,如果有任务来获取消息,任务将进入接收任务等待列表。 消息队列空时,另外的任务发送一条消息给消息队列 如果接收任务等待列表非空,消息直接发送给等待消息的任务;消息队列状态仍为空; 如果接收任务等待列表空,则消息队列状态转为非空 非空状态下,随着另外的消息到达队列,队列最终装满消息,状态转为满;当有任务提取消息时,消息队列消息数目减1;当消息数目减到0时,消息队列状态转为空。 消息队列满的状态下,任何任务给它发送消息都不会成功;有的RTOS实现将任务置入发送任务等待列表,有的RTOS实现报错返回; 消息队列满的状态下,有任务从队列提取消息时,消息队列消息数目减1,状态转为非空。 消息队列的内容 消息类型 消息本身的内容-数据 消息的长度受到消息队列最大消息长度的限制 消息是指向数据的指针 消息的传递 接收任务等待列表空时,一个任务给另外一个任务发送一个消息时,消息被正常的拷贝两次;非空时,拷贝一次。 创立和删除消息队列操作 创立和删除消息队列 发送和接收消息操作 发送和接收消息 发送消息操作(1) 任务执行发送消息操作时,消息进入消息队列的顺序: FIFO LIFO 发送消息操作(2) 内核一般支持几种不同堵塞类型的发送消息操作 无阻塞发送消息操作 如果一个消息队列已满,那么返回一个错误给调用者,并且继续执行调用者(可能是任务或者ISR)所做的调用 带时限的发送消
原创力文档

文档评论(0)