VxWorks支持各种任务间通信机制,提供了多样的任务间通信方式,主要有如下几种:

Ÿ         共享内存,主要是数据的共享;

Ÿ         信号量,用于基本的互斥和任务同步;

Ÿ         消息队列和管道,单CPU的消息传送;

Ÿ         Socket和远程过程调用,用于网络间任务消息传送;

Ÿ         二进制信号,用于异常处理。

 

在多处理器之间的任务也可采用共享内存对象来实现任务间通信,只是在系统配置上有所不同.

1.1.1.共享存储区

任务间通信的最简单的方法是采用共享存储区,也即相关的各个任务分享属于它们的地址空间的同一内存区域。因为所有任务都存在于单一的线性地址空间,任务间共享数据。全局变量、线性队列、环形队列、链表、指针都可被运行在不同上下文的代码所指向。

1.1.2.互斥

当某一地址空间用于数据交换时,为了避免冲突,对于内存的锁定是非常重要的。两个或多个任务读写某些共享数据时,最后的结果取决于任务运行的精确时序,有可能得到错误值,这样必须以某种手段确保当一个任务在使用一个共享变量或文件时,其他任务不能做同样的操作。主要有关中断、抢占禁止和用信号量锁定资源等方法。(vxworks任务调度机制为中断抢占,优先级抢占(需要触发条件,触发条件就是中断)和任务使用taskdelay直接放弃CPU)一般来说,关中断是最有效的解决互斥的方法。但这对于实时应用来说,它阻止系统对外部事件的响应,无法满足实时性的要求。同样,中断延迟也是不能接受。

1.1.3.信号量

 VxWorks信号量提供最快速的任务间通信机制,它主要用于解决任务间的互斥和同步。针对不同类型的问题,有以下三种信号量:

Ÿ         二进制信号量使用最快捷、最广泛,主要用于同步或互斥

Ÿ         互斥信号量 主要用于优先级继承、安全删除和回溯;

Ÿ         计数器

VxWorks还提供POSIX信号量和多处理器上信号量的应用。

1.1.1.消息队列

现实的实时应用由一系列互相独立又协同工作的任务组成。信号量为任务间同步和联锁提供了高效方法。单处理器中任务间消息的传送采用消息消息队列。消息机制使用一个被各有关进程共享的消息队列,任务之间经由这个消息队列发送和接收消息。 任务间全双工信息传送

1.1.2.管道

管道用VxWorksI/O系统提供一种灵活的消息传送机制,它是受驱动器pipeDrvVxWorks所提供)管理的虚拟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()          从消息队列接收消息