基于RTAI的嵌入式Linux硬实时性能的研究与实现
0 引言
Linux是一种能运行于多种平台、源代码公开、免费、功能强大、遵守POSIX标准、与Unix兼容的操作系统。随着嵌入式系统的不断发展和应用,嵌入式Linux操作系统也在各方面得到了广泛的应用。但是,作为通用操作系统的Linux,要应用在嵌入式领域,需要作必要的改进。在电能质量监控等对实时性要求较高的领域,需要将最初按照分时系统目标设计的Linux改造成能支持硬实时性的操作系统。
uClinux操作系统是Linux操作系统的一个嵌入式变种,它作为一种优秀的嵌入式操作系统具有很好的稳定性和优异的网络性能,但是它的实时性差,尤其不支持硬实时任务的特点却极大地限制了其应用。本文利用RTAI对uClinux的实时性进行了扩展,并应用于电能质量监控实验平台,对系统改造前后的实时性能进行了对比分析。
1 嵌入式Linux的实时性分析和扩展
实时系统分为两类,分别为软实时(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。
2 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关中
- 嵌入式Linux技术在工业控制网络中的应用(10-30)
- 基于嵌入式Linux的组态软件实时数据库的设计(02-01)
- 基于ARM+DSP的嵌入式Linux数控系统设计(11-18)
- 基于嵌入式Linux的细胞特征提取算法设计(11-19)
- 基于S3C2410的嵌入式Linux系统构建(03-02)
- 嵌入式Linux网络编程之:网络基础编程(08-13)