嵌入式系统 - 同步、互斥与通信(下)
教材:嵌入式系统及应用,罗蕾、李允、陈丽蓉等,电子工业出版社
嵌入式系统开发
同步、互斥与通信
邮箱和消息队列
任务间的通信方式
-
直接通信。在通信过程中双方必须明确地知道(命名)彼此
- Send (P,message) – 发送一个消息到任务P
- Receive(Q,message) – 从任务Q接收一个消息
-
间接通信。通信双方不需要指出消息的来源或去向,而通过中间机制来通信
- send(A,message) – 发送一个消息给邮箱A
- receive(A,message) – 从邮箱A接收一个消息
消息
- 内存空间中一段长度可变的缓冲区,其长度和内容均可以由用户定义,其内容可以是实际的数据、数据块的指针或空
- 对消息内容的解释由应用完成
- 一些操作系统内核把消息进一步分为:邮箱和消息队列
- 邮箱仅能存放单条消息,它提供了一种低开销的机制来传送信息。每个邮箱可以保存一条大小为若干个字节的消息
- 消息队列可存放若干消息,提供了一种任务间缓冲通信的方法
- 消息队列属于间接通信方式
- 消息机制可支持定长与可变长度两种模式的消息,可变长度的消息队列需要对队列中的每一条消息增加额外的存储开销
消息队列
消息队列状态图
消息队列及其相关的参数和支持数据结构
消息队列的环形缓冲
-
典型的消息队列操作
- 创建消息队列
- 发送普通消息
- 发送紧急消息
- 发送广播消息
- 接收消息
- 删除消息队列
- 获取有关消息队列的各种信息
事件
一些术语
-
事件
是指一种表明预先定义的系统事件已经发生的机制
-
发送事件集
指在一次发送过程中发往接收者(比如任务)的一个或多个事件的组合。
-
待处理事件集
指已被发送到一个接收者但还没有被接收(即正在等待处理)的所有事件的集合。
-
事件条件
指事件接收者在一次接收过程中期待接收的一个或多个事件的集合
-
事件集控制块
管理所有创建的事件集
事件集也可以附属于任务,不需创建,其相关参数成为任务控制块的一部分
事件的特点
- 事件机制用于任务与任务之间、任务与ISR之间的同步。其主要的特点是可实现一对多的同步
- 一个事件就是一个标志,不具备其它信息
- 一个或多个事件构成一个事件集
- 事件及事件集有以下特点:
- 事件间相互独立
- 事件仅用于同步,不提供数据传输功能
- 事件无队列,即多次发送同一事件,在未经过任何处理的情况下,其效果等同于只发送一次
- 提供事件机制的意义在于:
- 当某任务要与多个任务或中断服务同步时,就需要使用事件机制。
- 若任务需要与一组事件中的任意一个发生同步,可称为独立型同步(逻辑“或”关系)。
- 任务也可以等待若干事件都发生时才同步,称为关联型同步(逻辑“与”关系)
典型的事件操作
-
创建事件集
申请空闲事件集控制块,设置事件集属性,初始化控制块中的域,分配ID号
-
删除事件集
回收事件集控制块到空闲链中,等待接收该事件集的任务被恢复就绪
-
发送事件(集)
调用者(任务或中断)构造一个事件(集),将其发往接收者(比如目标任务)
接收事件(集)
获取有关事件集的各种信息
异步信号
- 异步信号机制用于任务与任务之间、任务与ISR之间的异步操作,它被任务(或ISR)用来通知其它任务某个事件的出现。
- 异步信号标志可以依附于任务。需要处理异步信号的任务由两部分组成,一个是与异步信号无关的任务主体,另一个是ASR(异步信号服务例程)。
- 一个ASR对应于一个任务。当向任务发送一个异步信号,如果该任务正在运行则中止其自身代码的运行,转而运行与该异步信号相关的服务例程;或者当该任务被**时,在投入运行前执行ASR。
- 异步信号机制也可以称作软中断机制,异步信号又被称为软中断信号。
异步信号机制与中断机制的比较
相同点
-
具有中断性。
对中断的处理和对异步信号的处理都要先暂时地中断当前任务的运行。
-
有相应的服务程序
- 根据中断向量,有一段与中断信号对应的服务程序,称为ISR(Interrupt Service Routine)
- 根据异步信号的编号,有一段与之对应的服务程序,称为ASR(Asynchronious Service Routine)
-
可以屏蔽其响应
- 外部硬件中断可以通过相应的寄存器操作被屏蔽
- 任务也可屏蔽对异步信号的响应
不同点
- 实质不同
- 处理时机(或响应时间)不同
- 执行的环境不同
- 一般地,ISR在独立的上下文中运行,操作系统为之提供专门的堆栈空间
- ASR在相关任务的上下文中运行,所以ASR也是任务的一个组成部分
异步信号机制与事件机制的比较
同样是标志着某个事件的发生,事件机制的使用是同步的,而异步信号机制是异步的
- 对一个任务来说,什么时候会接收到事件是已知的,因为接收事件的功能是它自己在运行过程中调用的
- 任务不能预知何时会收到一个异步信号,并且一旦接收到了异步信号,在允许响应的情况下,它会中断正在运行的代码而去执行异步信号处理程序
典型的异步信号操作
- 安装异步信号处理例程
- 发送异步信号到任务