vxworks任务通信机制
VxWorks支持各种任务间通信机制,提供了多样的任务间通信方式,主要有如下几种:
Ÿ
Ÿ
Ÿ
Ÿ
Ÿ
在多处理器之间的任务也可采用共享内存对象来实现任务间通信,只是在系统配置上有所不同.
1.1.1.共享存储区
任务间通信的最简单的方法是采用共享存储区,也即相关的各个任务分享属于它们的地址空间的同一内存区域。因为所有任务都存在于单一的线性地址空间,任务间共享数据。全局变量、线性队列、环形队列、链表、指针都可被运行在不同上下文的代码所指向。
1.1.2.互斥
当某一地址空间用于数据交换时,为了避免冲突,对于内存的锁定是非常重要的。两个或多个任务读写某些共享数据时,最后的结果取决于任务运行的精确时序,有可能得到错误值,这样必须以某种手段确保当一个任务在使用一个共享变量或文件时,其他任务不能做同样的操作。主要有关中断、抢占禁止和用信号量锁定资源等方法。(vxworks任务调度机制为中断抢占,优先级抢占(需要触发条件,触发条件就是中断)和任务使用taskdelay直接放弃CPU)一般来说,关中断是最有效的解决互斥的方法。但这对于实时应用来说,它阻止系统对外部事件的响应,无法满足实时性的要求。同样,中断延迟也是不能接受。
1.1.3.信号量
Ÿ
Ÿ
Ÿ
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()
msgQCreate()
msgQDelete()
msgQSend()