摘要:Linux系统不仅能够运行于PC平台;然而在嵌入式系统中Linux仍然可以大放光线。本文描述了嵌入式系统的特色,和如何在嵌入式系统中应用Linux。
计算机用于嵌入式控制设备领域的历史和计算机本身的历史一样久远。最初的用于控制机电式电话交换器的通讯设备中“固态控制程序”就是嵌入式程序。“计算机系统”在当时并不普遍;所以固态程序存放在内存中控制相应的设备。在那种时代,运行控制程序是很先进的思想,而且当时也只能如此而已。
那时的计算机是专为特定的用户设计,非凡的应用程序指令、I/O设备和主要的计算设备集成在一起。微处理器的产生改变了这种局面,价格低廉、结构小巧的CPU和外设连接在总线上形成了比较大的系统。这种硬件架构很稳定,于是在这个基础上,这建立起了通用的软件开发环境和编程模式,且简化了编程,。
软件也在随着硬件的发展而发展;开始只有简单的工具用于编程和调试,而且每一个软件都必须从头编写。程序大都采用宏汇编语言,汇编程序还不很完善,调试是一件很麻烦的事。因此一直到70年代的中期,模块化编写程序和标准化的运行库才逐渐流行起来。 在70年代的后期,出现了嵌入式系统的操作系统。它们采用汇编语言编写,而且只能运行在相应的非凡处理器上;处理器过时,则这个操作系统就没有用处了,对新的处理器必须重新编写操作系统的所有代码。C语言出现以来,采用C语言操作系统更有效率了,操作系统的编写有了很大的改观。C语言有很好的稳定性和可移植性,所以今天的许多操作系统都使用C来编写。 于是在80年代末,出现了好几个商业的嵌入式操作系统。而且它们已经演化成为今天的主流嵌入式操作系统。比如很有名的、使用者众多的操作系统:Vxwork、pSOS、Neculeus和Windowss CE。
不过很多的嵌入式系统还没有使用操作系统,它们仅仅包含一些控制流程而已。在嵌入式系统相对简单的情况下,这些控制流足以应付。但是,当嵌入式系统的功能复杂后,简单控制逻辑就不够用了,这时你必须使用操作系统。假如不使用操作系统将会使得控制系统逻辑结构复杂混乱,很轻易出错。再者,有些嵌入式系统需要接入网络系统,比如宾馆的门锁控制已经需要接入网络,因此就更需要嵌入式的操作系统来支持应用软件。
除了商业化的操作系统外,还有其他的有版权要求的非商业化嵌入式操作系统可以使用。然而今天的Linux系统有着嵌入式操作系统需要的很多特色、突出的优势:适应于多种CPU和多种硬件平台,性能稳定,裁剪性很好,开发和使用都很轻易。因此,我们决定在嵌入式系统中使用Linux操作系统。
1.它具有很好的工具,可以跨越ICE等屏障
原来开发嵌入式系统的要害是需要一套好用的开发和调试工具;而且在开发所不同阶段还需要不同的工具。就比如工匠,只有好的工具才能够使工作完成得又好又快。
传统的开发调试工具就是ICE-在线仿真器;它取代目标板的微处理器,给目标程序提供仿真环境,同时可以连接监视器;答应开发者调试和监视程序的运行。尽管这种运行方式会引起一些希奇的问题,但是它总能够让你明了程序在目标板的工作状态,免除了对底层的软硬件接口的猜测。但是,这种设备价格非常贵。过去,甚至在整个开发期内,开发嵌入式系统主要依靠这些调试工具。 可是,我们发现,一旦软硬件能够正常支持串口的运行时,我们可以使用其他的调试办法。现代的嵌入式系统采用相当成熟的微处理器。因此很轻易使得串口工作。串口连接成功,可以进行很多的开发调试。所以我们不用ICE也可以很好地开始开发和调试工作了,同时还降低开发费用。
Linux利用GNU项目的C编译器来编译程序,使用gdb源程序级调试器来调试程序。它们提供了合适的手段来使你能够开发嵌入式的Linux系统。为了开发基于Linux的嵌入式系统,可以按以下方法进行:
向串口输出提示字符串,例如“hello Word ”或“Waston, come here I need you!”等, 然后通过串口,指挥gdb开始工作。以这种方式和另外一台运行gdb程序的Linux主机系统“交谈”,通过串口,你可以很方便地让gdb调试目标程序。通过串口和gdb通讯,可以进行C源程序级的调试。甚至你还可以以串口把其他的程序下装到RAM或flash存储器。通过串口,使用gdb可以使得软硬件的初始化代码继续运行到核心全部启动。
一旦核心在运行了,你就可以使用其他的更好的调试工具,象Kgdb等,假如连接了网络,你也可以让网络工作起来。同时你就可以用GUI的xgdb来调试应用程序。
2.满足实时性时要求
细细分析起来,大多数系统并不需要严格的实时性。而嵌入式系统也经常被误解为就是实时性系统。其实,多数嵌入式系统并不需要实时性,而且实时性本身是个相对的概念绝对的实时性是指对需要的服务以限定的方式和在限定时间内提供,比如在微秒级内响应。
这种硬实时性功能只是针对非凡的设备而言 ,例如数字信号处理等。而这些要求使用非凡的硬件 如FIFO、DMA 和其他非凡设计的硬件 也可以满足 。
有些设计者不能够准确地分析出系统真正实时需求,很多情况下对实时的需求在1-5 毫秒内响应 就可以;大部分情况下,软实时响应足以满足要求:WINDOWSS 的98Crashed_Yet 在98% 的时间内可 以在4 每秒内响应 ,假如时间是20 秒,则总会响应。那些软实时性轻易满足。需要考虑的因素包括:上下文转换时间、中断延迟、任务的优先级和任务调度方式。上下文转换时间曾经是实时性分析的重点,但是因为CPU速度大幅度提高,它不再是要害问题。
现在,严格要求的实时性任务的决定因素是中断例程本身和内核中的其他驱动程序有关;而响应延 迟时间主要受中断的优先级和其他进程会暂时地关闭中断响应的影响。因此治理和驱动中断的机制必须 保证实时要求。
对于Intel x86处理器,实时扩充可以在Linux 系统中很轻易进行,RT-Linux 就是很好的例子(见http://www.rtlinux.org/)。 它主要是把Linux 的任务作为自己的一个任务,因此实时性要 求很高的任务不受非实时的Linux 的干扰,可以得到满足。另外还提供了实时任务和Linux 的基本核 心和其他任务间的接口,这些接口是不需要很强的实时性。这种架构为其他的嵌入式系统提供了一个参 考。要害因素就是实时性的代码和非实时代码分开设计,而且实时应用程序的处理方式和其他程序的处 理方式差不多。
3. 适合嵌入式系统的Linux 有一种观点认为 :
用户不必直接干预机器的运行,即没有用户接口的应用系统是嵌入式系统。其他的比如电梯控制 系统应该是嵌入式系统,但是它需要人为控制 。连接网络需要监视和控制网络系统运行的系统 ,仍 然是嵌入式系统;因此应该根据系统的主要目的和功能来判定是否是嵌入式系统。
最小的嵌入式Linux 系统必须包括以下主要的要素:
1.启动程序 ;
2.融合了内存治理、进程治理和时间分批服务的核心;
3.初始化程序。为了达到要求,而且为了保持最小系统,需要添加以下要素:
硬件的驱动程序;
必须的应用程序。 根据其他需要, 你可能增加以下功能:
1. 文件治理系统( 在ROM 或RAM中);
2. TCP/IP 通讯协议;
3. 磁盘。
4.选择合适的硬件平台选择硬件平台是一件很麻烦的事,受很多因素影响,比如公司的指导原则、个人偏见、过去产品的影响和消息不灵通等。费用是考虑的主要因素。提醒你考虑价格时不要只注 意CPU 的价钱,要对整个系统进行考虑。但是假如你是系统设计师,你必须把软件的实时性和硬件结合起来考虑。首先考虑需要多快的CPU,然后把选择三倍化的结果;因为在实际中应用程序会使用一些cache( 缓 冲),所以理论上速度很快的CPU的实际速度会降低。其次考虑选择多快的BUS( 总线); 假如可以包括其他的总线,比如PCI,就加上它。因为有时即使使用DMA方式传输,也会使快速CPU 变得象蜗牛一般。选用集成外设的CPU比较好,而且还可选用现成的外设驱动程序 ,大大减少调试工作,实际上有些芯片集成的功能并不是我们所需要的,所以也不要认为凡是集成的都是好东西。
5.压缩制作 Linux 系统对Linux 的通常感觉是大,似乎不适合于嵌入式系统。事实并非如此。 因为典型的发行Linux 集成了很多桌面PC 机需要而嵌入式系统并不需要的功能。首先 ,我们可以把 核心(kernel) 从其他任务中分离出来。标准的Linux 核心总是贮留在内存中;当需要应用程序时, 它把需要的程序从磁盘调入内存运行。程序运行完毕,内存清空,卸载程序。在嵌入式系统中 ,经常 没有磁盘 。 目前有两种办法来处理没有磁盘的情况。对于比较简单的系统,核心(kernel)和应用 程序同时贮留在内存 ,当系统启动时,就启动应用程序。这种方式和以前的嵌入式系统一样工作。Linux 系统也支持这种方式。 第二种方式是,考虑到Linux 有load ( 装 载)和unload( 卸 载)程序的能力,嵌入式系统也可以使用这一特点,来节约内存。假如有一个典型的嵌入式系统:包 括8 到16 M 的Flash Memory 和8 到16 M 的RAM ;可以在Flash Memory上建立文件系统,使用Flash 的驱动程序来驱动Flash Memory上文件系统工作。 另外,也可以使用Flash Didsk, 其中有 一个例子是M-system 的DiskOnChip, 它可以支持达160 M 的Flash Disk。 把使用的应用程序文 件存放在Flash 文件系统上, 根据需要调入程序。 这种动态装入方法有很多优点:
(1) 因为在Linux 中有一些应用程序只是在初始化时使用一次,然后就没有用处了,另外它们 运行方式是一个接一个, 顺序进行的 。可以答应初始化