另外,测试过程的计时功能通过CPLD编程实现,与传统的利用RTOS内核的时间系统调用计时方式相比,解决了不同操作系统系统调用返回值精度不够、单位不统一的问题。由于比对平台中的CPLD器件选用的是Xilinx公司的XC9500系列,其最高系统时钟频率为100 MHz,引脚到引脚的最大时延为10 ns,因此实现的计数器计时精度可以达到数十ns,几乎可以忽略不计,极大提高了计时精度,如图5所示。 740)this.width=740" border=undefined> 图5 CPLD测试、计时方法 整个测试过程主要分为4部分:准备工作,内核测试程序编程,CPLD编程,与外界交互部分的实现。准备工作包括编译内核、修改Bootloader等,Bootloader通过对ibootlite1.8进行修改,使其可应用于比对平台上;内核测试程序按照前面所提到的6个指标,划分为6个模块,分别编写;CPLD编程主要包括计时程序、中断负载加载程序等;外界交互部分主要包括串口通信、以太网卡驱动。下面是部分CPLD上的VHDL程序源码。其中,fenpin为时钟频率,flagreci为接收信号;当使用按键人工控制时,flagsend和flagstop为计时开始和结束。 process(fenpin,flagsend,flagreci,flagstop) begin flag<=flagsend & flagreci & flagstop; if(fenpin′ event and fenpin='1') then if(flag="0010000") then if(tempsendout="0000000000000111") then tempsendout<=tempsendout; else tempsendout<=tempsendout+'1'; end if; countout<=countout+'1'; if(tempsendout="0000000000000111") then outsend<='0'; outsendled<='0'; iscounting<='1'; else outsend<='1'; outsendled<='1'; end if; else iscounting<='0'; signdisp<='1'; end if; end if; end process; 测试程序的代码较多,这里不一一列出,仅给出程序中嵌入的与CPLD交互的部分代码片段供参考。 #define base_add (*(volatile unsigned *)0x40E00000) #define gpio3_derect (*(volatile unsigned *)(0x40E00000+0x0C)) #define gpio3_out1 (*(volatile unsigned *)(0x40E00000+0x18)) int to_CPLD(void) { gpio3_derect = 0x8;//设置引脚为输出 gpio3_out1 = 0x8;//输出一个高电平 } 代码的前段定义了相关寄存器的地址,在测试过程中,使用PXA255的GPIO3引脚与CPLD交互,实现计时功能。由于需要在内核态运行,故该函数作为一个模块编译进内核,测试程序中通过ioctl系统调用执行此段代码,将信号发送给CPLD,CPLD计算2次信号的间隔时间,实现计时功能。 3 Linux、WinCE的测试结果及分析 根据上述指标体系及测试方法,我们对Linux和WinCE进行了相关的测试。其中,Linux版本为2.4.19,WinCE版本为WinCE.Net。由于当硬件平台与运行环境不同时,即使同一内核运行时体现的性能指标也会不同,所以对不同RTOS的评测只有在相同平台环境下进行比对才有其价值,测试以评价为目标,评价以比对为依据。表1是对上述两种内核的评测结果。由于篇幅所限,这里只列出了平均时间,最大、最小值没有列出。 表1 Linux和WinCE比对评测结果指标 740)this.width=740" border=undefined>
从表1中可以看出,在任务切换时间、线程切换时间、系统调用平均运行时间几项指标中,Linux2.4.19和WinCE.Net相差不大;但在任务抢占时间、信号量混洗时间、中断响应时间几项指标中,WinCE.Net明显优于Linux2.4.19。总的来说,WinCE.Net的实时性优于Linux2.4.19。下面从两种操作系统的特点、内部实现机制等方面来解释说明上述测试结果。 Linux与WinCE均允许不同进程的优先级相同,这一点不同于μC/OS等实时内核(μC/OS中每个任务的优先级唯一),所以采用的调度算法都是抢占式和时间片轮转的混和式调度策略。因此,在同优先级的进程切换时,二者指标相差不大。 测试中使用的Linux2.4.19并非是为嵌入式实时系统设计的专用操作系统,只是对原有的通用内核进行了一定的裁剪;而WinCE.Net虽然也不是一个严格意义上的实时内核,但却是专门为嵌入式系统设计的。所以,在任务抢占和中断响应方面,WinCE要显著强于Linux。另外,Linux2.4.19在内核级并不支持抢占,这也是它的抢占时间大于WinCE的一个主要原因。不过,这一点在2.6版本的Linux内核中已经得到了解决。 系统调用效率上,WinCE.Net要优于Linux2.4.19,但是Linux的系统调用更加符合POSIX标准,更加规范,而且更加开放。 综上所述,在对实时性要求较高的嵌入式系统中,WinCE.Net要比Linux2.4.19更加适用,并且WinCE.Net在开发类桌面系统中继承了微软的一贯优势,使得开发更加容易。但是,如果系统的实时性要求不高,Linux也许是更合适的选择,因为使用它可以降低成本,并且完全对用户透明,便于修改定制。若想使用Linux作为操作系统开发实时性要求较高的系统,则应对其做适当的实时性改造,或者直接使用已经过实时改造的Linux内核,如RTLinux等。 4 总结与展望 本文介绍的测试方法与传统的纯软件测试方法相比,具有精度高、易于比对的特点,且测试的复杂度并没有显著地增加;与单纯的硬件测试方法相比,具有性价比高、需要设备少、扩展性强等特点,且测试精度差别不大,但功能不如逻辑分析仪、示波器等专用硬件设备强大。本文介绍的嵌入式操作系统实时性指标体系还有着较大的完善和扩展空间,每一个指标都可以进一步细化。若能在不同的负载条件下利用本文的测试方法进一步测试,则可使得测试结果更加全面客观。 参考文献 [1] Krishma C M,KangG Shin.RealTime Systems.McGrawHill Companies,Ins 1997. [2] Furht B,Grostick D,Gluch D.RealTime UNIX Systems Design and Application Guide[M].Kluwer Academic Publishers,1991. [3] Boling D.Programming Microsoft Windows CE[M].Edition 2.Microsoft Publishers,1999. [4] Heursch A C.Preemption concept, Rhealstone Benchmark and scheduler analysis of Linux 2.4[J].RealTime & Embedded Computing Conference,Milan,November 2728,2001. 李庆诚(教授、博士生导师),主要研究方向为嵌入式系统、数字文档格式及数字水印等; 唐德凯(硕士),主要研究方向为嵌入式操作系统。 |