1.Linux的优点: 广泛的硬件支持 Linux可以支持x86、ARM、MIPS、ALPHA、PowerPC等架构,并且已经成功移植到几十个硬件平台,能够几乎可以在所有流行的CPU上运行。Linux拥有极其丰富的驱动资源,支持各种主流硬件设备和最新的硬件技术,甚至可以运行在没有内存管理单元(MMU)的处理器上,进一步推动了Linux在嵌入式系统中的应用。 内核高效稳定 Linux内核的高效和稳定已经被各个领域的大量事实所验证。Linux内核设计非常精巧,分为进程调度、内存管理、进程间通信、虚拟文件系统和网络接口五个主要部分,其独特的模块机制可以在其中插入或移除某些模块内核实时根据用户的需要。这些特点使得Linux系统内核可以裁剪得非常小,非常适合嵌入式系统的需要。 开源代码,丰富的软件 Linux是一个开源的免费操作系统,为用户提供了最大的自由度。由于嵌入式系统千差万别,往往需要针对特定??的应用进行修改和优化,因此获取源代码就变得至关重要。Linux软件资源非常丰富,几乎所有的通用程序都可以在Linux上找到,而且数量还在不断增加。在Linux上开发嵌入式应用软件一般不需要从头开始,可以选择一款类似的免费软件作为原型,对其进行二次开发。 优秀的开发工具 开发嵌入式系统的关键是要有一套完整的开发调试工具。传统的嵌入式开发调试工具是在线仿真器(In-CircuitEmulator,ICE),它代替目标板的微处理器,为目标程序提供完整的仿真环境,使开发者能够清楚地了解目标板的工作状态。目标板上的程序便于监控和调试程序。在线仿真器的价格非常昂贵,只适用于非常低级的调试。如果使用嵌入式Linux,一旦软件和硬件能够支持正常的串口功能,即使没有在线仿真器工作,也可以很好地开发和调试,从而节省了可观的开发成本。嵌入式Linux为开发者提供了完整的工具链(ToolChain)。它使用GNU的gcc作为编译器,使用gdb、kgdb和xgdb作为调试工具。调试水平。 完善的网络通讯和文件管理机制 Linux从诞生之日起就离不开互联网,支持所有标准的互联网网络协议,易于移植到嵌入式系统中。此外,Linux还支持ext2、fat16、fat32、romfs等文件系统,为嵌入式系统应用的开发奠定了良好的基础。 2。嵌入式Linux开发技术: 嵌入式系统是根据特定用途专门开发的系统。它只完成预期完成的功能,因此其开发流程和开发环境与传统软件开发相比有显着差异。 1。开发过程 在嵌入式系统的应用开发中,整个系统的开发过程。 嵌入式系统发展到今天,各种微处理器对应的硬件平台普遍通用、固定、成熟,大大降低了硬件系统引入错误的几率。此外,由于嵌入式操作系统屏蔽了底层硬件的复杂性,开发者可以通过操作系统提供的API函数完成大部分工作,从而大大简化了开发流程,提高了系统稳定性。嵌入式系统开发人员现在从迭代硬件平台设计中解放出来,可以专注于满足特定需求。 嵌入式系统通常是一个资源受限的系统,因此直接在嵌入式系统的硬件平台上编写软件是很困难的,有时甚至是不可能的。目前普遍采用的解决方案是先在通用计算机上编写程序,然后通过交叉编译生成可在目标平台运行的二进制代码格式,最后下载到目标平台的特定位置跑步。 支持交叉开发环境(CrossDevelopmentEnvironment)是嵌入式应用软件开发的一个显着特点。交叉开发环境是指编译、链接和调试嵌入式应用软件的环境。它与运行嵌入式应用软件有关。根据环境的不同,通常使用主机/目标模型。 上位机(Host)是一台通用计算机(如PC或工作站),通过串口或以太网接口与目标计算机通信。宿主机的软硬件资源比较丰富,不仅有强大的操作系统(如Windows、Linux),还有各种优秀的开发工具(如WindRiver的Tornado、微软的EmbeddedVisualC++等),大大提高了嵌入式应用软件的开发速度和效率。 目标机(Target)一般在嵌入式应用软件开发过程中用来区分与嵌入式系统通信的宿主机。可以是嵌入式应用软件的实际运行环境,也可以代替实际运行环境。仿真系统,但硬件和软件资源通常是有限的。嵌入式系统的交叉开发环境一般包括交叉编译器、交叉调试器和系统仿真器,其中交叉编译器用于在宿主机上生成可在目标机上运行的代码,而交叉-调试器和系统仿真器用于在上位机和目标机之间完成嵌入式软件的调试。使用上位机/目标机模式开发嵌入式应用软件时,首先利用上位机丰富的资源和良好的开发环境,在目标机上进行软件的开发和仿真调试,然后交叉编译生成的目标代码-编译通过串口或网络传输加载到目标机,并在监控程序或操作系统的支持下使用交叉调试器进行分析调试,最终目标机脱离宿主机独立运行一个特定的环境。 建立交叉开发环境是嵌入式软件开发的第一步。目前,常用的交叉开发环境有两种:开放式和商业式。开放式交叉开发环境的典型代表是GNU工具链,目前能够支持x86、ARM、MIPS、PowerPC等处理器。商业交叉开发环境主要有MetrowerksCodeWarrior、ARMSoftwareDevelopmentToolkit、SDSCrosscompiler、WindRiverTornado、MicrosoftEmbeddedVisualC++等。 2.交叉编译链接 嵌入式软件编码完成后,需要编译链接生成可执行代码,因为开发过程多在使用Intelx86系列CPU的通用计算机上进行,但是,目标环境中的处理器芯片多为ARM、MIPS、PowerPC、DragonBall等系列的微处理器,需要在既定的交叉开发环境中进行交叉编译链接。 交叉编译器和交叉链接器是可以在宿主机上运行并生成直接在目标机上运行的二进制代码的编译器和链接器。比如基于ARM架构的gcc交叉开发环境,arm-linux-gcc就是交叉编译器,arm-linux-ld就是交叉链接器。通常,并不是每一种嵌入式微处理器架构都只对应一个交叉编译器和交叉链接器。比如M68K架构的gcc交叉开发环境,对应了很多不同的编译器和链接器。如果你使用的是COFF格式的可执行文件,编译Linux内核时需要使用m68k-coff-gcc和m68k-coff-ld,需要使用m68k-coff-pic-gcc和m68k-coff-pic-ld。 嵌入式系统在链接过程中通常需要使用较小的函数库,这样最终的可执行代码才能尽可能的小,所以在实际使用中,一般会使用经过特殊处理的函数库。对于嵌入式Linux系统,越来越强大和庞大的C语言函数库glibc和数学函数库libm已经难以满足实际需要,因此他们的细化版本uClibc、uClibm和newlib等。 目前的嵌入式集成开发环境都支持交叉编译和交叉链接,如WindRiverTornado和GNU工具链等,编写的嵌入式软件经过交叉编译和交叉链接后,通常会生成两种可执行文件:Executablefordebugging和可执行的加固。 3。交叉调试 嵌入式软件在编译链接后进入调试阶段。调试是软件开发过程中必不可少的环节。嵌入式软件开发过程中的交叉调试不同于一般的软件开发过程。调试方式不同。在一般的软件开发中,调试器和被调试程序往往运行在同一台计算机上。调试器是一个独立运行的进程,它通过操作系统提供的调试接口来控制被调试进程。在嵌入式软件开发中,上位机和目标机之间的交叉调试用于调试。调试器仍然运行在主机的通用操作系统上,但被调试的进程运行在主机上。在特定硬件平台的嵌入式操作系统中,调试器通过串口或网络与被调试进程进行通信。调试器可以控制和访问被调试进程,读取被调试进程的当前状态,改变被调试进程的运行状态。状态。 交叉调试(CrossDebug),也常被称为远程调试(RemoteDebug),是一种让调试者以某种方式控制被调试进程在目标机器上运行的方法,并具有查看的能力并修改目标机上的内存单元各种调试函数的调试方法,如被调试进程中的寄存器、变量值等。总的来说就是远程调试进程的结构。 嵌入式系统交叉调试的方法有很多种,可以细分为不同的层次,但一般具有以下典型特征: 调试器和被调试进程运行在不同的机器上,调试器运行在PC机或工作站(宿主机)上,被调试的进程在各种专业调试板(目标机)上运行。 调试器通过某种通信方式,如串口、并口、网络、DBM、JTAG或特殊的通信方式与被调试进程建立联系。 目标机一般都有某种形式的调试代理,负责配合调试器完成对目标机上运行的进程的调试。这种调试代理可能是一些支持调试功能的硬件设备(如DBI2000),也可能是一些特殊的调试软件(如gdbserver)。 目标机器可能是某种形式的系统模拟器。通过在宿主机上运行目标机的仿真软件,可以在一台计算机上运行整个调试过程。此时,虽然物理上只有一台计算机,但逻辑上主机和目标计算机还是有区别的。 嵌入式软件开发过程中的调试方法有很多,应根据实际开发要求和条件选择。就调试方法而言,嵌入式系统的交叉调试可分为硬件调试和软件调试。前者使用仿真调试器辅助调试过程,后者使用软件调试器完成调试过程。 硬件调试 相对于软件调试,使用硬件调试器可以获得更强大的调试功能和更好的调试性能。硬件调试器的基本原理是模拟硬件的执行过程,使开发者在调试时可以随时了解系统当前的执行状态。目前嵌入式系统开发中最常用的硬件调试器有ROMMonitor、ROMEmulator、In-CircuitEmulator和In-CircuitDebugger。 使用ROMMonitor方式进行交叉调试需要在上位机上运行调试器,在目标机上运行ROM监视器(ROMMonitor)和被调试的程序,建立上位机和被调试程序之间的通信连接ROM通过调试器在目标计算机上进行监控,它们之间的通信遵循远程调试协议。ROM监视器可以是运行在目标机ROM上的可执行程序,也可以是专门的硬件调试设备,负责监视被调试程序在目标机上的运行状态,共同完成应用使用主机上的调试器。程序调试。使用这种调试方法时,首先将要调试的程序通过ROM监视器下载到目标计算机上,然后在ROM监视器的监视下完成调试。目前使用的ROM监视器大多可以完成设置断点和单步执行。、查看寄存器、修改内存空间等调试功能。 使用ROM模拟器进行交叉调试时,需要使用ROM模拟器。它通常插在目标机的ROM插槽中,专门用来仿真目标机的ROM芯片。使用这种调试方法时,首先将被调试程序下载到ROM仿真器中,相当于下载到目标机的ROM芯片中,然后在ROM仿真器中完成目标程序的调试。ROMEmulator调试方式使用ROM仿真器,虽然避免了每次修改程序都要重新烧写到目标机ROM的费时费力的操作,但是由于ROM仿真器本身比较昂贵,所以其功能相对比较单一。虚弱的。比较单一,所以只适合特定的场合。 使用在线仿真器(ICE)进行交叉调试时,需要使用在线仿真器。它是以目标机器上的CPU为模型专门设计的硬件。它可以完全模拟处理器芯片的行为,提供非常丰富的Debug功能。在用在线仿真器调试的过程中,可以按顺序一步步执行,也可以倒着执行,实时查看所有需要的数据,给调试带来很多方便过程。嵌入式系统应用的一个显着特点是它与现实世界中的硬件直接相关,事先存在各种突变和未知变化,给微处理器指令的执行带来各种不确定因素。在目前的情况下,只能通过在线模拟器来寻找,所以虽然在线模拟器的价格非常昂贵,但还是得到了广泛的应用。 使用在线调试器(ICD)方法进行交叉调试时,需要在线调试器。因为ICE的价格很贵,而且每个CPU都需要一个对应的ICE,使得开发成本非常高,更好的方案是让CPU直接在里面实现调试功能,通过开发板的调试口isexport发送调试命令,接收调试信息,完成调试过程。目前摩托罗拉提供的开发板使用的是DBM调试口,而ARM提供的开发板使用的是JTAG调试口。使用适当的软件工具连接到这些调试端口,就可以进行类似于ICE的调试。影响。 软件调试 软件调试通常是分层次进行的。有时可能需要调试嵌入式操作系统的内核,有时可能只需要调试嵌入式应用程序。在嵌入式系统的整个开发过程中,不同层次的软件调试需要采用不同的调试方法。 嵌入式操作系统的内核调试比较困难,因为不方便在内核中添加调试器程序,只能通过远程调试的方法,通过串口和内置的“调试存根””的操作系统(调试存根)进行通信,共同完成调试过程。调试存根可以看作是一个调试服务器,它通过操作系统获取一些必要的调试信息,负责处理主机发送的调试命令。具体到嵌入式Linux系统内核,在调试时,可以先在Linux内核中设置一个调试存根,作为调试进程与宿主机之间的通信服务器,然后就可以使用调试器的串口和主机中的调试存根通过调试器与目标机通信并控制Linux内核的运行。 嵌入式应用软件的调试可以采用本地调试和远程调试两种方式。与操作系统的调试相比,这两种方法都比较简单。如果使用本地调试,首先要将需要的调试器移植到目标系统,然后就可以直接在目标机上运行调试器来调试应用程序;如果使用远程调试,则需要将一个调试服务器移植到目标系统,并通过它和上位机上的调试器来完成对应用程序的调试。在嵌入式Linux系统开发中,远程调试时目标机上使用的调试服务器通常是gdbserver,宿主机上使用的调试器是gdb,两者相互配合完成调试过程。 3。系统测试 嵌入式系统的硬件一般采用专门的测试仪器进行测试,而软件则需要相关测试技术和测试工具的支持,并采用特定的测试策略。测试技术是指软件测试的专门方法和使这些方法能够更有效地使用的特定方法。在嵌入式软件测试中,往往需要在基于目标机的测试和基于宿主机的测试之间做出折衷。基于目标机的测试需要消耗更多的时间和金钱,而基于宿主机的测试则更小,但毕竟是在模拟环境中进行的,所以很难完全反映实际情况软件运行时。在这两种环境中进行测试可以发现不同的软件缺陷,关键是要在目标机环境和宿主机环境中的测试内容做出合理的选择。 测试工具是指那些可以用来辅助测试的工具。测试工具主要用于支持测试人员的测试工作。它们不能直接用于测试。测试工具一般都是通用工具。测试人员应该对它们进行适当的调整。嵌入式软件测试中经常用到的测试工具主要有内存分析工具、性能分析工具、覆盖率分析工具、缺陷跟踪工具等。 内存分析工具 嵌入式系统的内存资源通常是有限的,内存分析工具可以用来处理动态内存分配过程中产生的缺陷。当动态分配的内存被错误引用时,所导致的错误通常难以重现,并且可能发生的故障也难以追踪。使用内存分析工具可以很好地检测到此类缺陷。目前常用的内存分析工具有软件和硬件两种。基于软件的内存分析工具可能会对代码的执行性能产生很大的影响,从而影响系统的实时性;基于硬件的内存分析工具价格昂贵,只能在特定环境下使用。 性能分析工具 嵌入式系统的性能通常是一个非常关键的因素。开发者一般需要优化系统的一些关键代码来提升性能,遇到的第一个问题自然是确定需要优化哪些代码。性能分析工具可以为开发人员提供有关执行时间如何花费、何时花费以及每个进程使用了??多少时间的数据。这些数据可以帮助确定哪些进程消耗了过多的执行时间,从而可以决定如何优化软件以获得更好的时间性能。此外,性能分析工具还可以指导开发人员发现系统调用中的错误和程序结构中的缺陷。 覆盖率分析工具 在白盒测试过程中,可以使用代码覆盖率分析工具来跟踪执行了哪些代码。分析过程一般由仪器完成。仪器可以嵌入到测试环境的硬件中,或者这可以是将软件添加到可执行代码中,或者两者的结合。通过总结分析结果,开发者可以判断哪些代码被执行了,哪些代码被遗漏了。目前常用的覆盖率分析工具一般提供功能覆盖率、分支覆盖率和条件覆盖率的信息。分享一些视频资料给大家学习,也可以加裙子交流:1126743406Linux开发调试技巧http://www.makeru.com.cn/live...linux进阶http://www.makeru.com.cn/课程...
