Linux是一种能运行于多种平台、源代码公开、免费、功能强大、遵守POSIX标准、与Unix兼容的操作系统。随着嵌入式系统的不断发展和应用,嵌入式Linux操作系统也在各方面得到了广泛的应用。但是,作为通用操作系统的Linux,要应用在嵌入式领域,需要作必要的改进。在电能质量监控等对实时性要求较高的领域,需要将最初按照分时系统目标设计的Linux改造成能支持硬实时性的操作系统。
uClinux操作系统是Linux操作系统的一个嵌入式变种,它作为一种优秀的嵌入式操作系统具有很好的稳定性和优异的网络性能,但是它的实时性差,尤其不支持硬实时任务的特点却极大地限制了其应用。本文利用RTAI对uClinux的实时性进行了扩展,并应用于电能质量监控实验平台,对系统改造前后的实时性能进行了对比分析。
实时系统分为两类,分别为软实时(Soft Real-Time)和硬实时(Hard Real-Time)。软实时是统计意义上的实时,并不能保证特定的任务在特定的时间内完成,即便是处理时间超过了截止时间,结果也是有意义的。而硬实时是时间要求必须严格保证的实时,如果系统对某个实时任务的处理未能在某个截止时间开始或者结束的话,会产生不可预料的后果。因此,硬实时才是真正意义上的实时。Linux虽然也可采取基于优先级的调度策略,并且也将进程分为实时进程和非实时进程,但是Linux的以下几点特征决定了其本身很难完成硬实时的任务:
1) Linux的内核是不可抢占的。如果Linux的核心态进程在运行时,其他进程不管优先级多高都需要等待处于核心态的系统调用返回后才能执行。
2) 为了保护临界区资源,互斥的访问临界区,Linux采用在临界区操作时屏蔽中断的方式,这抑制了系统及时响应外部操作的能力。
3) Linux内核(2.6版本以前)采用了较大时间粒度的定时器,时钟中断周期为10ms,加大了任务响应的延迟,无法满足对时间精度要求苛刻的实时应用。
目前实现Linux系统的硬实性的方法,依据是否对Linux的内核进行大规模修改,可以大致分为两类:对内核进行大规模修改的兼容内核方法和对内核进行小规模改动的双内核方法。后者由于对内核改动小,效果明显且遵守GPL得到了更加广泛的推广。它在Linux内核之外,以可加载内核模块(Loadable Kernel Module)的形式添加实时内核,并用该实时内核接管来自硬件的所有中断,并依据是否是实时任务决定是否直接响应。这种方法的代表就是新墨西哥州立大学的FSM实验室推出的RT-Linux和由意大利米兰理工学院航天工程系发起的RTAI。
RTAI是实时应用接口Real Time Application Interface的缩写。它在Linux上定义了一组实时硬件抽象层RTHAL(Real Time Hardware Abstraction Layer),RTHAL将所有需要的Linux内部数据和函数的指针集合到一个rthal的结构中。Rthal结构用于截取Linux硬件操作,在双内核结构工作时,它们可以被RTAI重定向,以取代Linux中原有的函数;同时RTAI只是用此程序界面与Linux进行沟通。通过这种方法就可以把对Linux内核源码的改动程度降到最低,可以避免RT-Linux方案对Linux内核源码改动过大的问题,便于在不同Linux版本之间的移植。
RTAI严格来说只是一个具备了操作系统核心功能的实时的系统内核,它接管了所有的硬件资源,将Linux操作系统内核作为它的一个低优先级的任务来运行。RTAI 是一个完全的占先式内核,它具备了实时操作系统的诸多特性,如实时的中断响应,任务对事件的实时响应,细粒度的原子操作等。在RTAI/Linux双内核结构下,实时性的任务在RTAI的调度下运行,非实时性和需要利用完善的操作系统功能的任务在Linux调度下运行。由于Linux操作系统在RTAI下具有的优先级很低,当且仅当RTAI没有实时任务调度时,Linux才能够得到运行。RTAI/Linux双内核结构如图1所示。
图1 RTAI/Linux双内核结构图
Fig1 Architecture of the RTAI/Linux system
RTAI以Linux的内核模块的形式运行,提供双内核的实时服务。最基本的两个模块是rtai_module和rtai_sched_module,另外还有三个增强功能的模块rtai_fifos_module、rtai_shm_module和rtai_lxrt_module。
rtai_module是一个核心模块,RTHAL在这一模块里实现,完成对硬件的接管。以关硬件中断行为为例说明,Linux系统中原有的关中断函数#define _cli_asm_volatile_(“cli”:::”memory”)直接通过汇编语言对硬件进行操作,而在rtai_module模块中,Linux中的关中断函数被替换为执行{processor[hard_cpu_id()].intr_flag = 0;}。可见,Linux关中断的执行只是改变了RTAI中的中断标志位,并没有直接对硬件进行操作。
rtai_sched_module模块主要实现一个实时的任务调度,调度器基于优先级且为可抢占式的;rtai_fifos_module是管道先入先出模块,负责实时应用与Linux应用之间的通讯;rtai_shm_module模块实现共享内存的通讯方式;rtai_lxrt_module允许在用户空间使用RTAI的系统服务和调度期。
电能质量问题在电能的生产以及消费单位越来越得到关注,这就要求有更加先进的电能质量监测、控制装置与其配套。在线式电能质量监测设备更多的投入了使用,这些设备大多采用嵌入式的系统结构,在恶劣的条件下完成现场数据采集、运算、控制以及通讯等一系列的任务。这些任务必须满足严格的时序关系,并且需要有很高的响应速度,因此对于系统实时性提出了很高的要求。一个典型的基于嵌入式Linux的在线式电能质量监控器硬件结构框图如图2所示:
图2 在线式电能质量监控系统结构图
Fig2 Architecture of an online power quality monitoring and control system
实验平台选用Freescale的MCF5249嵌入式微处理器完成了一套如图2所示的在线式电能质量监控系统,微处理器内部工作频率为120Mhz,性能达125 Dhrystone 2.1 MIPS,外配4M FLASH和8M SDRAM存储器。软件方面,成功移植RTAI-uClinux双内核系统至此硬件平台,并且针对实际应用对系统的实时性进行了测试和分析。
电能质量监控系统需要周期性的对A/D转换芯片进行采样,并且某些实时性较强的控制算法要求核心任务被重新调度的周期很短,因此系统对周期性实时任务的支持非常重要。
进行实验如下:分别在uClinux和RTAI-uClinux下利用定时函数设计周期性的高优先级任务,每一周期切换一次I/O口的电平,找出各自可分辨的稳定的最小任务周期。
在处理器中等负荷条件下,实验结果如表1所示:
操作系统 |
方波最小周期 |
任务的最小周期约 |
uClinux |
40.002 ms |
20 ms |
RTAI/uClinux双内核 |
110.19 us |
55 us |
表1 时间分辨率实验结果分析表
Table1 Analysis of the time resolution experiment
例如,在RTAI-uClinux系统中在不同的定时周期下的实验波形图如图3图4所示。当定时周期较大时系统稳定运行,而过小的定时周期(<50us)会使系统运行变得不稳定。
图3 定时周期大于100微妙时的试验波形图
Fig3 Oscillogram of the system output when cycle > 100us
图4 定时周期小于50微妙时的试验波形图
Fig4 Oscillogram of the system output when cycle < 50us
从实验结果可以看出,uClinux操作系统难以完成周期小于20ms以下的周期性任务,因此对于周期性的A/D采样以及高实时控制很难实现,经过改造后的RTAI/uClinux双内核结构时间分辨率低于100us,完全可以满足电能质量控制器在A/D采样等方面的实时性周期任务。
中断的响应速度是实时控制系统的重要指标,例如在A/D采样和计算完成后,系统需要控制进程尽快地被调度执行,以执行正确的控制策略。对于一个支持硬实时任务的系统来说,除了测试系统的平均响应速度外,还需要测试系统在最差情况下的响应速度以及处理器的负荷状况对系统响应速度的影响。
设计实验如下:利用一个外部的DSP帮助测量系统的中断响应速度。DSP2407在启动内部定时器后,将MCF5249的一个I/O引脚状态改变,MCF5249内部的高优先级进程在引脚状态改变并且被重新调度后,立即将DSP2407的指定I/O引脚置高,DSP2407在其指定的I/O引脚被置高后停止定时器。利用DSP2407的定时器可以精确的计算出从MCF5249引脚状态改变至MCF5249内部进程响应之间的时间间隔,从而确定MCF5249内部进程的响应速度。改变MCF5249处理器的负荷,重复实验,在每种情况下重复实验过程1000次,找出不同情况下系统响应的平均速度以及最慢响应速度。
操作系统 |
处理器负荷轻 |
处理器负荷较重 | ||
平均响应时间 |
最慢响应时间 |
平均响应时间 |
最慢响应时间 | |
uClinux |
120us |
12ms |
221ms |
795ms |
RTAI/uClinux |
25us |
27us |
27us |
30us |
表2 响应速度实验结果分析表
Table2 Analysis of response speed experiment
从实验结果可以看出,在处理器负荷较轻时uClinux系统有着良好的响应性能,但是在最差情况下,系统响应速度较慢,响应时间达到了12ms,随着处理器负荷的进一步加重,uClinux系统的响应速度急剧下降,对于控制系统,尤其是硬实时系统来说,这是不可接受的,因为中断响应速度直接影响到控制系统的反应速度。而RTAI-uClinux双内核系统在处理器负荷变化时,系统的响应速度变化不明显,而且中断响应速度始终稳定在微妙级,适合作为硬实时系统的控制系统。
RTAI可以显著改进嵌入式Linux系统的实时性能,已经用于电能监控系统,通过对比试验可以看出RTAI-uClinux双内核的系统具有良好的硬实时性能,使得嵌入式Linux系统在高实时性领域中可以得到实际的应用。
参考文献:
[1]Lineo, Inc. RTAI Programming Guide 1.0. September 2000
[2] E. Bianchi,L.Dozio,P.Mantegazza.A Hard Real Time support for LINUX. www.aero.polimi.it/projects/rtai/
[3]MCF5282 ColdFire® Microcontroller User’s Manual. http://www.motorola.com/coldfire
[4] 齐俊生,崔杜武,黑新宏.嵌入式Linux硬实时性的研究与实现.计算机应用.2003, 23(6):34-36;Qi Junsheng,Cui Duwu,Hei Xinhong. Research and Implementation of Hard Real2time Performance of Embeded Linux. Computer Applications. 2003,23(6):34-36;
[5] 陈继荣,黄建华. Linux操作系统实时性分析及改进策略.微计算机信息.2005,22:67-69;Chen Jirong, Huang Jianhua. Linux Operating System Real- time Analysis and Improvement Strategy. Control & Automation. 2005, 22:67-69;
[6]须文波,张星烨,欧爱辉.基于RTAI-Linux的实时操作系统的分析与研究.现代计算机.2005,163(5):19-21Xu Wenbo, Zhang Xingye, Ou Aihui. Analysis and Research on Real-Time Operating System based on RTAI-Linux. Modern Computer. 2005, 163(5):19-21