摘要: 本文简述了VxWorks下多任务间通信方式与实现方法,然后对各种方式及性能差异进行了比较和分析,并对其问题点给出了解决和优化方案。
关键词: VxWorks, RTOS, 任务间通信机制
Comparison and analysis of methods of inter-task communication in VxWorks
Li Jun
(Sun Star Network INC., Kawasaki 2100005, Japan)
Abstract: The Article reviews the methods and implementations of inter-task communication in VxWorks. Then, makes comparison and analysis on options and performance differences, and presents the solutions and optimization proposals for issues.
Key words: Embedded software; RTOS; Inter-task Communication
1.引言
VxWorks操作系统是Wind River公司设计开发的嵌入式实时操作系统(RTOS),其高性能的内核,友好的用户开发环境以及不断推出的升级版本使其拥有了越来越多的用户。本文讨论了作为其核心内容之一的多任务及任务间通信的各种方式与实现方法,对其性能差异进行了比较和分析,并给出了对一些问题点的解决和优化方案。
2.多任务与任务间通信
我们可以把任务看成是一段地址空间上的执行过程或者是一个执行中的程序。在单任务系统中,一个个独立的程序被先后执行,不存在同步(Synchronous)和互斥(Mutex),也不存在对共有资源的同时访问。
嵌入式系统具有快速响应和并发处理多事件的特点,通常是实时系统。多任务系统可以使多个事件得到快速的响应和并发处理。VxWorks具有实时多任务内核Wind。
在多任务系统中,为了协调各任务间的活动,我们需要使用任务间通信机制。VxWorks中,常见的通信机制主要有:
•共享内存机制(Shared memory)
•信号量机制(Semaphore)
•消息队列机制(Message queue)
•管道机制(Pipe)
此外,还有远程调用(RPC),Signal等其他通信机制,由于在实际使用中并未得到上述4种那样广泛和充分的利用,在本文中不做讨论。
3.各通信方式的比较/分析与优化方案
3.1.共享内存机制
共享内存是任务间通信常用的一种方法。通常情况下,各任务的内存空间在系统管理下是互不干扰的,但是在任务间通信时,需要对一些内存空间进行共享(如图1)。实现内存共享最简单的办法是将想共享的数据(包括各种数据结构)定义成全局变量。
图1
共享内存最大的好处就是便利,高速,但也有很大的危险性,当该内存区域同时被不同任务访问和修改时就很难保证数据的整合性。解决这一问题的办法对共享内存部分进行访问上锁。这中间有3种主要方法,包括中断上锁,抢占上锁和使用信号量(后文介绍)。
中断上锁保证了对CPU的独占。在上锁期间,即使中断产生也不会切换到中断服务程序(ISR)。这样的后果其他处理延迟,甚至导致超时异常等。
抢占上锁是任务级的,它禁止当前执行任务被其他任务抢占。虽然和中断上锁相比,抢占上锁相对较弱,但也同样会造成其他与本数据访问毫无关联的任务被延迟,破坏系统实时性,甚至导致异常。
3.2.信号量机制
信号量这一概念是荷兰计算机科学家E.W. Dijkstra首先提出来的,被广泛使用于任务间通信,同步,互斥中。
VxWorks中,信号量包括二进制信号量,计数器信号量,互斥信号量等。二进制信号量可用于同步和互斥,由于其系统开销小,速度快的特点,非常适合嵌入式软件。其基本原理可以参考图2。计数器信号量在二进制信号量基础上增加了计数功能,可以解决一个资源多个实例需要保护的情况。互斥信号量则可以解决内在的互斥问题,优先级继承,删除安全和递归等情况。
图2
信号量的问题在于无法实现一个任务与多个任务的通信且无法附带更多的信息。不过 总的来说,信号量机制系统开销小,通信速度快,处理方法简便,是多任务间通信的首选手段。
3.3.消息队列机制
消息队列是相对比较高级的一种任务间通信方式,实现起来也比信号量机制复杂。使用消息队列进行任务间通信实际上是非同步的,送信任务与收信任务并不需要同时进行数据和信息的交换。可以有多个任务往一个消息队列中发送消息,也可以有多个任务从一个消息队列中去取的消息,如果一直没有任务去取得消息的话,消息将一直囤积直到达到最大长度。消息队列机制原理可以用图3来描述。
图3
在VxWorks中,消息队列是一种系统开销较高的通信机制,当送信消息长度过长时,送信的效率将会下降,这对于实时性要求比较高的系统来说有可能导致等通信超时问题。一个解决该问题的办法是为送信的实际内容单独开一个内存区域,送信时,不是直接传送信内容,而是将送信内容拷贝至QUE_BUFF内存区域后,将该内存区域的指针做为送信内容送信。收信TASK收到该送信内容后,通过指针到QUE_BUFF内存区域去取得实际的信息内容。由于在一个时间瞬息,有可能有多个任务在往消息队列中送信,这个QUE_BUFF最好是做成是由某个数据结构构成的数组或者链表,然后定义一个对该数组或者链表进行控制管理的数据结构QUE_BUFF_CTL。该数据结构可以包括头指针,尾指针,QUE_BUFF的使用量等信息。在送信时取得一个QUE_BUFF使用域,在收信时进行归还。当然,对QUE_BUFF_CTL进行修改时,需要配合信号量制御进行互斥操作。
3.4.管道
VxWorks中,管道是一种由pipeDrv驱动程序管理的虚拟I/O设备。管道在许多时候可以代替消息队列,使用方法一般也比消息队列简便。由于管道是I/O设备,这样就使得它和其他标准VxWorks I/O一样可以使用select机制,从而可以方便的实现与多个异步I/O设备一起工作。
4.总结
本讨论了VxWorks中几种主要的通信机制的优点和问题点,在系统设计与开发中,合理的通信机制可以优化整个的系统性能。在复杂的系统中,往往不可能只使用一种通信机制,而且根据各通信机制特点灵活选用多种多种通信机制,已达到设计开发出高效率系统的目的。
参考文献:
1. VxWorks Reference Manual: Libraries. first edition, http://www.win-driver.com/products/html/
manuals.html
2. Tornado User’s Guide(Windows Version)2.0. first edition, http://www.windriver.com/pdf/
win_guide.pdf
3. 孔祥营, 柏桂枝. 嵌入式实时操作系统VxWorks及其开发环境Tornado[M]. 中国电力出版社, 2002
4. 王金刚, 宫霄霖, 杨锡劢、苏淇、丁大尉、姜平. 基于VxWorks的嵌入式实时系统设计[M]. 清华大学出版社, 2004
论文邦-值得您信赖的代发论文公司,论文发表网代理教育论文发表、医学论文发表、经济论文发表、建筑论文发表、职称论文发表等论文发表服务!