嵌入式Linux实时化关键技术

时间:2022-09-10 04:04:17

嵌入式Linux实时化关键技术

摘要:介绍了Linux在实时方面存在的三个主要问题:内核抢占、实时调度算法和时钟细粒度定时器。针对这三个问题提出了解决的措施,并对Linux嵌入式实时化技术进行了探讨。

关键词:Linux;内核抢占;硐度策略;优先级反转

O 引言

从Linux系统的发展来看,Linux向着嵌入式系统和高端计算领域两个方向发展。它的O(1)调度算法的实现以及可抢占内核的调度方式,给嵌入式系统带来无限生机。但严格地说,Linux属于通用的分时系统,在嵌入式和实时性方面还存在着一些问题,为此,本文对嵌入式Linux的实时化进行了分析和探讨。

1 Linux在实时方面的缺陷

1.1 内核可抢占

内核可抢占是指进程运行在核心态时,当有更高优先级的进程或更紧急的进程到来时,总会立即获得处理机的控制权,即当前运行的进程的控制权被抢占了。Linux 2.6采用了内核可抢占式调度方式,但它的实现仅仅是在内核中增加了抢占点,并没有实现真正的内核可抢占式调度方式。在Linux 2.6中,抢占点没在中断处理程序即将结束时或系统调用即将结束时。对于强实时系统来说,一旦高优先级的任务进入就绪队列,应立即获得处理机来运行,而调度程序schedule()通常是在中断处理程序结束或系统调用结束时,才有机会运行,这时候如果中断处理时问过长或系统调用占用时间过长,都会延误实时任务的执行。所以,只有保证中断处理程序和系统调用执行时间在一个可控的范围内,才能保证实时任务的正确执行。

另外,Linux对中断的处理,也抑制内核可抢占调度。Linux将整个中断处理流程分为上半部(Top half)和下半部(Bottom half)。上半部处理的是一些重要的数据结构、以及与硬件密切相关的操作,它在执行期间一定要关闭中断;下半部的执行允许中断,它是设备中断处理的延伸,它对设备的中断做进一步的处理。显然,中断处理程序的上半部占用时间过长,同样会影响内核抢占。

1.2 调度策略

在Linux 2.6中仍然保留着Linux 2.4中对实时任务的调度策略。Linux进程的调度策略有三种:SCHED_FIFO、SCHED_RR和SCHED NORMAL,前两种用于实时进程的调度。其中SCHED_FIFO指先进先出调度算法,适合于时间性要求比较强,但每次运行所需时间比较短的进程,采用该策略的进程获得CPU后,除非有更高优先级进程申请运行外,否则该进程将保持运行至退出或自愿放弃CPU;SCHED RR指优先级轮转调度算法,按实时进程的优先级大小进行调度;SCHED_NORMAL适合于普通分时进程的凋度,调度原则山优先级的大小决定。实时进程的优先级范围是0至99,普通进程的优先级范围是100至139,优先级数值越大其优先级越低。

Linux 2.6根据优先级大小进行调度。普通进程的优先级随进程的运行时间、等待时间、是否为交互式进程而动态地改变;而实时进程的优先级在运行过程中不会动态地改变,即Linux采用静态优先级对实时进程进行调度。以静态优先级来衡量任务的紧迫性和重要性,存在着偏差,因为任务的紧迫性和重要性会随着时间的变化而动态地改变,要正确地反映实时任务的紧迫性和重要性最好采用动态优先级。

1.3 时钟定时器

精确的计时是实时调度器正确操作所必须的。在标准Linux中定时粒度太粗,很难满足特定嵌入式应用对于响应时间精度的要求。造成时间精度低的一个原因是操作系统使用周期性的时钟中断。为了达到微秒级的粒度,如果简单地对时钟芯片编程,使之运行在较高频率下,则系统开销太高。比如,每秒时钟中断次数增加到10万次,虽然得到10微秒的粒度,但系统在1秒的时间内执行了10万次时钟中断处理程序,造成较高的系统开销。当然,这种开销会随着硬件速度的提高逐步降低。这种周期模式的定时器适用于某些周期性强的场合,而且,对定时器的设置仅需要在初始化时进行一次,不需要在下一个实时任务到来之前重新设置,这也保证了处理效率。但如何确定时钟中断频率是系统设计者要考虑的主要问题,要考虑既不能使系统开销过高,又不能使计时精度太低。

2 Ljnux实时性改造

2.1 可抢占式内核的设计

在硬实时应用领域,操作系统必须保证特定的任务在指定的时间内完成,计算结果输出的时间绝对不能超过所要求的截止期(Deadline)。但Linux 2.6的弱抢占内核的调度方式,在某些关键的地方,并不适合硬实时的要求,所以必须对内核进行改造。

目前,一般采用双内核支持Linux的硬实时性,比如,美国新墨西哥州大学计算机系研制开发的RT-Linux,就是基于这种策略而开发的。RT-Linux主要应用于仪器设备和嵌入式系统。它的目标是将Linux提供的标准POSIX服务与硬实时服务有机地结合起来,提供透明的、模块化的、可扩展的实时操作系统。RT-Linux通过修改Linux/arch/i386/下与体系结构有关的部分,在Linux与硬件之间创建一个硬实时内核,Linux作为此内核的一个优先级最低的任务运行,硬实时任务都在硬实时内核上运行,而所有非实时任务都在Linux上运行。RT-Linux接管了全部硬件中断,并将Linux系统调用及驱动程序的开、关中断都用RT-Linux的软中断代替。当发生中断时,实时内核首先检查是否有实时处理程序要处理这个中断,如果有则调用此实时处理程序,没有则设置相应的中断标志位,交给Linux处理。

另一种是对内核进行实时化改造,但将内核改造成硬实时,需要大量的工作。目前,常采用的方法是在内核代码中增加抢占点,从而减少内核抢占延迟。这一点在Linux 2.6中已经做到。然而,这些局部修改属于软实时范畴,在控制领域中,只有硬实时才符合RTOS(Real Time Operating System)的发展方向。

2.2 实时调度算法的设计

在实时系统中,往往要求系统对外部事件的响应和处理要在一个给定的时间内完成,系统输出的正确性不仅依赖于计算的逻辑结果,而且依赖于结果产生的时间。随着时间的变化,实时任务的紧急程度也在变化,这就要求在基于优先级的调度算法中,实时进程的优先级要随着时问的变化而动态地改变,从优先级的大小就能判断出任务的紧急程度,这样调度才能正确地反映出真实的世界。Linux对实时进程的调度是基于静态优先级的策略,没有反映出实时进程的紧迫性随时间的变化。

实时调度算法大致可分为三种:优先级驱动、时间驱动和共享驱动调度算法。其中以优先级驱动的调度算法应用最广,文献[2,4]都是基于优先级驱动对调度算法进行讨论的。在以优先级驱动的调度算法中,动态优先级大小通常用进程的截止期(deadline)和价值(value)来决定。

可抢占内核调度程序的设计虽然可以加快任务的响应时间,但同时也有副作用,那就是优先级反转问题:低优先级任务L获得临界资源R,在执行中来了一个高优先级任务H,这时H抢占处理机,任务L被迫停止运行,而任务H运行时想获得I临界资源R而又无法得到,只好等待,而此刻又来了若干中等优先级的任务,致使任务L无法获得处理机运行,这样高优先级任务H就得延迟执行,且无法预测何时才能运行,使系统处于不稳定状态。

文献[2]对解决优先级反转问题的两种方法在中进行了详细讨论,一种方法采用优先级继承协议(Priority InheritanceProtoc01),另一种方法采用优先级封顶协议(Priority CeilingProtoc01)。优先级继承协议是指当低优先级进程占用高优先级进程的资源而制约高优先级进程时,将占用资源的低优先级的进程的优先级提升,让其运行,尽决释放高优先级所需资源;当其释放资源后,其优先级恢复到原来的级别。优先级封顶协议是指当进程申请某资源并获得该资源时,把该进程的优先级提升到可访问这个资源的所有进程中的最高优先级,这个优先级称为该资源的优先级封顶。资源的优先级封顶在资源被创建时就确定了。采用这两种调度协议可解决优先级反转问题。

总之,实时调度程序的算法在设计实时操作系统时至关重要,算法的优劣直接影响调度的性能以及系统对外部事件的响应时间。

2.3 时钟细粒度定时器

许多实时应用真正需要的不是在每一个微秒都发生时钟中断,而是在任何一个微秒都允许发生时钟中断,这样不再将时钟芯片设置为固定的频率,而是设置为下一个事件要发生的时间。这种设置时钟芯片的方式称之为一次性模式。但是,这样做的代价是在每个中断后重设时钟。RTLinux既提供了周期性模式,也提供了一次性模式。Kansas大学开发的Kurt-Linux采用了一次性模式。

对于周期性时钟中断方式,时钟中断频率越高,系统的开销就越大;一次性模式可有效地支持硬实时系统,减少时钟中断的次数,但对时钟定时器的编程将变得复杂。在细粒度定时器的实现中,要多方位思考,采取适合实际应用环境的解决方案。

3 结束语

本文从内核抢占机制、实时调度策略、时钟细粒度定时器三方面,对嵌入式Linux实时化技术进行了探讨。Linux在实时性支持方面存在着不足,在开发基于Linux嵌入式实时操作系统中,有许多关键技术需要解决。随着Linux实时性能的逐步完善,以及嵌入式Linux实时系统在控制领域中的深入应用,必然进一步促进其发展,相信Linux将在嵌入式实时应用场合中发挥巨大的作用。

上一篇:物联网初探 下一篇:停车场管理系统的结构化分析与设计