(转载)浅谈Real-Time Linux

操作系统读书报告——浅谈Real-Time Linux

邹飞(98132194)

摘要:本文通过对一个Real-Time Linux的实例NMT RT-Linux进行简单的分析,指出Linux在通用实时操作系统中发挥的作用。

 Abstract: The paper introduces an exampe of Real-Time Linux, which is NMT RT-Linux finished by Victor Yodaiken And Michael Barabanov. And I’ll introduce some advantages of using Linux as a general real-time OS.

 关键词:实时操作系统,系统响应时间,时限

 一.实时操作系统简介

    因为Real-Time Linux首先是一个实时操作系统,所以这里先对实时操作系统的一些概念进行介绍。

1.实时操作系统

实时操作系统(Real-Time Operating System)是针对操作系统的工作特性而言的。实时操作系统是指具有实时性,能支持实时控制系统工作的操作系统。其首要任务是调度一切可利用的资源完成实时控制任务,其次才着眼于提高计算机系统的使用效率,因而其重要特点是要满足对时间的限制和要求。

2.实时多任务操作系统与分时多任务操作系统

它们有明显的区别。对于分时操作系统,程序的执行在时间上的要求并不严格,时间上的错误一般不会造成灾难性的后果(尽管用户可能会感到不满意)。而实时操作系统的主要任务是对事件进行实时的处理,虽然事件可能在无法预知的时刻到达,但是处理程序必须能够在事件发生后严格的时限内作出响应(系统响应时间),即使是在尖峰负荷下,也应如此(即实时操作系统中不能允许某一时刻系统资源的利用率达到或接近100%)。系统响应的超时就意味着致命的失败。另外,实时操作系统的重要特点是具有系统状态的可确定性,即系统能对运行情况的最好和最坏等的情况能做出精确的估计。

3.实时操作系统中的重要概念

l        系统响应时间(System Response Time):系统发出处理要求到系统给出应答信号的时间。

l        任务换道时间(Context-Switching Time):是任务之间切换而使用的时间。

l        中断延迟(Interrupt Latency ):计算机接收到中断信号到操作系统作出响应,并完成换道转入中断服务程序的时间。

4.实时操作系统应具备的功能

1)    任务管理(多任务和基于优先级的任务调度)

2)    任务间同步和通信(信号灯和邮箱等)

3)    存储器优化管理(含ROM的管理)

4)    实时时钟服务

5)    中断管理服务

5.实时操作系统的工作特性

实时操作系统中的任务(Task)等同于分时操作系统中进程(Process)的概念。系统中的任务有四种状态:运行(Executing),就绪(Ready),挂起(Suspended),冬眠(Dormant)。

l        运行:获得CPU控制权。

l        就绪:进入任务等待队列。通过调度转为运行状态。

l        挂起:任务发生阻塞,移出任务等待队列,等待系统实时事件的发生而唤醒。从而转为就绪或运行。

l        冬眠:任务完成或错误等原因被清除的任务。也可以认为是系统中不存在了的任务。

 

二.实时操作系统的历史

实时操作系统(RTOS)的研究是从六十年代开始的。从系统结构上看,RTOS到现在已经历了三个阶段:

1.早期的实时操作系统

早期的实时操作系统,还不能称为真正的RTOS,它只是小而简单的、带有一定专用性的软件,功能较弱,可以认为是一种实时监控程序。它一般为用户提供对系统的初始化管理以及简单的实时时钟管理,有的实时监控程序也引入了任务调度及简单的任务间协调等功能,属于这类实时监控程序的有RTMX等。应用程序、实时监控程序和硬件运行平台往往是紧密联系在一起的。

2.专用实时操作系统

随着应用的发展,早期的RTOS已越来越显示出明显的不足了。有些实时系统的开发者为了满足实时应用的需要,自己研制与特定硬件相匹配的实时操作系统。这类专用实时操作系统在国外称为Real-Time Operating System Developed in House。它是在早期用户为满足自身开发需要而研制的,它一般只能适用于特定的硬件环境,且缺乏严格的评测,移植性也不太好。属于这类实时操作系统的有Intel公司的iMAX86等。

3.通用实时操作系统

在各种专用RTOS中,一些多任务的机制如基于优先级的调度、实时时钟管理、任务间的通信、同步互斥机构等基本上是相同的,不同的只是面向各自的硬件环境与应用目标。实际上,相同的多任务机制是能够共享的,因而可以把这部分很好地组织起来,形成一个通用的实时操作内核。这类实时操作系统大多采用软组件结构,以一个个软件“标准组件”构成通用的实时操作系统,一方面,在RTOS内核的最底层将不同的硬件特性屏蔽掉;另一方面,对不同的应用环境提供了标准的、可剪裁的系统服务软组件。这使得用户可根据不同的实时应用要求及硬件环境选择不同的软组件,也使得实时操作系统开发商在开发过程中减少了重复性工作。

这类通用实时操作系统,有Integrated System公司的Psos+、Intel公司的iRMX386、Ready System公司(后与Microtec Research合并)的VRTX32等。它们一般都提供了实时性较好的内核、多种任务通信机制、基于TCP/IP的网络组件、文件管理及I/O服务, 提供了集编辑、编译、调试、仿真为一体的集成开发环境,支持用户使用C/C++进行应用程序的开发。

实时操作系统经过多年的发展,先后从实模式进化到保护模式,从微内核技术进化到到超微内核技术,在系统规模上也从单处理器的RTOS发展到支持多处理器的RTOS和网络RTOS,在操作系统研究领域中形成了一个重要分支。

 

三.Real-Time Linux

    本文所要讨论的Real-Time Linux为一种通用实时操作系统,但它与上述各类实时操作系统又是有所区别的。由于Real-Time Linux是在基于通用操作系统Linux的基础上构建的,而Linux为了满足分时系统的作业调度,在效率、对作业的处理方式等方面都不适合于实时任务的处理。而且,由于Linux是一个多平台、通用、交互型分时操作系统,且对Real-Time Linux的应用很大一部分是基于PC平台而非专用硬件平台的,因而可以想象,其在实时性、高效性等方面均会略逊于专业的实时操作系统(甚至包括其它的通用实时操作系统)。但是,由于PC机相较于那些专用的硬件平台具有价格低、功能强、使用方便、鲁棒性等特点,以及通用操作系统下存在大量成熟工具,如图形用户界面GUI、网络通讯接口等在目前的很多复杂实时系统中需要用到,因而Real-Time Linux自从出现还是受到很多的欢迎的。

    Real-Time Linux一般是在PC的架构下,将Linux的内核进行重新改造,并对系统进行重编译,使其更适合于实时的要求。这里我们可以看到开放源码(Open Source)的巨大优势。显然若使用Linux本来的内核进行实时操作是不现实的(Linux的系统响应时间相对于实时系统是太慢的,比如一个Linux中断,可能会花上超过 10ms 的时间。对有些像工业控制的应用而言,它们对时间的要求通常在 1ms 的等级上,Linux 根本无法满足这种需求。),毕竟在设计Linux时并没打算把它做成一个实时系统,所以通常的处理都是对Linux内核进行重编译,或者为Linux加上一个Shell,使得实时任务以不同于分时任务的方式来运行。

这里需要提一下POSIX与实时Linux的关系。POSIX表示“基于Unix的可移植操作系统界面”,其目的是为了促进为Unix编写的软件的可移植性,使Unix程序员的工作更方便。有些实时性的扩展,在POSIX.1b或IEEE 1003.1b已经得到体现。这些扩展中包括一些工具,如信号灯、内存锁定、时钟和计数器、消息队列以及优先级抢先调度等。

以POSIX为基础来标准化实时操作系统并未得到大家认可。这个标准显得过于庞大,包含了许多适合于Unix工作站但无助于嵌入式系统的特征,因而显得很臃肿。还有,由于这些工具都是以Unix为前提的,因而使得POSIX系统调用如同Unix的系统调用一样复杂而笨重,在VxWorks或pSOS+中仅需一两个调用即可完成的操作可能需要十几个POSIX调用,嵌入式系统程序员对这些是无法忍受的。

许多Linux开发者正在为Linux实现POSIX.1b的标准化工作,这个活动已初见成效并仍在继续。POSIX内存锁定工具和决定调度算法已经实现。但是,计数器函数和POSIX.1b信号灯机制仍未完成。尤其是,对任何实时操作系统至关重要的信号灯和消息队列均尚未得到实现。

虽然POSIX对实现一个实时Linux做了保证,但是当前和可预见的将来也只有“软”实时的应用能用POSIX.1b函数来实现。移植POSIX.1b函数到Linux上要面对的根本问题是Linux的内核是不可抢先的,因此,要想不大动干戈地修改内核而实现“硬”实时特性恐怕是不可能的。

而另一条非POSIX的路线却可能在目前更有价值,那就是新墨西哥科技大学的实时Linux(NMT RT-Linux)项目。注意到Linux是一个主要为PC用户设计的操作系统,开发者们断定,要想把实时功能移植到为分时设计的OS上是不可能有好结果的。取而代之的是,他们在操作系统下面实现了一个简单的实时内核,而Linux本身也仅作为那个内核上的一个任务来运行。下文对该系统会有详细介绍。

 

四.已经实现的Real-Time Linux简介

Real-Time Linux主要有二个大类:

第一类以NMT RT-Linux为代表,它们的实时进程实际上是一个核心模块。所以它们事实上是一种Real-Time驱动程序,RTAI及网络系统与之有很相似的结构,差别只是在于其驱动的硬件类别不同而已。

第二类如KURT,Linux/RK及RED-Linux等,这些系统的系统响应时间受限于PC能达到的时间分辨率。虽然RED-Linux已经把这个极限推到1ms左右,但可以预期在PC的架构下要达到100us以下是很困难的。也就是说,对于要求10K
以上频率的应用是不可能使用这种架构来达成。

1. NMT RT-Linux

NMT是新墨西哥科技大学(New Mexico Technology)的缩写。这一套系统可以说是最早的获得成功的Real-Time Linux,它目前已发展到3.0版。这个系统是由Victor Yodaiken和它的学生Michael Barabanov所完成。这个系统的概念是“架空”Linux内核,使得Real-Time进程得以尽快的被执行。

事实上,RT-Linux中的实时任务(Real-Time Task) 其实并不是 一个Linux的进程,而是一个 Linux 的可加载式核心模块(Loadable Kernel Module)。NMT RT-Linux采用一个比较简单的做法,它不使用Linux的任何功能,把需要高度时间精确度的工作写成一个驱动程序,然后直接用PC时序芯片 (Timer Chip) 所产生的中断调用这个驱动程序。这样,它就可以绕开Linux的中断机制,从而使系统响应时间大缩短。

从这个角度看,NMT RT-Linux 其实是一个实时驱动程序,算不上是真正的 Real-Time Linux。但由于它出现得早,且其架构很符合自动控制的需求,使用者非常的多,且多半是有关自动控制的应用。

下文对这个系统将会有更详细的论述。

2. RTAI

RTAI是 Real-Time Application Interface 的缩写。顾名思义知道它是一套可以用来写实时应用程序的接口。大致而言,RTAI和NMT RT-Linux是相同的东西。它同样的“架空”了Linux,而直接用可加载式核心模块( Loadable Kernel Module)实现实时进程。每一个实时进程实际上就是一个可加载式核心模块。

RTAI和NMT RT-Linux 最大的不同地方在于它非常小心的在Linux上定义了 一组实时硬件抽象层(Real-Time Hardware Abstraction Layer)。RTHAL将RTAI 需要在Linux中修改的部份定义成一组程序接口,RTAI只使用这组接口和Linux沟通。这样做的好处在于我们可以将直接修改Linux核心的程序代码减至最小,这使得将 RTHAL 移植到新版 Linux 的工作量减至最低。

RTAI 采取这种途径最大的原因在于NMT RT-Linux在由2.0版移植至2.2版的过程中遇到问题,使得基于2.2版核心的NMT RT-Linux一直无法完成。所以在Dipartimento di Ingegneria Aerospaziale Politecnico di Milano的Paolo Mantegazza和他的同事们就决定自行做移植的工作,由于NMT RT-Linux的困境他们认识到必须采取上述的途径以解决将来可能再度面临的兼容性问题。

于是 RTAI 便诞生了,它是一个比 NMT RT-Linux 更好的 NMT RT-Linux,虽然后来NMT RT-Linux也随后完成移植的工作,但那已经是RTAI诞生半年以后的事了。

3. LXRT

由于 RTAI 无法直接使用Linux的系统调用,解决的方法是使用RT-FIFO将一个RTAI Real-Time Kernel Module和真正的Linux进程连接在一起,由这个进程负责为其调用Linux系统调用。似乎其友善性得到提高,但代价是“实时性”降低了,这时实时任务不再能进行任何抢先式操作(而“抢先式”被认为是实时系统最佳的方式),所以实时系统的优势就不再具有了。

4. KURT

KURT是由Kansas大学所创造的系统,它和NMT RT-Linux及RTAI有很大的不同。KURT是第一个可以使用系统呼叫的Real-Time Linux。由于KURT只是简单的将 Linux 的进程管理器用一个很简单的时间驱动式(Time Driven)进程管理器加以取代,实时进程的执行很容易很其它非实时进程的影响。

5. RED-Linux

这是加州大学Irvine分校所做的系统,它和KURT类似,是一个可以使用所以Linux系统调用的Real-Time Linux。它的特点是使用“抢先检查点 (preemption point)”改善系统的反应速度。前面说过KURT的最大问题在于它受限于原有的Linux架构,使得系统的反应时间很难控制。然而在RED-Linux这一点已经被大大的改善,其2.0版的反应延迟约在100 us左右。

RED-Linux 非常有弹性的进程管理器架构也是其特点之一。它使得RED-Linux可以符合各种不同复杂度系统的需求。它将进程管理分成Dispartcher和Allocator二部份,Dispatcher在核心中执行而Allocator在用户模式执行。Allocator可以是应用程序的一部份,也可以是一个独立的单位。通常它负责将应用程序的资源请求转换成内核可以解释的格式。

 

五.NMT RT-Linux介绍

    正如前文所述,尽管NMT RT-Linux似乎不能算是一个实时操作系统,而仅仅是一个实时驱动程序,但它却确实是目前在通用操作上实现实时系统最行之有效的方法,效率也是较高的,而且NMT RT-Linux目前在实时系统中的应用也很普遍。

1. 设计目标

最初设计NMT RT-Linux是因为新墨西哥科技大学需要一套实时系统来对科学仪器进行控制,而这又是分时系统所不能完成的,尤其值得一提的是分时系统运行状态的不确定性及中断延迟的缓慢。所以NMT RT-Linux最主要解决的问题也将是这两个。

NMT RT-Linux的设计理念是,对Linux作最小的改动,仅提供为了实现实时应用必不可少的东西,这样就使NMT RT-Linux比较容易移植到新版本的Linux上。同时,NMT RT-Linux依赖于Linux来提供所需的几乎所有服务,而NMT RT-Linux仅提供实时任务创建、安装中断服务例程、并为实时任务、ISR和Linux进程之间的通信排队。这种设计的结果是,一个NMT RT-Linux应用可以看作有两个域:实时和非实时。放在实时域的函数能满足其实时要求,但是它们必须比较简单,因为可用资源很受限制;另一方面,非实时功能可以利用整个Linux资源,但不能有任何实时要求。两个域之间的通信工具已提供,但是使用RT-Linux之前,嵌入式系统设计者必须确保所有需要实现的功能适合两个域之一。使用RT-Linux并不能使已经存在的Linux程序具有实时性。例如,假设开发者有一个串口的Linux驱动程序,当串口接收一个字节序列之后,在一个固定时间内,由实时任务打开并口输出一行。这个驱动程序不能用,因为在非实时域内你不知道什么时候串口驱动程序会唤醒实时任务驱动并口完成工作。因此,串口和并口驱动都必须在实时域内,这就要求重新设计串口驱动程序。

2. 系统实现

下面看一下NMT RT-Linux的实现方案及说明。分两部分来介绍,即进程管理、通讯和中断。

a.   进程管理

NMT RT-Linux的实时进程被设计为轻量级线程(LWT),它们作为实时统一调度的单位。

初期设计时实时任务被给予独立地址空间,而目前版本则是和Linux进程共享Linux的地址空间。这有两个原因:

1.    使用独立地址空间将会使TLB的命中率降低,影响效率;

2.    使用共享地址空间可以使得实时系统成为一个可动态加载的核心模块,这样使得Linux可以同时作为分时系统和实时系统。

同时Real-Time Linux提供了一组用于进程控制的系统调用,如下:

 

l        int RTLoad(const char *file)载入一个实时任务文件,创建一个进程并返回它的pID号,该进程被挂起直到执行RTRun

l        int RTRun(int pID)开始执行一个使用RTLoad载入的实时进程

l        int RTKill(int pID)销毁一个实时进程

l        int RTGet_Time(RTime *t)得到当前时间(一个64Bit整形值,为自系统启动后经过的时钟节拍数)

l        int RTSet_Params(RTime *start, RTime *period, int priority)改变一个进程的调度参数(优先级等)

l        int RTWait_Start(RTime *start, RTime *period, int priority)挂起进程,直到给定的起始时间,然后以指定的优先级继续进程的执行

l        int RTWait_Period()挂起进程,直到下一周期(period)

通过这些函数我们可以实现包括定时任务和中断驱动任务。这对于不是非常复杂的实时应用已经足够了。

在中断发生时(进程间的模式切换也需归结为中断的产生),Real-Time Linux不使用Intel x86提供的硬件切换机制(它保存了太多的状态从而使速度太慢),而只是把模式字保存到栈中,然后切换栈,这样可以使得中断延迟得到很大降低。实时进程的模式字仅仅包含整数寄存器,这样可以保证快速的模式切换。

在系统中使用了一个简单的基于优先级的强先式调度算法,它从就绪进程队列中选择一个最高优先级的进程,并使之成为下一个执行进程。任务自愿释放处理器,或者被一更高优先级的进程强占,通过这种方式使Linux从个时间片轮转的进程调度算法变成了强占式的进程调度算法。

b.   通讯

尽管由于Linux本身在NMT RT-Linux中是以最低的优先级运行,从而可以保证任何实时任务都可以中断Linux。所以实时任务中不能包含有Linux提供的系统调用(这将导致重入)。然而一些通讯机制还必须要提供。例如,在一个数据采集系统中,实时任务负责轮询端口,并将接收到的信息存入一个FIFO的缓冲区,而Linux进程而负责从该缓冲区中读出数据并显示(或保存到文件),在读写该缓冲区,必须禁止中断,所以系统必须提供一种共享数据区,当操作该数据时,中断被禁止。

在NMT RT-Linux中,系统有一些函数用于管理这些数据区(其中的数据被组织成FIFO形式,称为RT-FIFO),如下:

l        int RTFifo_Create(unsigned int fifo, int size)创建一个大小为size的RT-FIFO。

l        int RTFifo_Destroy(unsigned int fifo)销毁指定的RT-FIFO。

l        int RTFifo_Get(unsigned int fifo, char *buf, int count)从FIFO中读取count个字节到buf中。

l        int RTFifo_Put(unsigned int fifo, char *buf, int count)向FIFO中写buf中count个字节。

同时FIFO机制提供了一个实现信号灯的很好方法。两态信号灯可以通过创建一个大小为1的FIFO来实现,V操作即为RTFifo_Put(),数据内容无所谓,同时忽略返回的错误。P操作为RTFifo_Get()。计数信号灯可以通过创建大小足够容纳所期望V操作个数的FIFO简单地实现。由此可见,FIFO机制提供了实时应用中任务同步所需的大部分功能。当前的实现在RTOS用户习惯的某些功能上仍有欠缺,比如优先级禁止(防止优先级反转)和任务安全删除。但是仔细设计几乎总能避免这些问题。此外,虽然FIFO操作可以在没有数据(读FIFO)或没有空间(写FIFO)时阻塞,语法却相当复杂,阻塞能力看来不是设计的重点。然而,至少有一个提供FIFO阻塞操作简单语法的努力正在进行,同时还实现了阻塞超时,这是许多嵌入式应用的重要特征。RT-Linux简单、开放的设计允许用户相当容易地实现类似的附加功能。

c. 中断

象所有其他Unix类型的操作系统一样,Linux内核能长时间地屏蔽中断。当然,正是这一点使Linux成为非实时操作系统。解决这个问题有两种途径:一是重新设计内核使之可抢先。但是Linux内核又大又复杂,不便于经常修改。而且当初设计Linux时根本就没打算把它做成一个实时系统。因此,把实时性强加到已存在的代码上是不可行的。于是NMT RT-Linux设计者用另一种途径来使Linux可抢先。他们将中断分为两组:由Linux控制的为一组,另一组由NMT RT-Linux控制。RT-Linux中断象RT-Linux任务一样受到约束,它们不能进行Linux调用。所以它们可以安全地中断Linux内核。另一方面,Linux中断不允许中断内核。因此NMT RT-Linux形成了一个虚拟中断机制,使Linux本身永远不能屏蔽中断。Linux用“cli”和“sti”宏指令来屏蔽和使能中断。在标准Linux里,这些宏只是简单地执行相应的x86/PC处理器指令。NMT RT-Linux修改了这些宏,执行cli时不是屏蔽中断,而是重定向到某些RT-Linux代码。如果这是一个RT-Linux中断,允许它继续;如果是一个Linux中断,则只是设置一个标准位。然后当执行了sti开中断后,那些挂起的Linux中断才继续执行。这样,Linux仍然不能中断它自己,但是NMT RT-Linux可以。RT-Linux很简单,只提供了实现一个实时系统所需的不能再少的功能。但是系统设计者正是得益于这种简单性。大部分应用应该在Linux进程中实现,因为Linux本身稳定可靠,并且为广大用户所熟悉,即使有了麻烦也能找到帮助。实时任务只包括必要的功能来实现实时I/O,以及从Linux进程接收或发送数据。

在中断处理中,NMT RT Linux对Linux内核有如下三处修改:

l        cli(Clear Interrupt)被简单地修改成对一个控制“软中断使能”(SIE)的全局变量的清0

l        sti(Set Interrupt)被修改成为所有等待中断产生中断模拟

l        低级wrapper指令(保存和恢复中断状态)被修改为使用软返回,而不是使用原来的硬件机制

当一个中断发生时,控制转移到实时处理程序,处理程序首先进行一些必要的处理,然后将中断传给Linux。如果“软中断使能”标志为1,则将控制转移到Linux的处理程序。

同时,需要说明的是,Linux非常容易修改,因为在标准的x86 Linux下,cli()和sti()事实上是一段汇编宏指令(产生x86下的指令cli和sti)。总的说,需要大约2000行新代码,而且需要修改大约几百行Linux的代码。如下为三个宏:

S_IRET保存最少的必要状态,保证内核数据地址可访问。

/*These are macros*/

S_CLI:     mov $0, SF1F

S_IRET:    push %ds

              pushl %eax

              pushl %edx

              movl $KERNEL_DS, %edx

           mov %dx, %ds

              cli

              movl SFREQ, %edx

              andl SFMASK, %edx

           bsrl %edx, %eax

              jz not_found

              movl $0, SF1F

              sti

           jmp SFIDT (, %eax, 4)

not_found: movl $1, SFIF

              sti

              popl %edx

              popl %eax

              pop %ds

           iret

S_STI:     pushfl

              pushl $KERNEL_CS

              pushl $done_STI

              S_IRET

done_STI:

 

当发生中断时,中断处理程序首先执行一些实时系统的必要代码,然后把中断传给Linux(如果“软中断使能”置1)。由于大多数I/O驱动都没有为实时系统专门设计,大多数实时驱动中断处理程序仅仅决定只是简单地通知Linux。另一方面,每次时钟中断发生时,给时间节拍变量增1,并且决定是否应该运行一个定时任务,在适当的时候将中断传给Linux。

如果软中断被禁止,直接通过IRET将控制返回,否则控制被返回到S_IRET,这个宏调用与该中断相应的处理程序。

同时,需要特别指出的是,必须在时钟中断速度和事件发生的不同步之间寻找一个折衷点。更高的时钟中断速度意味着可以对任务进行更多的采样,从而降低系统响应时间,但同时用于中断切换的时间也增多了。反之则可能导致事件的反应时间过长,从而影响系统响应时间,尽管这减少了中断的次数(时间)。

 

六.几点说明

1. 如何选择实时操作系统?

如果你要求你的系统的反应足够快,而且似乎目前的通用实时操作系统的响应时间都不能满足你的要求(或者是因为你要求越快越好,比如是一套雷达预警系统),你可以考虑使用专用实时系统,同时你可以考虑使用汇编语言甚至是机器语言,尽管这需要你付出巨大的工作量(如果这多出的工作量相较于系统的高速要求值得的话)。

如果你的系统是一个很简单的实时系统,比如一台洗衣机的单片机处理系统,可能你也没有必要去考虑通用实时操作系统,因为那里面有很多东西是你根本就用不到的,比如TCP/IP、内存管理、进程调度等,使用通用实时操作系统或许可以使写代码方便了一些,但代价却是整个系统的造价上升了许多。

总之,我认为,对于一个复杂系统,如果没有非常苛刻的要求,应该尽可能地使用通用实时操作系统,而如果要求更低,可以考虑实时Linux系统,因为这将是更节约的方式,而且其可维护性也将是最优的。

2. RT-Linux上的应用怎样才能真正可以投入使用?

必须提明的是,Linux操作系统并非是一个适合嵌入式的最佳平台。这主要是因为它的大小,一个完整的GUI系统必须以磁盘为基础,或者连接到网络使其能够引导。但是,目前大量嵌入式应用程序的运行需要磁盘以及Linux内置的GUI和网络特性,并且数量还在增长。例如,许多医疗设备必须使用有吸引力的用户界面才有竞争力,工业机器控制必须既有GUI又有网络。这时候似乎就可以直接使用RT-Linux上开发的应用而不必再花费其它的费用,而且由于Linux的开放性,可能会使得这样的系统所能支持的特性远远超过那些专门的实时系统。

但是,有着地方的实时应用就不是这样的,一台臃肿的PC已经显得太浪费,事实上这些应用所需的功能极其少,而使用RT-Linux作开发平台仅仅是因为它的方便,这样在开发完成后,还必须完成的任务就是使得它从EPROM引导。这时可以通过仅仅安装那些对特定应用必须的组件,从而构成一个无磁盘系统。例如,一个包括网络(但不包括X-Windows)的Linux系统已经成功地放置在仅2.7MB的EPROM上。因此,实践中独立的无磁盘嵌入式系统也可以用Linux来开发。另外,Linux具有从网络引导的能力,一个包括X-Windows的整个系统可以从位于网络上某个位置的磁盘引导。这样也提供了一种使得RT-Linux应用实用化的手段。

 

七.结束语

本文是笔者在阅读了几本(篇)关于实时操作系统的资料后对实时系统的一些认识,因而文中的很多观点都仅是笔者自己的看法,同时有一部分为笔者参考外文书籍的结果,由于笔者对实时操作系统的理解并不是很深,因而很难保证是正确的,甚至可能出现对某些单词翻译的不恰当,故本文仅供参考,欲了解实时Linux更详细的信息,请查阅参考文献。

 

参考文献

[1] Linux用作嵌入式操作系统,操作系统开发者,http://os.silversand.net/

[2]A Real-Time Linux,Victor Yodaiken And Michael Barabanov,New Mexico Institute of Technology

[3] Linux操作系统内核分析,陈莉君,人民邮电出版社

[4] Linux内核源代码分析,冯锐、邢飞、刘隆国、陆丽娜译,机械工业出版社

[5]The Art of Programming Embedded Systems,Jack.J.Ganssle

[6]Real-Time UNIX Systems: Design and Application Guide,Borko Furht et al.,Kluwer Academic Publishers Group

你可能感兴趣的:(嵌入式系统,linux,任务,linux内核,嵌入式,unix,工作)