VxWorks支持各种任务间通信机制,提供了多样的任务间通信方式,主要有如下几种:
Ÿ 共享内存,主要是数据的共享;
Ÿ 信号量,用于基本的互斥和任务同步;
Ÿ 消息队列和管道,单CPU的消息传送;
Ÿ Socket和远程过程调用,用于网络间任务消息传送;
Ÿ 二进制信号,用于异常处理。
在多处理器之间的任务也可采用共享内存对象来实现任务间通信,只是在系统配置上有所不同.
1.1.1.共享存储区
任务间通信的最简单的方法是采用共享存储区,也即相关的各个任务分享属于它们的地址空间的同一内存区域。因为所有任务都存在于单一的线性地址空间,任务间共享数据。全局变量、线性队列、环形队列、链表、指针都可被运行在不同上下文的代码所指向。
1.1.2.互斥
当某一地址空间用于数据交换时,为了避免冲突,对于内存的锁定是非常重要的。两个或多个任务读写某些共享数据时,最后的结果取决于任务运行的精确时序,有可能得到错误值,这样必须以某种手段确保当一个任务在使用一个共享变量或文件时,其他任务不能做同样的操作。主要有关中断、抢占禁止和用信号量锁定资源等方法。(vxworks任务调度机制为中断抢占,优先级抢占(需要触发条件,触发条件就是中断)和任务使用taskdelay直接放弃CPU)一般来说,关中断是最有效的解决互斥的方法。但这对于实时应用来说,它阻止系统对外部事件的响应,无法满足实时性的要求。同样,中断延迟也是不能接受。
1.1.3.信号量
VxWorks信号量提供最快速的任务间通信机制,它主要用于解决任务间的互斥和同步。针对不同类型的问题,有以下三种信号量:
Ÿ 二进制信号量使用最快捷、最广泛,主要用于同步或互斥;
Ÿ 互斥信号量 主要用于优先级继承、安全删除和回溯;
Ÿ 计数器
VxWorks还提供POSIX信号量和多处理器上信号量的应用。
1.1.1.消息队列
现实的实时应用由一系列互相独立又协同工作的任务组成。信号量为任务间同步和联锁提供了高效方法。单处理器中任务间消息的传送采用消息消息队列。消息机制使用一个被各有关进程共享的消息队列,任务之间经由这个消息队列发送和接收消息。 任务间全双工信息传送
1.1.2.管道
管道用VxWorks的I/O系统提供一种灵活的消息传送机制,它是受驱动器pipeDrv(VxWorks所提供)管理的虚拟I/O设备。任务能调用标准的I/O函数打开、读出、写入管道。当任务试图从一个空的管道中读取数据,或向一个满的管道中写入数据时,任务被阻塞。和消息队列类似,ISR能向管道中写入信息,但不能从中读取。象I/O设备一样,管道有一个消息队列所没有的优势----调用select(),任务等待一系列I/O设备上的数据。
1.1.3.系统实现
Wind信号量对于各种类型的信号量的控制提供了同一规范化的接口,仅创建函数要特别指明信号量类型。
semBCreate() 创建(产生并激活)一个二进制信号量
semMCreate() 创建(产生并激活)一个互斥信号量
semCCreate() 创建(产生并激活)制一个计数信号量
semDelete() 中止并自由信号量
semTake() 获得信号量
semGive() 给出信号量
semFlush() 解锁所有正等待某一信号量的任务
Wind 消息队列管理:
msgQCreate() 创建(产生并激活)消息队列
msgQDelete() 中止并自由信号量
msgQSend() 向消息队列发送消息
msgQReceive() 从消息队列接收消息