对嵌入式Linux进行实时性改进是嵌入式操作系统领域的一个研究热点。本文在分析了现有嵌入式操作系统实时性不足的基础上,提出了一种新型的改进方案(将RTAI和uClinux相结合),并给出具体的工控应用实例,进一步对这种系统的功能进行有效验证。
图1 双内核实时系统嵌入式实时Linux架构 嵌入式Linux以代码开放、价格低廉、功能强大又易于移植的特性正在被广泛应用,为嵌入式操作系统提供了一个极具吸引力的选择。但许多实际应用,譬如多媒体通信、生产过程控制、在线事务处理等等都要求对外部事件在限定的时间内做出反应。因而嵌入式系统实时性问题越来越受到关注,对嵌入式Linux进行实时性改进也成为嵌入式操作系统领域的一个研究热点。
本文提出了一种基于uClinux的嵌入式实时操作系统方案。将RTAI和uClinux相结合,既满足了嵌入式应用的需求,同时又保证了系统的硬实时性。此外,还有强大的网络功能、易升级性、易移植性等优点。最后结合基于这一操作系统开发的重大装备远程监控系统的应用案例,进一步从功能和性能上对其进行验证。
现有嵌入式操作系统应用中存在的问题
一个优秀的嵌入式操作系统是嵌入式系统成功的关键。它除了具备一般操作系统最基本的功能,如任务调度、同步机制、中断处理、文件功能等,还需要具有以下特点:
1. 更好的硬件适应性,也就是良好的移植性; 2. 占有更少的硬件资源; 3. 高可靠性; 4. 提供强大的网络功能,支持TCP/IP协议及其他协议; 5. 有些应用要求具有实时性能。 现有的嵌入式操作系统大致可分为商用型和免费型两类:商用型操作系统由于功能稳定、可靠,有完善的技术支持和售后服务,在嵌入式市场占有一定的份额。但它同时也存在价格昂贵、需要版权、源代码不公开等一系列问题;免费型操作系统(如Linux)源码公开,有价格方面的优势,但在严格满足嵌入式实时应用需求方面还有欠缺。
图2 实时内核实现机理 RTAI对Linux的实时性改进 现有几种针对Linux的实时系统解决方案,实现方法主要包括两种:
1)直接修改Linux内核、增加实时性,如:Montavista;
2)在普通Linux内核之上增加实时模块、双内核结构,如:RTLinux或RTAI。
Montavista可以满足用户的软实时要求,RTLinux或RTAI着重增强Linux的硬实时特性。软实时系统的时限是柔性灵活的,它可以容忍偶然的超时错误。失败造成的后果并不严重,仅仅是轻微地降低了系统的吞吐量。硬实时系统有一个刚性的、不可改变的时间限制,它不允许任何超出时限的错误。超时错误会带来损害甚至导致系统失败、或者导致系统不能实现它的预期目标。
RTAI采用双内核方法,不直接使用Linux的任何功能,而是把需要高度时间精度的工作写成一个驱动程序的形式,然后直接用PC时序芯片所产生的中断调用这个驱动程序。RTAI与NMT RT-Linux的最大不同之处在于,它在Linux上定义了一组实时硬件抽象层(RTHAL)。RTHAL将RTAI需要在Linux中修改的部分定义成一组程序界面,RTAI只使用这组界面和Linux沟通。这样做的好处在于,用户可以将直接修改的Linux核心程序代码减至最小,这有可能使得将RTHAL移植到新版Linux的工作量减至最低。
但是,RTAI虽然满足了硬实时性要求,却没有被裁减为足够小且适用于嵌入式系统。
RTAI+uClinux的实时方案 uClinux是为嵌入式应用设计的,它本身并没有更多地关注实时问题。uClinux经过小型化改造,形成了一个高度优化、代码紧凑的嵌入式Linux,并保留了Linux大多数的优点。它专门针对无MMU的CPU,去除了普通Linux内核中的虚拟内存管理部分。更重要的是,uClinux提供了完整的TCP/IP协议栈,并支持大量其他的网络协议,为嵌入式系统提供了强大的网络支持。
而从前面的分析可以看出,RTAI是基于普通Linux内核,相对于嵌入式应用其内核过于庞大;而uClinux本身并没有更多地关注实时问题。因此,可以将RTAI和uClinux相结合,采用双内核的设计方案,既满足了嵌入式应用的需求,又保证了系统的硬实时性。
1.硬件抽象层 图3 系统中断处理流程图 系统的实现基础是硬件抽象层,通过硬件抽象层进行硬件管理,把基本内核和实时内核结合在一起,其中一个内核的改变,不会影响另一个内核的执行。
硬件抽象层定义了本系统同硬件之间的抽象接口,主要用来截取硬件中断,并且依据实时内核调度器的需求,重定向为基本内核任务或是实时任务。RTHAL包含一个关键的组件:中断描述符表(IDT,Interrupt Descriptor Table),它定义了一套指针用来处理中断例程。RTHAL本身定义了一个结构,使得基本内核中断处理函数能够很容易地被实时处理函数所替代。这样,当实时内核通过RTHAL激活后,新的IDT表为合法。在以上控制下,基本内核作为实时系统的任务提供服务。
2.双内核结构 双内核实时系统的总体结构模型如图1所示,主要包含了基本内核、实时内核、硬件抽象层、硬件部分。
其中基本内核(uClinux)和实时内核(RTAI)分别处理非实时和实时任务的调度和执行,而实时任务和非实时任务之间信息的交换要通过管道(FIFO)或共享内存(MBUFF)来实现。当实时任务运行时,基本内核被硬件抽象层屏蔽。即实时内核将基本内核作为优先级最低的一个任务来运行,只有在没有实时任务运行的时候才予以调度。
3.实时内核动态加载 嵌入式实时Linux的实时内核是动态加载的。实时任务被激活前,实时内核并没有启动,基本内核通过RTHAL透明访问硬件,就像RTHAL不存在一样。当实时任务被激活时,RTHAL结构发生变化,基本内核被实时内核接管,图2表明了实时内核启动前后,系统发生的变化。
4.调度处理 当中断到来时,实时内核判断它是基本内核中断还是属于实时中断,分别进行处理。若是基本内核中断,如果当前有实时任务正在运行,则只是设置一下中断标志位,悬挂此中断,如果没有实时任务运行,则调用基本内核的中断处理程序;如果此中断是实时中断,就直接调用相对应的实时中断处理程序。注意,实时中断可以抢先基本内核任务的执行。系统的中断处理流程如图3所示。
应用案例 工业控制是嵌入式实时操作系统的传统应用领域,需要严格的实时处理功能、高可靠性和良好的开放性,对开发环境、可操作性、成本等也有特别的要求。因此本项研究以重大装备的远程监控系统作为其应用之一。
1.嵌入式远程监控系统结构
应用针对工业生产中使用的大型设备在连续运转状态下的远程监控问题,研究用于重大装备远程监控的嵌入式装置。系统主要包括输入/输出模块(NetIO)和输入/输出上位模块(NetWeb),前者用于实现现场数据的采集(输入),或用于现场装置的控制(输出),后者集成了Web功能,使得用户可以通过互联网对输入/输出模块进行访问。两类模块通过网络相连接,在本系统中为通过串行485总线。嵌入式远程监控系统结构如图4所示。
2.NetWeb对嵌入式Linux的功能验证
图4 嵌入式远程监控体系结构 NetWeb的开发基于前面介绍的嵌入式实时Linux操作系统。特殊的双内核操作系统结构决定了应用开发的特殊性。
1)任务管理功能 系统中的任务可以分为实时性任务和非实时性任务,实时任务包括实时数据采集、处理等方面,这部分的功能要在实时内核RTAI之上进行实现;另外,非实时任务主要包括数据存储、远程通讯的实现,这部分功能要在基本内核uClinux之上实现。
嵌入式实时Linux将实时任务与非实时任务分开管理,实施不同的调度策略和任务间通信方式,至于实时任务与非实时任务之间的通信可以通过实时的FIFO或共享内存实现。这样的功能使应用的编写简洁清晰、功能明确、调度灵活,方便了用户。
2)网络功能 嵌入式实时Linux实现了嵌入式互联网技术,将Web服务器引入到现场测试和控制设备中,在相应的硬件平台和软件系统的支持下,使传统的测试和控制设备转变为具备了以TCP/IP为底层通信协议,Web技术为核心的基于互联网的网络测试和控制设备。
嵌入式Web与传统Web应用相比,简化了系统结构,将信息采集和信息发布都集成到现场的测控设备中。由于有了标准的接口形式和通信协议,内嵌于设备的Web服务器可以向任何接入它所在网络的合法用户提供统一的基于浏览器方式的操作和控制界面,浏览器成了设备的前端控制板。
3)实时性 嵌入式实时Linux是硬实时的嵌入式操作系统。当中断到来时,若是基本内核中断,如果当前有实时任务正在运行,则只是设置一下中断标志位,悬挂此中断;如果此中断是实时中断,就直接调用相对应的实时中断处理程序。这样的调度机制可以保证远程监控系统中实时任务在确定的时间限度内完成,为系统故障的实时预报、诊断、控制提供了强有力的支持。
此外,系统还从时间管理、内存管理、中断管理、同步