嵌入式实时操作系统RTLinux的分析和实现(转载)
附件: 文章讨论了Linux作为实时应用操作系统的一些不足,从实现机制上分析了产生这些不足的原因。详细阐述了实时操作系统RTLinux的实现原理,着重介绍了嵌入式RTLinux系统的开发过程,并给出了该系统实时性能测试的方法和结果。
1、引言
计算机经过短短几十年的发展,现在已经进入了后PC时代。嵌入式系统已经广泛的渗透到科学研究、工程设计、军事技术、各类产业和商业文化艺术、娱乐业以及人们的日常生活等方方面面中。实时操作系统RTOS(Real-Time Operating System)集中了实时系统和操作系统的优点。它是嵌入式系统的系统软件,一个优秀的RTOS是嵌入式系统成功的关键。
我国到目前为止,还没有一个真正实用的、有影响力的实时操作系统。当前使用的实时操作系统都是由国外公司开发的。主要有:微软的WindowsCE、Integrated Systems 公司的pSOS、美国Alameda公司的VxWorks、Lynx的LynxOS以及加拿大QSSL公司开发的QNX等等。这些操作系统存在共同的问题就是价格特别昂贵。另外,这些操作系统都是有版权的,内部的实现机理不公开。其封闭的源代码增加了用户对该软件厂家的依赖度。在这些平台上开发嵌入式系统必然会受到他们所定的规则的限制,另外还有可能会受到象Windows操作系统中“后门”的威胁。
因此,当前开发我国自主的实时操作系统有非常重要的意义,可以摆脱PC时代操作系统对我们的束缚。由于Linux廉价、开放源码以及系统的稳定性,使其在嵌入式系统中的应用日益广泛,在此专门介绍一种基于Linux的实时操作系统-RTLinux。
2、Linux在实时应用中的不足
现有的Linux是一个通用的操作系统,虽然它采用了许多技术来提高系统的运行和反应速度,但它本质上不是一个实时操作系统,应用于嵌入式环境中还存在诸多的不足。具体表现如下:
1、关中断问题
在系统调用中,为了保护临界区资源,Linux处于内核临界区时,中断会被系统屏蔽,这就意味着如果当前进程正处于临界区,即使它的优先级较低,也会延迟高优先级的中断请求。在实时应用中,这是一个十分严重的问题。
2、进程调度问题
Linux采用标准的UNIX技术使得内核是不可抢占的。采用基于固定时间片的可变优先级调度,不论进程的优先级多么低,Linux总会在某个时候分给该进程一个时间片运行,即使同时有可以运行的高优先级进程,它也必须等待低优先级进程的时间片用完,这对一些要求高优先级进程立即抢占CPU的实时应用是不能满足要求的。
3、时钟问题
Linux为了提高系统的平均吞吐率,将时钟中断的最小间隔设置为10ms,这对于一个周期性的实时任务,间隔要求小于10ms时,就不能满足实时任务的需要。如果要把时钟 的间隔改小以满足周期性的实时任务的需要,由于Linux的进程切换比较费时,时钟中断越频繁,而花在中断处理上的时间就越多,系统的大部分时间是调用进程调度程序进行进程调度而不能进行正常的处理。
这些问题是将Linux用于嵌入式环境时必然会碰到的问题,但是Linux操作系统本身的优势决定了Linux经过改造后仍然适合嵌入式环境,将Linux经过改造,使其成为一个能运行于嵌入式系统的操作系统是目前操作系统领域中研究的一个热点。RTLinux就是Linux实时改造非常成功的一例。
3、RTLinux的实现原理
RTLinux是源代码开放的具有硬实时特性的多任务操作系统,它是通过底层对Linux实施改造的产物。通过在Linux内核与硬件中断之间增加一个精巧的可抢先的实时内核,把标准的Linux内核作为实时内核的一个进程与用户进程一起调度,标准的Linux内核的优先级最低,可以被实时进程抢断。正常的Linux进程仍可以在Linux内核上运行,这样既可以使用标准分时操作系统-Linux的各种服务,又能提供低延时的实时环境。RTLinux对Linux内核进行改造,将Linux内核工作环境做了一些变化,如图1所示:
图1 Linux内核细x节与RTLinu内核细节的比较(见附件)
从图1可以看出,本来是由Linux内核完全控制Linux进程和中断控制硬件的,现在在Linux内核和中断控制硬件之间,增加了一个RTLinux内核。Linux的控制信号都要先交给RTLinux内核进行处理。在Linux中,用禁止中断的方法作为同步机制,通过向x86处理器发送 “sti”和“cli”宏指令来开中断和关中断,由于关中断和开中断的混合使用使得中断的分派延时不可预测。而RTLinux修改了这些宏指令,分别用宏S_STI和S_CLI替换。RTLinux引入了一个虚拟层,采用在Linux内核和中断控制硬件之间增加一层仿真软件的方法截取所有的硬件中断。将所有的中断分成Linux中断和实时中断两类,如果是实时中断,则继续向硬件发出中断。如果RTLinux内核收到的中断信号是普通Linux中断,就设置一个标志位,等到RTLinux内核空闲时通过软中断传递给Linux内核去处理。这样就使得Linux永远不能禁止中断。无论Linux处在什么状态,它都不会对实时系统的中断响应时间增加任何延迟,以致时间上的不可预测性。Linux程序的屏蔽中断(cli)虽不能禁止实时中断的发生,却可以用来中断Linux。Linux不能中断自己,而RTLinux可以。
RTLinux在默认的情况下采用优先级的调度策略,即系统调度器根据各个实时任务的优先级来确定执行的先后次序。优先级高的先执行,优先级低的后执行,这样就保证了实时进程的迅速调度。同时RTLinux也支持其它的调度策略,如最短时限最先调度(EDP)、确定周期调度(RM)(周期段的实时任务具有高的优先级)。RTLinux将任务调度器本身设计成一个可装载的内核模块,用户可以根据自己的实际需要,编写适合自己的调度算法。
对于一个操作系统而言,精确的定时机制虽然可以提高任务调度器的效率,但会增加CPU处理定时中断的时间开销。RTLinux对时间精度和时钟中断处理的时间开销进行了折中考虑。不是像Linux那样将8254定时器设计成10ms产生一次定时中断的固定模式,而是将定时器芯片设置为终端计时中断方式。根据最近的进程的时间需要,不断调整定时器的定时间隔。这样不仅可以获得高定时精度,同时中断处理的开销又最小。
4、嵌入式RTLinux操作系统的实现及性能检测
4.1实现步骤
首先,根据具体的需要对Linux内核代码进行裁剪、编译,将通用Linux小型化。小型化后的Linux系统虽然具有灵活、高效、运行开销低等特点,但将其直接用于嵌入式系统,性能还是远远不够的。因为Linux本身并不是实时操作系统。要将其应用于嵌入式系统,还必须对其进行实时化改造。RTLinux的源代码也是公开的,对于不同的Linux内核,RTLinux有相应的内核与之对应。采用Linux标准内核与RTLinux的实时内核相结合,由实时内核提供时间保证,标准内核提供扩展功能,即可实现基于Linux的实时操作系统。
在此,我们选择Linux-2.4.4和RTLinux-3.1。将RTLinux-3.1源代码Patch到小型化的Linux-2.4.4内核上,重新编译内核,形成一个新的具有实时性能的核心。这样,一个具有实时操作系统特征的软件开发平台就搭建起来了。具体步骤如下:
1.将Linux-2.4.4.tar.gz和rtlinux_3.1.tar.gz拷贝到/usr/src目录下
2.解包
tar –xzvf linux_2.4.4.tar.gz
tar –xzvf rtlinux_3.1.tar.gz
3.建立链接
#cd /usr/src
# ln –s rtlinux-3.1 rtlinux
#cd rtlinux
# ln –sf /usr/src/linux ./linux
4.Patch实时内核
#cd /usr/src/linux
#patch –p1 < /usr/src/rtlinux/kernel_patch-2.4.4
5.编译内核
#make menuconfig
#make dep;make clean;make bzImage
#make modules;make modules_install;
6.引导实时内核
①将/usr/src/linux/arch/i386/boot/目录下的bzImage拷贝到/boot/下面
②在grub.conf中加入如下几行
title rtlinux
root (hd0.4)
kernel /boot/bzImage
root=/dev/hda6
最后重新启动机器:#reboot
7.安装RTLinux实时模块
#cd /usr/src/rtlinux
#make
#make device
#make install
实时模块rtl_sched.o,rtl_fifo.o,rtl_time.o等将被安装到/lib/modules/2.4.4-rtl目录下
上述步骤完成之后,将整个系统安装到Flash中就可以了,将Flash插在计算机上,挂接在从硬盘仿真功能的第二个IDE插槽上。在开发的主机上编译好内核和需要的驱动程序,将Flash当成另外一个硬盘,在上面建立子目录。将相关的内容从开发的硬盘中拷贝过去就可以了。当这个系统的文件目录和相关的文件都被复制到Flash上时,整个嵌入式RTLinux系统就算组织成功了。
4.2 性能检测
为了测试RTLinux和Linux系统在时间响应上的不同,在此采用以下的方法对两种系统的实时性做了初步测试。
在进行性能测试时,我们采用软件读取定时计数器值的方法,在不同时刻读取计数值,其差值即为测试数据。从中断确认开始读取定时计数值,操作系统进行进入中断的内核系统调用,接着执行服务程序,在服务程序的第一条指令前再读取定时计数值,两者之差即为中断响应时间。在多任务的情况下,在PⅢ 1.2GHz上执行RTLinux操作系统,结果为7-9us。执行Linux,其中断响应时间为490us-18ms。在单任务情况下,执行RTLinux,中断响应时间为4-7us,执行Linux,其中断响应时间为4-9us。
从测试结果可以看出,在单任务情况下,体现不出RTLinux与Linux在中断响应时间上的差距,但在多任务情况下,从测试得到的数据来看,二者的差距非常明显。Redhat7.2(标准Linux)象Windows系统一样是非实时系统,本身不提供实时调度机制。而RTLinux采用双核机制和实时调度算法,能提供很好的实时性。
5、结束语
文章从中断机制、进程调度机制和时钟机制三个方面分析了Linux存在的不足,以及RTLinux在这三个方面的改进。经过测试,RTLinux具有很好实时性,完全能够满足大多数嵌入式系统的要求。通过对Linux最小的改动,就可以开发出一种可靠的且廉价的硬实时操作系统RTLinux,具有很好的发展和应用前景。
阅读(1228) | 评论(0) | 转发(0) |