您的位置首页>企业动态>

基于APIC时钟的嵌入式Linux内核实时化研究

导读 大家好,我是极客范的本期栏目编辑小友,现在为大家讲解 基于APIC时钟的嵌入式Linux内核实时化研究问题。序嵌入式Linux是指一种特殊的Linu

音频解说

大家好,我是极客范的本期栏目编辑小友,现在为大家讲解 基于APIC时钟的嵌入式Linux内核实时化研究问题。

嵌入式Linux是指一种特殊的Linux系统,它是在单片机或内存中量身定制并固化,应用于特定场合。嵌入式系统要求高实时性,但Linux是为分时系统设计的操作系统。最新的内核虽然提高了实时性,但仍然不是实时系统,不能满足很多场合的实时性要求。一般来说,通过修改内核来提高Linux的实时性有两种策略:一种是利用底层编程的方法(如调度算法、时钟修改等)来修改Linux内核。),典型的系统是堪萨斯大学开发的KURT。文献中提出了抢占式内核调度算法,容易导致内核优先级翻转。对于非重启内核,这种方法需要优秀的调度算法。另一种方式是Linux的外部实时扩展,在原有Linux的基础上设计了一个处理实时进程的内核。典型的系统有RTLinux、RTAI等。这种方法的缺点是RTLinux已经停止更新,目前的开源版本只支持2.4内核。RTAI的设计原理类似于RTLinux,也是一个实时应用接口。本文采用APIC时钟修正的方法对Linux内核进行实时改造。修改了APIC中断功能,对APIC中断和8254中断进行排序,使硬实时中断的优先级高于普通8254中断。通过多组仿真实验,验证了变换方法的有效性。

1嵌入式Linux的实时分析。

Linux设计的初衷是系统吞吐量的平衡,其内核试图通过公平的分配策略在所有进程之间平均共享系统资源:

(1)内核不抢占:Linux内核不能在单个处理器上抢占。当任务在内核模式下运行时,优先级较高的进程只有在等待内核模式下的系统调用返回后才能执行,这将导致优先级反转。

(2)进程调度的非抢占性:Linux作为分时系统,采用多级反馈循环调度算法,保证每个进程都有调度策略,但运行在同一队列中,这也是Linux作为实时操作系统的一个弱点。图1是Linux调度机制的框图。

(3)时钟中断精度不高:Linux 2.4.X内核的时钟中断周期为10 ms,时钟粒度过粗,无法满足实时性要求。

(4)Linux的虚拟存储管理:Linux采用段和页机制的虚拟存储管理技术,硬盘和内存之间进程的换入和换出必然会带来额外的开销,造成很大的延迟。

因此,要将Linux应用于嵌入式系统,必须对其进行实时改造,以满足嵌入式领域的需求。

2基于时钟修改的内核修改方案。

在单CPU系统中,所有与时间相关的活动都由8254时钟芯片驱动,产生中断0。细粒度定时器可以通过直接修改内核定时参数HZ的初始值来构建。这种方法实现起来非常简单,但是它导致的频繁定时中断使得系统的开销非常大。当然,随着硬件速度的提高,开销也会逐渐减少。

为了实时处理,简单地修改HZ参数显然是不可取的。Linux 2.6内核的时钟粒度为1 ms,但距离嵌入式领域的实时性要求还很远,因此需要更高精度的时钟。目前常用的修改时钟系统实现实时的方法都是从软件层面入手,已经有了很大的进步,但是分析时钟系统的硬件结构,进行实时工作也是一个值得注意的方向。本文采用先进的APIC时钟实现高精度时钟系统,提供高精度中断响应,从而以较少的变化实现更高的实时性。

APIC以总线频率工作,可以立即执行所有定时器操作。目前x86已经有了片上APIC,用户可以在单个CPU中使用APIC。除了提供高精度时钟之外,APIC还有一个重要的优势,因为它位于片上,所以只需要几个CPU指令周期就可以对其进行编程,而访问英特尔X86 8254则需要几条速度较慢的ISA总线指令。

在100兆赫兹的中央处理器系统中,一个中断的处理时间不到10微秒,因此高速中央处理器可以在更短的时间内完全处理更多的APIC中断。理论上,APIC可以实现10 ns左右的系统时钟,但实际上处理中断需要一些时间,因此中断的响应时间大于10 ns。

APIC本身提供了一个中断处理函数APIC_TImer_interrupt,它包括Irq_enter(),Run_realTImer_queue()和irq_exit(),其中irq_ exit函数通常负责判断目前是否有8254产生的软中断,如果有,就会触发8254软中断,这会造成APIC的硬中断处理延迟。本文的思路是修改irq_exit,将每个软中断线程和硬中断线程进行排序,使APIC硬中断的优先级高于软中断,此时优先考虑硬中断线程,从而提高内核的实时性。Irp_exit函数的核心代码如下:

以上调用invoke_sofTIrq()函数执行软中断成为本次修订的重点。修改中断向量表,对向量表中的所有软中断和实时中断进行排序,并提前硬中断的时间片,使得当前处于挂起状态的软中断被屏蔽挂起,直到硬中断处理完成。将invoke_sofTIrq()函数修改为:

每个处理器时间片只能处理一个中断。通过更新当前任务时间片,硬中断第一时间得到CPU响应,此时屏蔽软中断,保证硬中断能得到实时响应。

由于Linux使用8254来完成时序分配,所以需要预留8254来保证系统的稳定性。在这种情况下,82。

54定时器和APIC必须共存,对于硬实时应用,可采用APIC时钟进行计时。在8254中断过程中,如果产生APIC中断,采用通过本文的方珐必须对优先对APIC时钟进行响应,会出现8254中断被抢占,此时上下文切换等操作可能导致不可预料的错误。解决问题的方法可采取在APIC相应中断期间,关闭软中断,只有当APIC中断执行完毕后,8254软中断才能够被响应。

12下一页全文
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。