1.任务间通信管理
任务间通信管理也是嵌入式操作系统的关键功能之一。它主要为操作系统的应用程序提供多种类型的数据传输、任务同步/异步操作等手段。
2.操作系统任务之间的关系
由于嵌入式操作系统是为应用提供管理、硬件支持、协调任务和中断处理程序等功能,具备着多任务能力,那么操作系统任务之间一般存在以下关系:
(1)相互独立:任务之间仅仅存在竞争CPU的资源,再无其他关联。
(2)竞争:任务之间存在对除CPU外的其他资源的竞争(即互斥机制)。共享资源是多任务系统中主要关心的问题,在系统中,大多数的资源在 某一时刻仅能被某一任务使用,并且在使用过程中不能被其他任务中断。这些资源主要包括特定的外设、共享内存等。当CPU禁止并发操作时,那些包含了使用CPU之外的共享资源的代码就不能同时被多个任务调用执行。这样的代码称为“临界区域”。如果两个任务同时进入临界区域,将会产生意想不到的错误。
(3)同步:协调彼此运行的步调。
(4)通信:彼此间传递数据和信息,以协调完成某项工作。通信可以是在任务与任务之间,或中断服务程序(ISR)与任务之间。
3.任务间的通信手段 瞎蒙
因此,要实现多任务间的协同工作,操作系统必须提供任务间的通信手段。嵌入式操作系统一般都会提供多任务间通信的方法,常用的通信方式包括:
- 共享内存:数据的简单共享。
- 信号量:基本的互斥和同步。
- 消息队列:同一CPU内多任务间消息传递。
- Socket和远程调用:任务间透明的网络通信。
- Signals(信号):用于异常处理。
3.1共享内存
共享内存是任务间最直接、最明显的通信方法,也是访问共享的数据结构,即不同的任务都可以访问同一地址空间。由于大部分嵌入式系统的任务共存于单一的线性地址空间,在多个通信机制。只要通信任务双方采用了协商一致的数据结构,包括各种类型的全局变量、双向链表、环形队列等复杂的数据结构,都可以被所用任务直接访问。
3.2信号量
信号量是提供多任务间通信、同步和互斥的最优选择,它提供任务间的最快速通信。也是提供任务间同步和互斥的主要手段。对于互斥,信号量可以上锁对共享资源的访问。并且必禁止中断和禁止抢占提供更精确的互斥粒度。对于同步,信号量可以协调外部事件与任务的执行。
针对不同类型的问题,操作系统可以有不同的信号量,一般分为三种:
- 二进制信号量:最快的、最常用的信号量,用于解决任务的同步问题。
- 互斥信号量:为解决具有内在地互斥、优先级继承和递归等问题而设置的一种特殊的二进制信号量。
- 计数信号量:类似于二进制信号量,但是随信号量释放的次数改变而改变。适合于一个资源的多个实例需要保护的情形。
3.3消息队列
消息队列作为一种更高级的通信方式,能够在同一处理器的各个任务间传递任意长度(理论上只受物理内存和机器字长限制)的信息。消息队列是一个类似于缓冲区的对象,通过它,任务和ISR发送接收消息,实现带数据的通信和同步。消息队列像一个管道,它暂时保持来自一个发送者的消息,直到有意的接收者准备读这些消息。这个临时缓冲区把发送任务和接收任务分隔开,即它必须同时释放发送和接收消息的任务,其基本原理见图1.
图1 消息队列基本原理
在实际应用中,使用消息队列的方法包括非互锁的单向数据通信、互锁的单向数据通信、互锁的双向数据通信和广播通信等。与此同时,消息队列中消息的队列存在多种方式,比如先进先出(FIFO)、先进后出(FILO)、紧急消息、优先级消息、时限消息等。
管道(pipeline)是消息队列中的一种,是UNIX操作系统中传统的进程通信技术,一般分无名管道和命名管道,以I/O系统调用方式进行读写。在传统的实现中管道是单向数据交换。如图2所示。数据在管道内像一个非结构字节流,按FIFO的次序从管道中读出。一个管道提供一个简单的数据流设施。当管道空时,阻塞读任务;当管道满时,阻塞写任务。有些操作系统也允许有多个读任务的管道和有多个写任务。
图2 管道的基本原理示意图
3.4Socket和远程调用
Socket和远程调用是在应用层和传输层之间的一个抽象层,它把TCP/IP层复杂的操作抽象为几个简单的接口,供应用层调用实现进程在网络中的通信。Socket起源于UNIX,在UNIX一切皆文件的思想下,进程间通信就被冠名为文件描述符(File Description)。Socket通信原理是一种“打开——读/写——关闭”模式的实现,服务器和客户端各自维护一个“文件”,在建立连接打开后,可以向文件写入内容供对方读取或者对方内容,通信结束关闭文件。
Socket保证了不同计算机之间的通信,也就是网络通信。对于网站,通信模型是服务器与客户端之间的通信。两端都建立了一个Socket对象,然后通过Socket对象对数据进行传输。通常服务器处于一个无限循环,等待客户端的连接。图3给出了Socket的基本原理。
图3 Socket的基本原理
3.5Signals
Signals是VxWorks操作系统提供的一种特殊异常处理与任务之间的通信方式,其思想来源与POSIX。Signals主要用来通知进程发生了异步事件。在软件层次上是对中断机制的一种模拟,在原理上,一个进程收到一个信号与处理器受到一个中断请求是一样的。信号是进程间通信机制中唯一的异步通信机制,一个进程不必通过任何操作来等待信号的到达,事实上,进程也不知道信号到底什么时候到达。进程之间可以互相通过系统调用发送软中断信号。内核也可以因为内部事件而给进程发送信号,通知进程发生了某个事件。Signals机制除了基本通知功能外,还可以传递附加信息。