首页 理论教育 嵌入式系统构造的关键问题

嵌入式系统构造的关键问题

时间:2023-11-23 理论教育 版权反馈
【摘要】:一个小型的嵌入式Linux 系统需要三个基本元素:①引导工具;②Linux 微内核;③初始化进程。由此可见,构造一个嵌入式Linux 系统,关键是解决以下几个问题。消除嵌入式Linux 系统对磁盘的依赖标准Linux 内核通常驻留在内存中,每一个应用程序都是从磁盘运到内存上执行,当程序结束后,它所占用的内存被释放,程序就被下载了。这是大多数传统的嵌入式系统的工作模式,它同样可以被Linux 支持。

嵌入式系统构造的关键问题

一个小型的嵌入式Linux 系统需要三个基本元素:

①引导工具;

②Linux 微内核(由内存管理、进程管理和事务处理构成);

初始化进程。

若想让它干点什么且继续保持小型化,还得加上:

①硬件驱动程序;

②提供所需功能的一个或多个应用程序。

若再增加功能,或许需要这些:

①一个文件系统(也许在ROM 或RAM 中);

②TCP/IP 网络协议栈;

③一个磁盘用来存放半易失性数据和提供交换能力。

由此可见,构造一个嵌入式Linux 系统,关键是解决以下几个问题。

(1)如何引导

当一个微处理器第一次启动时,它开始在预先设置的地址上执行指令。 通常在那里有一些只读内存,包括初始化或引导代码。 在PC 上,这就是BIOS。 BIOS 首先执行一些低水平的CPU 初始化其他硬件的配置,接着辨认哪个磁盘里有操作系统,将操作系统复制到RAM 并且转向它。 在PC 上运行的Linux 就是依靠PC 的BIOS 来提供相关配置和加载OS 功能的。

在一个嵌入式系统里,出于经济性、价格方面考虑,通常没有BIOS,这就需要开发者自行提供完成这些工作所需要的程序,这就是所需要的开机启动代码。 幸运的是,嵌入式系统的启动代码并不需要像PC BIOS 引导程序那样灵活,因为它通常只需处理一些硬件的配置,所以启动代码只是一个指令清单,将固定的数字塞到硬件寄存器中去。 这个代码很简单也很枯燥,然而却非常关键,因为这些数值要与硬件相符而且要按照特定的顺序进行。 在大多数情况下,一个最小的通电自检模块可以检查内存的正常运行、让LED 闪烁,并且驱动其他的硬件以使主Linux OS 启动和运行。

嵌入式系统中启动代码通常放在Flash 或EPROM 芯片上,具体如何实现,要根据目标硬件和工具来定。 一种常用的方法是将Flash 或EPROM 芯片插入EPROM 或Flash 烧制器,将启动代码烧入芯片,然后再将芯片插入目标板插座,这种方法要求目标板上配有插座;另一种方法是通过一个JTAG 界面,一些芯片有JTAG 界面可以用来对芯片进行编程,这样芯片就可以被焊在主板上。

(2)是否需要虚拟内存(www.xing528.com)

标准Linux 采用虚拟存储器技术来管理内存,其优点是提供了比计算机系统实际物理内存大得多的内存空间,这样编程人员在编程时无须考虑计算机中物理内存的实际容量。 当然它也存在缺点,虚拟内存管理需要通过内存管理单元(MMU)将虚拟地址转换为物理地址,其中的地址转换表和其他一些数据结构占据了内存空间,这样留给程序员的内存空间就减少了,同时地址转换增加了每一条指令的执行时间。

在嵌入式系统中,虚拟内存管理并无用武之地,同时在嵌入式实时系统中,它可能会带来无法控制的时间因素。 但明智的做法并不是清除内核中的虚拟内存代码,有两个原因:一是清楚它很费事,二是它支持共享代码,多个进程可以共享某一软件的同一拷贝。 因此,可保留这段代码,同时只需将交换空间的大小简单地设置为零,就可以关掉虚拟内存的调入功能。此后,如果用户写的程序比实际内存大,系统就会当作是用尽了交换空间来处理,这个程序将不会运行,或者malloc 将会失灵。

(3)文件系统选择

许多嵌入式系统没有磁盘或者文件系统,Linux 不需要它们也能运行。 这种情况下,应用程序任务可以和内核一起编写,并且在引导时作为一个映像加载。 对于简单的系统来说,这足够了,但是缺乏灵活性。 实际上,许多商业性嵌入式操作系统,提供文件系统作为选项。Linux 提供MS-DOS-Compatible 以及其他功能更强大的文件系统。

文件系统可以被放在传统的磁盘驱动器、Flash Memory 或其他这类的介质上,如果用于暂时保存文件,一个小RAM 盘就足够了。 Flash Memory 通常是这样保存文件系统的,Flash Memory 被分割成块,其中有一块是当CPU 启动运行时的引导块,里面存放Linux 引导代码剩余的Flash 可以用作文件系统。 Linux 内核有两种加载方式:一是将内核的可执行映像存储到Flash 的一个独立部分,系统启动时,从Flash 的某个地址开始逐句执行;另一种方式是将内核的压缩文件放在Flash 上,系统启动时通过引导代码将内核压缩文件从Flash 复制到RAM 里解压执行。 因为RAM 的存取速度快于Flash,所以后一种方式的运行速度更快一些,标准Linux 就是采用这种方式。

(4)消除嵌入式Linux 系统对磁盘的依赖

标准Linux 内核通常驻留在内存中,每一个应用程序都是从磁盘运到内存上执行,当程序结束后,它所占用的内存被释放,程序就被下载了。 在一个嵌入式系统里,可能没有磁盘,有两种途径可以消除对磁盘的依赖,这要看系统的复杂性和硬件的设计。

在一个简单的系统里,当系统启动后,内核和所有的应用程序都在内存里。 这是大多数传统的嵌入式系统的工作模式,它同样可以被Linux 支持。

有了Linux,就有了第二种可能性。 因为Linux 有能力加载和卸载程序,一个嵌入式系统可以利用它来节省内存。 在一个典型的具有Flash Memory 的嵌入式系统中,Flash Memory 上装有文件系统,所有的程序都以文件的形式存储在Flash 文件中,需要时可以装入内存。 这种动态的“根据需要加载”的能力是支持其他一系列功能的重要特征。 它使初始化代码在系统引导后被释放。 Linux 有很多内核外运行的公用程序,这些程序通常在初始化时运行一次,以后不再运行,而且这些公用程序可以它们共有的方式一个接一个按顺序运行。 这样,相同内存空间可以被反复使用,以“召入”每一个程序,达到节省内存空间的目的。

如果Linux 可加载模块的功能包括在内核里,驱动程序和应用程序就都可以被加载。 它可以检查硬件环境并且为硬件装上相应的软件,这就消除了用一个程序占用许多Flash Memory来处理多种硬件的复杂性。

软件的升级更加模块化。 可以在系统运行时,在Flash 上升级应用程序和可加载的驱动程序。 配置信息和运行时间参数可以作为数据文件存储在Flash 上。

(5)嵌入式Linux 的实时性

实时系统并非是指快速的系统,所谓“实时系统”,是指在规定的时限内能够传递正确的结果,迟到的结果就是错误。 也就是说,系统操作的正确性不仅依赖于操作的结果,而且依赖于执行操作的时间。 实时系统又可分为硬实时系统和软实时系统。 二者的区别在于:前者如果在不满足响应时限、响应不及时或反应过早的情况下,都会导致灾难性的后果;而后者在不满足响应时限时,不会导致灾难性的后果,但是系统性能会退化。

尽管多数嵌入式系统一般并不要求实时功能,但嵌入式系统往往被划分为实时系统。 其实,对于大多数的系统,1 ~5 ms 的近似实时响应已经足够。 通用的可接受的“实时”概念的定义是:来自外界的事件必须在可预测的、相对短的时间段内得到响应。

Linux 是一个通用的操作系统,标准linux 内核采用Monolithic 体系,模块之间可以任意高效切换,直接沟通,系统响应速度快,执行效率高。 Linux 不支持事件优先级和强占实时性,是不可抢占式系统,因此,Linux 不是一个真正的实时操作系统;但是,可以通过一些方法给基于Linux 的系统加上实时特性。 其中,最常用的办法是双内核相结合,将一个实时内核嵌入到Linux 通用操作系统中,这样,通用操作系统作为一个任务运行在一个实时内核上。 通用操作系统提供磁盘读写、网络及通信、串/并口读写、系统初始化、内存管理等功能,而实时内核则处理实时事件的响应。 在实时内核没有任务运行时,通用操作系统运行。 双内核策略充分兼容标准的Linux,而又采用一种不干扰源Linux 的方式来增加了实时功能。 其中最著名的便是墨西哥科技大学(NMT)开发的RT-Linux。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈