• 沒有找到結果。

实时内核设计

在文檔中 嵌 入 式 系 统 应 用 开 发 (頁 148-152)

第 4 章 嵌入式 Linux

4.4 Linux 的基本命令

4.5.2 实时内核设计

Linux 要在嵌入式领域推广应用,只进行嵌入式改造是不够的。随着嵌入式领域对实 时性的需求不断增加,如何提高嵌入式Linux 内核的实时性成为业界与用户关注的焦点。

1. Linux 内核在实时性方面的不足

Linux 系统是类 Unix 系统,从本质上说,Linux 系统也是分时系统。它在实时性方面 存在以下问题。

(1) Linux 分为用户态和内核态两种模式,进程运行在用户态时,实时进程具有高的优 先级,能进行进程抢占,故可以较好地完成任务。运行在内核态时,如系统调用,实时进 程不能抢占该进程。因此,从本质上来说,Linux 内核是非抢占式的。

(2) 在定时器方面,有几方面的缺陷。第一,Linux 的周期模式定时器频率仅为 100Hz,远不能满足多种实时应用的要求。第二,软定时由时钟定时器完成。当软定时器 较多时,势必引起共享时钟定时器的冲突。第三,Linux 中断句柄不可调度,但在实时系 统中,期望能在一个可调度整体内处理这些中断句柄,从而能更有效地区分不同实时任务 的紧迫度,分配不同的优先级。因此,单纯缩短时间片在对实时性能严格要求的场合是不 受欢迎的。第四,增加系统负荷。

(3) Linux 进程采用多级轮转调度算法,该调度算法,仅能获得秒级响应时间。一个 实时进程在一个时间片内未完成,其优先级将降低,从而可能造成到截止时间无法完成。

(4) Linux 虽然给实时进程提供了较高的优先级,但并没有加入时间限制。例如完成 的最后期限、应在多长时间内完成、执行周期等。同时,其他大量的非实时进程也可能对 实时进程造成阻塞,无法确保实时进程的响应时间。另外,当有多个实时进程互斥请求共 享资源时,由于其使用的同步原语不支持优先级继承协议(PIP),易产生优先级倒置。

(5) Linux 是一个通用的操作系统,以满足大多数用户需要为目的。而嵌入式系统是 面向用户、面向产品、面向应用的,因此在构造嵌入式 Linux 时,可以根据具体的需要进 行定制和修改,为 Linux“瘦身”,以完成目标功能为目的,而无需在其他方面尽善 尽美。

2. 当前 Linux 在实时内核方面的发展

针对前文提到的 Linux 实时性方面问题,有几种改进 Linux 内核实时性能方面的思路 和方法。

(1) 兼容内核方法

兼容内核方法即含有一个兼容 Linux 内核,符合 POSIX 的 API 层的实时内核。该方 法适用于拥有独立实时操作系统和兼容Linux 的 API 开发商。但由于未使用 Linux 内核,

无法充分利用Linux 的优势,且采用非 Linux 内核模式,不遵循 GPL,故获得内核源代码 的费用非常昂贵。

(2) 双内核方法

双内 核系 统在 硬件 平 台上 增加 一个 实时 内核 ,建立双 内核 ,如 现在 流行 的 RT-Linux。但在提高其实时性的同时,难以保证功能上的完整性和对原有 Linux 资源的充分 利用,且调度机制简单,不能满足复杂需要。在协调双内核工作时,寻求一种合理的实时 和非实时的混合调度机制是亟待解决的问题。

(3) 内核修改方法

通过修改 Linux 内核源码来实现。RED-Linux 就采用该方法。在内核代码中增加抢占 点,从而减少内核抢占延迟。然而,由于这些修改是局部,属于软实时,而非硬实时。

(4) 源内核方法

源内核方法是面向对象的方法,提出一个动态实时任务的执行应依赖于产生该响应的 源事件,而非应用程序本身。该方法建立的实时内核能提供更快捷响应,提高实时性。但 是,由于源事件的不确定性,使建立一个应用范围较广的实时系统较为困难。该方法适用 于小型嵌入式系统的设计。

通 过 以 上 分 析 可 知 , 软 实 时 扩 展 空 间 较 小 , 在 控 制 领 域 , 只 有 硬 实 时 才 符 合 RTOS(Real Time Operating System)的发展方向。上述硬实时方式也有自身的缺陷,有待进 一步的深入探讨和改进。

3. 改进嵌入式 Linux 内核实时性的方法

从微定时器、双内核可抢占式体系结构、实时任务调度策略三个方面对嵌入式 Linux 内核进行研究,并提出相应的提高实时性的方法。

(1) 微定时器

在分时系统中,定时器触发时钟中断,每个时钟中断是一次进程调度时机,Linux 中 每个时钟中断触发3 个函数协同工作,共同完成进程调度过程。具体如下。

l schedule()进程调度函数,根据当前调度策略从就绪队列中选择下一个将被执行 的进程。

l do_timer(),该函数是时钟中断服务程序的主要组成部分,被调用频率就是时钟 中断频率。

l ret_from_sys_call()系统调用返回函数,当一个系统调用或中断完成时,该函数被 调用处理一些收尾工作。

可以看出,定时器频率直接影响到系统响应速度和上下文切换的系统开销。Linux 的 定时器提供 10ms 的调度粒度。对于许多实时系统来说,通常需要微秒级的定时器,故此

调度粒度不满足系统响应速度要求。

在这方面,解决办法是在硬件上提供一个细粒度定时器。但在这种情况下,不能再采 用单模定时器,应选择多模定时器。原因如下。

l 定时器频率太小,将极大地增加系统消耗,不论是否有事件产生调度需要,CPU 总是频繁地被中断。

l 一个实时系统并不要求系统在每一个微秒都产生中断,而是在任何一个微秒都能 允许发生中断。因此在这种情况下,定时器的时钟频率不必固定,仅需设置为下 一个事件要发生的时间,即一次模式。单模定时器只能用于周期性较强的实时操 作系统中。

为平衡系统功能,应该采用具有一次模式和周期模式混合的细粒度定时器。在引入细 粒度定时器后,我们在 Linux 系统中增加对定时器模式和粒度的控制函数,根据不同实时 应用的响应时间需要,选择不同定时器模式和粒度。从任务响应时间的角度出发,即可控 制内核抢占时间(KPT)。

(2) 双内核可抢占式体系结构

嵌入式实时操作系统微内核是一般操作系统的子集,担负着任务管理、任务控制、任 务间的通信,任务的同步与互斥、资源管理等诸多功能。在设计 Linux 内核体系结构时,

采用双内核结构,如图 4.4 所示。其中,使用实时内核来运行实时任务,用 Linux 内核来 运行非实时任务。例如,利用实时内核运行一个实时任务来完成数据采集,另一个实时任 务完成控制输出功能;同时利用Linux 内核上运行的图形界面来显示数据。

如图 4.5 所示,为解决 Linux 实现硬实时的最大障碍,使 Linux 内核为完全被抢占的 采用混合内核方案,我们在嵌入式系统对Linux 系统进行了如下修改:

图4.5 双内核结构

第一,添加一个实时内核。由它管理中断,提供一些必要的功能,如底层服务创建、

中断服务程序,并且为底层服务、ISR 和 Linux 进程间的通信排队。其中实时核优先级较

高,而Linux 内核的优先级较低。

第二,对 Linux 内核进行修改和定制。首先,对 Linux 进行定制,即“瘦身”。嵌入 式系统以完成应用功能为目的,可以根据实际需要定制 Linux。以设计一个数据采集器为 例,其功能是对现场数据进行采集,并传送到上位机,而且要求各个数据采集器之间实现 多点通信。

首先,根据该数据采集器的功能定制Linux 如下。

l 在进程管理方面,由于数据采集和传送,即多点通信均属于实时任务。为此,设 计进程调度时,采用可抢占式优先级调度,而且使采集和传送任务的优先级高于 多点通信。

l 在设备方面,去掉声卡、显卡等无关设备的功能支持,保持串口、并口等相关设 备的支持。

l 在存储管理方面,去掉虚拟存储功能。

l 在文件系统方面,采用单一文件支持,无需多文件格式。

l 在网络方面,无需服务器功能,只需保持数据的上传功能和采集器之间的对等通 信功能。

其次,对已“瘦身”的Linux 内核进行修改,主要有三方面:

l 在 Linux 内核中影响实时性能的地方增加控制点,使内核在控制点可以被抢占,

减少内核抢占延迟。

l 将执行时间较长的系统调用划分为几个甚至十几个较小的块执行,使实时任务能 随时中断非实时任务。

l 根据实际需要,增加部分功能。

在设计中,把实时要求强的应用编写成实时任务在实时内核上直接运行,而其他任务 在 Linux 内核运行。Linux 内核由于优先级较低,可以随时被实时任务抢占。所有的任务 是运行在实时内核还是 Linux 内核均由实时内核来决定。在运行每一个任务时,首先判断 任务的来源,如来自优先级较高的实时事件,则判定为实时任务,直接在实时内核中运 行。如该任务是非实时任务,则交与 Linux 内核运行,相关内容在下一节详细讨论。由于 嵌入式系统中的实时任务都是通过计算机接口进入系统的,因而可以在硬件上固定每一个 任务或任务子集的优先级,如通过8259 中断器来设计事件的优先级,当 8259 产生一个中 断时,系统只是简单地在事件表中报告这一事件的发生,然后立即将对 CPU 的控制权交 给实时内核,由其通过软件方法判断事件的属性及优先级,进而使之在相应的内核中执 行,而不像一般Linux 内核那样去查中断向量表并执行相应的中断服务程序。

可抢占式内核体系结构的设计中引入这种双内核设计方案,取得了较高的硬实时性能 和丰富的系统调用支持。

(3) 实时系统调度策略

常用的实时调度算法有三种:优先级调度、时间片轮转调度和共享驱动调度。为了满 足应用多样化的需要,常常把几种调度算法结合起来用,下面就介绍一种基于多种实时调

常用的实时调度算法有三种:优先级调度、时间片轮转调度和共享驱动调度。为了满 足应用多样化的需要,常常把几种调度算法结合起来用,下面就介绍一种基于多种实时调

在文檔中 嵌 入 式 系 统 应 用 开 发 (頁 148-152)