Linux嵌入式套用是以Linux为基础的嵌入式作业系统的套用,它被广泛套用在行动电话、个人数字助理(PDA)、媒体播放器、消费性电子产品以及航空航天等领域中。
基本介绍
- 中文名:linux嵌入式套用
- 套用:行动电话、个人数字助理等
- 类别:嵌入式作业系统
- 基础:Linux
优势
第一,Linux是开放原始码的,不存在黑箱技术,遍布全球的众多Linux爱好者都是Linux开发者的强大技术支持者;而Windows CE是非开放性OS,使第三方难以实现产品定製。
第二,Linux的原始码随处可得,注释丰富,文档齐全,易于解决各种问题。
第三,Linux的核心小、效率高;而Windows CE在这方面是笨拙的,占用过多的RAM,应用程式庞大。
第四,Linux是免费的OS,在价格上具有竞争力,适合中国国情。Windows CE的着作权费用时厂家不得不考虑的因素。
第五,Linux不仅支持x86晶片,还是一个跨平台的系统。到目前为止,它可以支持20-30种CPU,很多CPU(包括家电业的晶片)厂商都开始做Linux的平台移植工作,而且移植的速度远远超过Java的开发环境。
第六,Linux核心的结构在网路方面是非常完整的,它提供了包括十兆位、百兆位及千兆位的乙太网,还有无线网路、Token ring(令牌环)和光纤甚至卫星的支持。
第七,Linux在核心结构的设计中考虑适用系统的可裁减性的要求,Windows CE在核心结构设计中并未考虑适应系统的高度可减剪性的要求。
种类
Linux嵌入式套用方面的产品主要有三种:
第一类是专门为Linux的嵌入式套用而做的。产品的研发方向是如何让Linux更小、更容易嵌入到体积要求和功能、性能要求更高的硬体中去,如MontaVista的MontaVista Linux 等。
第二类是专门为Linux的实时特性设计的产品。将Linux开发成实时系统尤其是硬实时系统,套用于一些关键的控制场合。如:Fsmlabs公司开发出来RT-Linux产品已经用在工业控制的很多方面。
第三类的产品是将实时性和嵌入式方案结合起来的方案。很多公司这幺做,并且提供集成化的开发方案。所以在选择嵌入式要求和实时性要求时,应该选择适合自己的嵌入式Linux。
套用
Linux的实时套用许多嵌入式系统要求能预测、可限定回响时间地回响外界事件,此类实时系统包括工厂自动控制、数据採集、控制系统、音频及视频套用、多数电脑化产品及设备。儘管Linux不是一个真正的实时作业系统(Linux核心不提供对事件优先权及抢占特性的支持),但它已经有几个增加的选择可以给基于Linux的系统提供实时特性。其中,最常用的办法就是双核结合,把一个通用作业系统作为一个任务运行在一个实时核心上。通用作业系统提供磁碟读写、网路及通讯、串并口读写、系统初始化、记忆体管理等功能,而实时核心则处理实施事件的回响。双核心策略充分兼容标準的Linux,而又不採用一种不干扰原Linux的方式来增加了实时功能。嵌入式Linux系统的执行流:加电,启动FLASH MEMORY 中的boot → Linux核心 → 核心启动,初始化外 → 运行应用程式
1.它具有很好的工具,可以跨越ICE等屏障
原来开发嵌入式系统的关键是需要一套好用的开发和调试工具;而且在开发所不同阶段还需要不同的工具。就比如工匠,只有好的工具才能够使工作完成得又好又快。
传统的开发调试工具就是ICE-线上仿真器;它取代目标板的微处理器,给目标程式提供仿真环境,同时可以连线监视器;允许开发者调试和监视程式的运行。儘管这种运行方式会引起一些奇怪的问题,但是它总能够让你明了程式在目标板的工作状态,免除了对底层的软硬体接口的猜测。但是,这种设备价格非常贵。过去,甚至在整个开发期内,开发嵌入式系统主要依*这些调试工具。可是,我们发现,一旦软硬体能够正常支持串口的运行时,我们可以使用其他的调试办法。现代的嵌入式系统採用相当成熟的微处理器。因此很容易使得串口工作。串口连线成功,可以进行很多的开发调试。所以我们不用ICE也可以很好地开始开发和调试工作了,同时还降低开发费用。
Linux利用GNU项目的C编译器来编译程式,使用gdb源程式级调试器来调试程式。它们提供了合适的手段来使你能够开发嵌入式的Linux系统。为了开发基于Linux的嵌入式系统,可以按以下方法进行: 向串口输出提示字元串,例如“helloword”或“Waston,comehereIneedyou!”等,然后通过串口,指挥gdb开始工作。以这种方式和另外一台运行gdb程式的Linux主机系统“交谈”,通过串口,你可以很方便地让gdb调试目标程式。通过串口和gdb通讯,可以进行C源程式级的调试。甚至你还可以以串口把其他的程式下装到RAM或flash存储器。通过串口,使用gdb可以使得软硬体的初始化代码继续运行到核心全部启动。
一旦核心在运行了,你就可以使用其他的更好的调试工具,象Kgdb等,如果连线了网路,你也可以让网路工作起来。同时你就可以用GUI的xgdb来调试应用程式。
2.满足实时性时要求
细细分析起来,大多数系统并不需要严格的实时性。而嵌入式系统也经常被误解为就是实时性系统。其实,多数嵌入式系统并不需要实时性,而且实时性本身是个相对的概念绝对的实时性是指对需要的服务以限定的方式和在限定时间内提供,比如在微秒级内回响。这种硬实时性功能只是针对特殊的设备而言,例如数位讯号处理等。而这些要求使用特殊的硬体如FIFO、DMA和其他特殊设计的硬体也可以满足。
有些设计者不能够準确地分析出系统真正实时需求,很多情况下对实时的需求在1-5毫秒内回响就可以;大部分情况下,软实时回响足以满足要求:WINDOWSS的98Crashed_Yet在98%的时间内可以在4每秒内回响,如果时间是20秒,则总会回响。那些软实时性容易满足。需要考虑的因素包括:上下文转换时间、中断延迟、任务的优先权和任务调度方式。上下文转换时间曾经是实时性分析的重点,但是因为CPU速度大幅度提高,它不再是关键问题。
现在,严格要求的实时性任务的决定因素是中断例程本身和核心中的其他驱动程式有关;而回响延迟时间主要受中断的优先权和其他进程会暂时地关闭中断回响的影响。因此管理和驱动中断的机制必须保证实时要求。
对于Intelx86处理器,实时扩充可以在Linux系统中很容易进行,RT-Linux就是很好的例子。它主要是把Linux的任务作为自己的一个任务,因此实时性要求很高的任务不受非实时的Linux的干扰,可以得到满足。另外还提供了实时任务和Linux的基本核心和其他任务间的接口,这些接口是不需要很强的实时性。这种架构为其他的嵌入式系统提供了一个参考。关键因素就是实时性的代码和非实时代码分开设计,而且实时应用程式的处理方式和其他程式的处理方式差不多。
3.适合嵌入式系统的Linux有一种观点认为:
用户不必直接干预机器的运行,即没有用户接口的套用系统是嵌入式系统。其他的比如电梯控制系统应该是嵌入式系统,但是它需要人为控制。连线网路需要监视和控制网路系统运行的系统,仍然是嵌入式系统;因此应该根据系统的主要目的和功能来判定是否是嵌入式系统。
最小的嵌入式Linux系统必须包括以下主要的要素:
1) 启动程式;
2) 融合了记忆体管理、进程管理和时间分批服务的核心;
3) 初始化程式。为了达到要求,而且为了保持最小系统,需要添加以下要素:a. 硬体的驱动程式;b. 必须的应用程式。根据其他需要,你可能增加以下功能:a) 档案管理系统(在ROM或RAM中);b) TCP/IP通讯协定;c) 磁碟。
4.选择合适的硬体平台选择硬体平台是一件很麻烦的事,受很多因素影响,比如公司的指导原则、个人偏见、过去产品的影响和讯息不灵通等。费用是考虑的主要因素。提醒你考虑价格时不要只注意CPU的价钱,要对整个系统进行考虑。但是如果你是系统设计师,你必须把软体的实时性和硬体结合起来考虑。首先考虑需要多快的CPU,然后把选择三倍化的结果;因为在实际中应用程式会使用一些cache(缓冲),所以理论上速度很快的CPU的实际速度会降低。其次考虑选择多快的BUS(汇流排);如果可以包括其他的汇流排,比如PCI,就加上它。因为有时即使使用DMA方式传输,也会使快速CPU变得象蜗牛一般。选用集成外设的CPU比较好,而且还可选用现成的外设驱动程式,大大减少调试工作,实际上有些晶片集成的功能并不是我们所需要的,所以也不要认为凡是集成的都是好东西。
5.压缩製作Linux系统对Linux的通常感觉是大,似乎不适合于嵌入式系统。事实并非如此。因为典型的发行Linux集成了很多桌面PC机需要而嵌入式系统并不需要的功能。首先,我们可以把核心(kernel)从其他任务中分离出来。标準的Linux核心总是贮留在记忆体中;当需要应用程式时,它把需要的程式从磁碟调入记忆体运行。程式运行完毕,记忆体清空,卸载程式。在嵌入式系统中,经常没有磁碟。目前有两种办法来处理没有磁碟的情况。对于比较简单的系统,核心(kernel)和应用程式同时贮留在记忆体,当系统启动时,就启动应用程式。这种方式和以前的嵌入式系统一样工作。Linux系统也支持这种方式。第二种方式是,考虑到Linux有load(装载)和unload(卸载)程式的能力,嵌入式系统也可以使用这一特点,来节约记忆体。假如有一个典型的嵌入式系统:包括8到16M的FlashMemory和8到16M的RAM;可以在FlashMemory上建立档案系统,使用Flash的驱动程式来驱动FlashMemory上档案系统工作。另外,也可以使用FlashDidsk,其中有一个例子是M-system的DiskOnChip,它可以支持达160M的FlashDisk。把使用的应用程式档案存放在Flash档案系统上,根据需要调入程式。这种动态装入方法有很多优点:(1)因为在Linux中有一些应用程式只是在初始化时使用一次,然后就没有用处了,另外它们运行方式是一个接一个,顺序进行的。可以允许初始化程式的代码在使用完毕后被废弃,不必永远存放在记忆体。因此相同记忆体可以运行不同的程式。这样很节省记忆体的。(2)软体更新比较容易;可以在系统运行的情况下更新应用程式和驱动程式。
6.如何处理虚拟记忆体标準的Linux还有一个特点是使用虚拟记忆体,程式过大,可以交换到虚拟存储器上。这是一个神奇的功能,它使得程式有很大的运行空间。然而,在嵌入式系统中,这个功能似乎没有用武之地,因为没有磁碟。这个功能对于嵌入式系统,特别要求实时性很强的系统来说的确不那幺重要,因为这个机制会浪花费时间,所以,嵌入式系统的应用程式还是在固定的地方运行比较好。不过提醒你重注意,考虑到一些CPU有这方面的特点,建议保留虚拟存储器的代码。不仅因为剔除这部分代码很费事,如果剔除相关代码,还容易造成其他问题。更主要的是这保留了这部分功能,能够使得不同进程使用相同代码。如果没有了这个功能,每个程式都需要自己的运行库,在记忆体中就会有库的很多拷贝。其实只需把交换空间的长度设定为零,就可以关闭虚拟记忆体的页面换入和换出功能。对一些CPU,虚拟存储器的功能提供记忆体管理,防止不同程式占用相同的地址空间。而在嵌入式系统中,使用简单、绝对的地址空间,因此这种功能也不会起作用。不过这到提供了防止误写以至于使系统崩溃的功能。很多嵌入式系统习惯使用“全局变数”,让进程共享数据。在Linux系统中提供共享记忆体方法让进程共享数据信息。在RT-Linux中使用FIFO进行信息交换。
7.处理档案系统很多嵌入式系统没有磁碟和档案系统;Linux也可以在没有磁碟的系统上运行。正如上面提到的,应用程式可以和核心一起编译,在启动时一起装入运行。这适应于简单系统,但不具有灵活性。其实,许多商业的嵌入式系统都提供档案系统的选择。大都是特殊的档案系统或者兼容MS-DOS档案系统。Linux提供包括MS-DOS等许多选择。其他的档案系统具有更好的性能。Linux还具有许多实时商业作业系统所不具备的检查和修复档案系统的功能。这种功能对于通过网路更新的系统尤为重要。Linux的档案系统可以建立在传统的磁碟上、FlashMemory、或其他载体。甚至可以用RAM磁碟存放临时档案。有些系统中包含了廉价的CD-ROM,它比FlashMemory更便宜,更新升级更容易。Linux系统可以从CD-ROM中启动以及运行程式。在网路化的嵌入式系统,Linux支持NFS(网路档案系统)。于是,你可以使用很多网路功能。首先,可以通过网路来启动应用程式。因为通过伺服器来启动应用程式,所以是进行软体更新的最好解决办法。其次,在运行过程中,可以很方便地导入和导出数据、状态设定和状态信息等。这个功能很适合用于远程监视和控制套用系统。例如,在RAM中建立磁碟,保存各种需要的重要数据,远程系统登录到此RAM档案系统,读取数据,然后在操作者的机器上用图形界面显示运行状态,起到很好的监视效果。
8.设定启动-LILO和BIOS当微机启动时,它运行预定地址的代码,那地址通常是在唯读存储区,存放有启动代码。在PC中,即BIOS,它执行底层的CPU初始化工作和初始化设定其他硬体。BIOS确认哪个硬碟存放作业系统,拷贝作业系统到RAM中,然后运行作业系统。同样,Linux在PC上运行,依*PC的BIOS来设定硬体、启动OS。在嵌入式系统中,通常没有BIOS,因此,需要提供等价的启动代码。嵌入式系统并不需要象PC那样灵活的BIOS启动程式,它初始化的硬体比较单一。这段代码其实很简单,只是把一些很重要,而且还要特殊的写入顺序要求的数据写入硬体的暂存器。另外必须具备的功能有记忆体检测,点亮LED,检测其他很重要的硬体。这些代码的针对性很强,不需要很好的移植性。所以不同的硬体环境需要不同的启动代码。为了进行测试,可以使用ICE(线上仿真器)或其他的设备来调试这部分代码。这部分代码总是运行在Flash或EPROM等晶片上,所以,需要把它们写入这些晶片。如何写,当然因硬体的不同而不同了。一个最为普通的方法是使用EPROM或Flash烧录器,把程式烧录在晶片,然后把晶片插入板上。另外的方法是通过JTAG接口进行。
9.嵌入式的Linux同样健壮可*和其他的运行于PC的系统相比,Linux是最可*和最稳定的作业系统。而嵌入式的核心也是如此的。Linux的核心移植到新的微处理器上,基本不用什幺修改。因此Linux可以使用许多计算机板。外设的驱动程式也多如牛毛,而且比其他的都稳定好用。但是,如果不是PC平台环境,那幺你必需为特殊硬体编写驱动程式。对于各种硬体的相似驱动程式市面上随处可见,所以,你可以DOWN下来修改而成,所以安装新的或特殊驱动器、网卡、串口、并口就不困难了。不过,我还是建议你在身边放一本Kernel的书比较好,以备查找。在我的经验中,我觉得使用Linux的错误大都是对系统的了解不準确所至。况且,Linux的原始码随处可得、注释丰富、文档齐全,你完全可能自己去解决问题。
10.结束语嵌入式的Linux系统也有缺点。和某些商业作业系统一样,占用较大的记忆体。当然可以去掉部分无用的功能来减小使用的记忆体,但是,如果不仔细,将引起新的问题。有些Linux的应用程式需要虚拟记忆体,而嵌入式系统中并没有或不需要虚拟记忆体,所以,并非所有的Linux应用程式可以在嵌入式系统运行。核心的调试工具并非完尽人意,虽然可以使用kgdb,不过我们更多的是使用print语句来帮助调试。在套用于嵌入式系统的主要问题是:Linux本身具有很大的灵活性,而嵌入式系统不具有灵活性,它们主要针对特殊的问题。这是问题的关键。总之,Linux用于开发嵌入式系统的套用软体是可能的和可行的。
环境搭建
(1)安装Linux
首先应该安装RedHat 6.2版本的Linux,因为uClinux的原作者使用的是RedHat6.2平台。为了避免可能出现的不必要的麻烦,建议使用RedHat6.2平台。
(2)GNUgcc交 叉编译器的建立
我们使用的是m68k-elf-tools-20010716.tar.gz,安装命令是:
tar xzf m68k-elf-tools-20010716.tar.gz
执行后会把ColdFire的交 叉编译器安装到/usr/local/目录下面。其中/usr/local/bin目录下是执行档。
(3)安装调试工具BDM的驱动(BDM Driver)
下载gdb-bdm-20010901.tar.gz 用下述命令解压:
tar xzf gdb-bdm-20010901.tar.gz
执行后会新建gdb-bdm-20010901目录,在该目录下面运行:
./local_script/build_it
然后到/gdb-bdm-20010901/driver/linux目录下面运行:
make install
然后运行:
mknod /dev/bdmcf0 c 34 4 添加ColdFire系列CPU的BDM驱动。
在档案/etc/conf.modules添加:
alias char-major-34 bdm
在档案/etc/rc.d/rc.local添加:
/sbin/insmod bdm
再到/gdb-bdm-20010901/lib下面:
make install
(4)测试BDM
到/gdb-bdm-20010901/test目录下面:
./chk /dev/bdmcf0,可以测试BDM驱动是否工作正常。
(5)编译GDB
下载gdb档案gdb-5.0.tar.gz,用下述命令解压:
tar xzf gdb-5.0.tar.gz
到生成的目录gdb-5.0下面运行:
patch -p1 </where/gdb-bdm-20010901/gdbPatches/gdb-5.0-patch
where就是/gdb-bdm-20010901的目录。
然后运行
./configure --target=m68k-bdm-elf--prefix=/usr/local/
再运行
make
然后是
make install
这样,整个交 叉编译平台和Debug平台就建立完成了。接下来就可以编译运行在CPU上的彙编C程式了。
发展前景
以信息家电为代表的网际网路时代嵌入式产品,不仅为嵌入式市场展现了美好前景,注入了新的生命,同时也对嵌入式作业系统技术提出新的挑战。
(1)嵌入式套用软体的开发需要更加强大的开发工具和作业系统的支持。随着Internet技术的成熟、频宽的提高,Internet提供的信息内容日趋丰富,套用项目多种多样,像电话手机、微波炉等嵌入式电子设备的功能不再单一,电气结构也更为複杂。为了满足套用需求,设计师们一方面採用更强大的嵌入式处理器(如32位、64位RISC晶片或信号处理器DSP)增强处理能力,同时还採用实时多任务编程技术和交叉开发技术来控制功能複杂性,简化应用程式设计,保障软体质量和缩短开发周期。另外,嵌入式系统还应需要一套高度简练、质量可靠、套用广泛、易开发、多任务并且价格低廉的作业系统。所以Linux作为一个完全免费和开放的OS,在今后必然是开发嵌入式系统首选的作业系统。
(2)网路成为必然趋势。为适应嵌入式分布处理结构和套用上网的需求,嵌入式系统要求配备一种或多种标準的网路通信接口(IEEE1394、USB、CAN、Blue tooth等)和相应的网路协定簇(TCP/IP、SNMP等)支持。而Linux与生俱来的优秀网路血统,更为上网套用的发展铺平了一条宽广平坦的道路。
(3)实现小尺寸、微功耗和低成本。在一定程度上讲,嵌入式产品的微型化、低功耗和低成本与高的处理器的性能是一对不可调和的矛盾。所以要达到微型化,就要求相应地降低处理器的性能;同时也就相应地提高了对嵌入式软体设计技术要求。对于系统的小型化,Linux可以说在众多的嵌入式作业系统中是最优秀的。Linux由于原始码是公开免费的,所以可以根据需要进行裁减、修改等,从而实现系统软体微型化。
(4)提供精巧的多媒体人机界面(HMI)。嵌入式设备之所以为亿万用户乐于接受,重要因素之一是它们与使用者之间的亲和力和自然的人机互动界面。人们与信息终端的互动要求以GUI萤幕为中心的多媒体界面。目前嵌入式Linux的GUI系统有Micro Windows、OpenGUI、Qt/Embedded、Mini GUI等。总之,能有一个让客户非常满意的人机界面,也是今后嵌入式系统的发展方向。
(5)嵌入式作业系统走向融合。现在面对如此多的嵌入式作业系统,开发者有时感觉到很不方便。这是因为,如果在基于OS1的作业系统上开发的应用程式,现在想在OS2上用,则必须进行移植才可使用。随着嵌入式设备的不断发展,将来必将会出现一个能支撑几乎所有应用程式的作业系统。或者说将来的嵌入式作业系统必将走向融合。而惟一能担当此任的无疑是Linux。因为它提供了一个让任何人都能自发地为其发展找寻出路的游戏规则。