标题：linux嵌入式应用
定义：
Linux嵌入式应用是以Linux为基础的嵌入式作业系统的应用，它被广泛应用在移动电话、个人数字助理(PDA)、媒体播放器、消费性电子产品以及航空航天等领域中。
优势：
第一，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。因为它提供了一个让任何人都能自发地为其发展找寻出路的游戏规则。