Vxworks下主控并行处理分析*
2013-10-16朱辉庆
朱辉庆
(海军驻杭州地区军事代表室 杭州 310012)
1 并行处理特点
并行[1]是一种自然现象。在现实世界中,任何时候都会有许多事件同时发生。当设计软件以监测和控制现实世界中的系统时,就必须处理这种自然的并行。此外并行处理可提高处理速度、提高系统的可控性。但当处理软件系统中的并行问题时,常常有两个非常重要的方面:能够检测并响应以任意顺序出现的外部事件;确保在要求的最短时间内作出响应。
如果各个并行活动独立进行(即以完全平行的方式进行),问题就相对简单:只需建立单独的程序来处理每项活动。设计并行系统之所以困难,主要是由并行活动之间的交互造成的。当并行活动进行交互时,共享资源需要加以控制和协调。
公路交通系统可作为一种形象的类比。不同道路上的平行车流基本上不会相互影响,所以很少产生问题。相邻车道上的平行车流为了交互时的安全,需要作一些协调。而在十字路口则会发生非常剧烈的交互,在这里需要进行周密的协调。因此,许多实时软件系统都必须“反应灵敏”,而且可能在任意时间以任意顺序产生、执行。
图1 公路交通系统
但并行软件它有许多困难,大多数计算机和编程语言从发明之日起就属于顺序设计。一个过程或处理器在某一时刻只执行一条指令。而很多中小系统只有一个处理器,在单个顺序处理器中,必须通过交替执行不同任务来造成并行的假象。困难并不在其技术细节上,而在于决定何时和如何交替执行可能交互的程序段。
对于多个处理器,并行虽然很容易实现,但是交互情况却变得更加复杂。首先,运行于不同处理器上的各项任务之间的通信就存在问题。由于通常要涉及到软件的若干层次,因而会增加复杂性和定时开支。由于时钟和定时有可能不同,而各构件又可能会分别发生故障,所以多CPU系统的确定性也会有所降低。
要支持并行,系统必须提供多个控制线程。控制线程的抽象可由软件和硬件通过多种方式来实施。最常用的机制为以下某种机制的变形即多处理、多任务、基于应用程序的解决方案。当操作系统提供多任务时,常见的并行单元为进程。各进程可能有三种状态:1)阻塞―等待接收某一输入或获得某一资源的控制权;2)就绪― 等待操作系统安排它执行;3)运行―实际使用CPU。
此外,通常会给进程分配相对的优先级。操作系统内核根据进程的状态、优先级以及某种调度策略来确定在任一给定时刻应当运行哪一个进程。实际上,多任务操作系统在其所有进程中共享一个控制线程,争用共享资源。
2 Vxworks下多任务共享数据并行控制与缓存
Vxworks[2~8]是一个运行在目标机上的高性能、可裁减的嵌入式实时操作系统,Vxworks实时内核—Wind提供了基本的多任务环境[9~10,13]。
多任务在单个处理器上构造出多线程并发执行的假象,实际上,系统内核是根据某个调度算法交替执行的。每个任务拥有各自的上下文,即拥有各自的CPU环境和系统资源,并保存在任务控制块(TCB)中。
任务的上下文包括:
·任务的执行点(任务的程序计数器);
·CPU中的寄存器和浮点寄存器;
·动态变量和函数调用所需的堆栈;
·I/O操作分配的标准输入、输出和标准错误输出操作;
·一个延时定时器;
·一个时间片定时器;
·内核控制结构;
·信号句柄;
·用于调试和性能监视的值。
与其他操作系统一样,任务执行是首先必须建立任务,激活任务。在Wind内核中,默认算法是基于优先级的抢占式调度算法,但在优先级相同情况下,可使用轮转调度算法,任务间一般用访问共享数据结构、消息队列等,在Vxworks中信号量被高度优化,并提供了最快的任务间通信机制。信号量是互斥和同步的最主要手段。在Vxworks实时处理系统中各任务间互斥和同步是至关重要的,以一个发射机发射与综合处理机状态查询两个任务为例进行说明。
具体工作过程为发射机接收综合处理机发射命令,发射一定时间信号,同时另一个任务综合处理机以一定周期进行状态查询,如两个任务工作正常时时序见图2。
图2 工作时序图
但由于综合处理机控制软件不一定同步,有可能使“状态查询命令”的实时发射时间落在“禁止综合处理机发送命令”期间,则造成的结果是综合处理机控制已向接口(综合处理机内一个接口管理CPU)发送了“状态查询命令”,但接口控制模块由于发射机的禁止发送而将命令丢弃,从而使发了“状态查询命令”,但收不到发射机的“状态信息”并处于等待状态,一旦超过设定时间限制,综合处理机会判发射机故障,造成虚报。为此若增加一个同步、互斥量就可避免此现象,即在定时查询时在一个周期内将发射启动至发射结束这一期间提出,并在两个任务之间加一个握手,在发射任务内设置一个信息表示正在发射,排斥其他任务查询发射状态,等到该信息量清空时,其他时间内仍可定期查询,当然,除此方法外,还有其他办法,在此举例只是为了说明Vxworks下同步与互斥的重要性。
在Vxworks中实时大流量命令控制及处理任务并行,尤其是许多设备响应时间不一时,共享数据的栈缓存的控制也很重要,以综合处理机的命令接收、命令处理两个并发任务为例进行说明。其中:
·命令接收任务完成操控台不断发来的命令,并缓存进栈;
·命令处理任务完成从共享栈中取出命令,并进行命令分类、响应;
·状态查询任务完成中央控制件对外各设备状态查询。
设栈长度为64,则综合处理机用接收任务接收命令并将IP指针加1,命令处理任务读走一条命令响应,IP减1,但由于两个任务公用一个栈,而且任务间处理速度相差较大,栈的管理算法很有讲究,对栈的操作同样有一个同步与互斥问题,在实际实时系统中往往由于同步与互斥没处理好,使得命令处理任务读出了无效命令即部分命令参数被命令接收任务所修改,在对栈空与满处理上也很容易发生误判,导致实时系统工作效率低,易造成接口间死机。
此外,在Vxworks下许多实时信号处理系统中处理机一般都通过VME总线对多块DSP板共享内存进行访问,如图3所示。
图3 DSP与主控数据交换示意图
如果RAM中数据格式示意如图4:
图4 RAM中数据格式示意图
从图4中可以发现,处理机的主控与DSP板之间的数据交换最好采用软握手同步方式,由于主控是一个多任务系统,DSP板也是多CPU的处理,工作流程正常情况下按常规DSP写数,主控然后去读数一般是不会有问题,这可以通过信号处理算法及硬件速度进行设定,但当主控流程或DSP处理流程受其他接口、任务干扰后,DSP与主控之间的数据交换时序易“错位”,从而使主控读不到传送数据有效标志,也就不会去读RAM上画面显示数据,如果在DSP和主控之间增加一个软握手信号,即DSP在数据写入时增加判断主控标志是否为0,为0则可写入,为1时就进行等待,主控读出时判断DSP标志是否为0,0时表示数据可从RAM读出。
3 结语
Vxworks是目前较流行的一种嵌入式操作系统,在此环境下进行多任务系统开发,不但有一般多任务系统的共性,还有其特殊性,本文用工作中实际例子加以说明任务间同步和共享管理,起一个抛砖引玉作用。
[1]陈国良.并行计算结构、算法、编程[M].北京:高等教育出版社,1999.
[2]李方敏.Vxworks高级程序设计[M].北京:清华大学出版社,2004.
[3]罗国庆.Vxworks与嵌入式软件开发[M].北京:机械工业出版社,2003.
[4]陈育智,温彦军,陈琪.Vxworks程序开发实践[M].北京:人民邮电出版社,2004.
[5]李方敏.Vxworks高级程序设计[M].北京:清华大学出版社,2004.
[6]周启平,张扬.Vxworks程序员速查手册[M].北京:机械工业出版社,2005.
[7]WindRiver.Vxworks Kernel Programmer’s Guide.6.8.USA:WindRiver Systems,Inc,2009.
[8]WindRiver.Vxworks Application Programmer’s Guide.6.8.USA:WindRiver Systems,Inc,2009.
[9]WindRiver.Vxworks WorkBench User’s Guide.3.2.USA:WindRiver Systems,Inc,2009.
[10]WindRiver.Vxworks WorkBench Host Shell User’s Guide.3.2.USA:WindRiver Systems,Inc.2009.
[11]唐力强,王行祥.嵌入式VxWorks系统下的CPCI设备驱动程序开发[J].计算机与数字工程,2011,39(1).
[12]胡俊.基于VxWorks操作系统的WindML图形操控界面实现方法[J].计算机与数字工程,2011,39(11).
[13]孔祥营,柏桂枝.嵌入式实时操作系统Vxworks及其开发环境Tornado[M].北京:中国电力出版社,2002.