摘 要:嵌入式系统的开发与研究已成为当前的一个热点,Linux由于其独有的优势而成为很多厂家开发嵌入式应用的系统,而ARM作为一种高性能、低成本的嵌入式RJsC微处理器,已成为应用最广泛的嵌入式处理器.
关键词:嵌入式系统;Linax
嵌入式系统是以应用为中心,以计算机技术为基础适应应用系统对功能、可靠性、成本、 体积、功耗要求严格的专用计算机系统。Linux由于其自身的特性,几乎是天然地适合于嵌入式系统,是目前最具商业前景的Linux应用,越来越多的企业和研发机构都转向嵌入式Linux的开发和研究上,使得Linux在嵌入式领域的应用方兴未艾。
1.嵌入式Linux的特点
1.1Linux系统是模块化结构且内核完全开放
Linux是由很多体积小且性能高的微内核系统组成,对Linux 经过小型化裁剪后,能够固化在容量仅有几十万字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux操作系统。在开源的前提下,用户可以根据实际应用需要方便地进行裁减,从而低成本地设计和开发出满足自己需要的嵌入式系统,这符合嵌入式产品根据需要定制的要求。
1.2强大的网络支持功能
Linux支持所有标准Internet协议,并可利用Linux的网络协议栈将其开发成嵌入式的TCP/IP网络协议栈;Linux还支持ext2、ext3fat16、fat32、romfs等多种文件系统,为开发嵌入式系统奠定了很好的基础。
1.3较强的可移植性
Linux具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,可以跨越嵌入式系统开发中仿真工具的障碍。Linu也符合IEEE POSIX.1标准,具有较好的可移植性[3]。在内核代码完全开放的前提下,不同领域和不同层次的用户可以根据自己的应用需要很容易地对内核进行改造,在低成本的前提下, 设计和开发出真正满足自己需要的嵌入式系统。
1.4Linux具有广泛的硬件支持特性
与U n i x 相类似,L i n u x 以内核为基础,完全的内存保护,多任务多进程, 使得它适合嵌入式系统中比较复杂的应用。支 持广泛的计算机硬件, 包括: X 8 6 , A R M, N E C , MO T O L O R A 等大部分芯片,支持各种主流硬件设备和最新硬件技术,甚至可在
没有存储管理单元的处理器上运行。强大的网络支持和功能广泛的硬件支持使嵌入式Linux具有更广泛的应用前景。
2.嵌入式驱动程序开发流程
嵌入式Linux系统驱动程序开发与普通Linux区别在于编译时需进行交叉编译。嵌入式设备由于硬件种类丰富,在缺省的内核发布版中不一定包括所有驱动程序,可以在硬件生产厂家或者Internet上寻找驱动程序,如果找不到,可以根据一个相近硬件的驱动程序来改写,这样可加快开发速度。实现一个嵌入式Linux设备驱动的大致流程如下:
(1)定义主、次设备号,也可以动态获取;
(2)实现驱动初始化和清除函数。如果驱动程序采用模块方式,则要实现模块初始化和清除函数;
(3)设计所要实现的文件操作,定义file_operations结构;
(4)实现所需的文件操作调用,如read、write等;
(5)实现中断服务函数(中断不是每个设备驱动都需要),并用request_irq向内核注册;
(6)将驱动交叉编译到内核或交叉编译成模块,用insmod命令加载;
(7)用mknode生成设备文件。
3.Linux嵌入式系统的开发模式
嵌入式系统是资源受限系统,直接在嵌入式系统的硬件平台上编写软件比较困难。一般先在通用计算机上编写程序,然后通过交叉编译,生成目标平台上可运行的二进制代码,最后下载到目标平台上运行。具体步骤如下:
3.1建立嵌入式Linux交叉开发环境
交叉开发环境是指编译、链接和调试嵌入式应用软件的环境。它与运行嵌入式应用软件的环境有所不同,通常采用宿主机/目标机模式。目前常用的交叉开发环境有开放式和商业化两种类型。开放式的典型代表是GNU工具链,目前已经能够支持x86、ARM、MIPS、PowerPC等多种处理器;商业化的主要有Metrowerks CodeWarriorARM Software Development Toolkit等。
3.2交叉编译和链接
编码完成后进行编译和链接,以生成可执行代码。通常会生成两种类型的可执行文件:用于调试的可执行文件和用于固化的可执行文件。由于开发过程大多是在Intel公司x86系列CPU的通用计算机上进行的,而目标环境的处理器芯片却大多为ARM、MIPS、PowerPC、DragonBall等系列的微处理器,这就要求在建立好的交叉开发环境中进行交叉编译和链接。
3.3交叉调试
●硬件调试。如果不采用在线仿真器,可以让CPU直接在其内部实现调试功能,并通过在开发板上引出的调试端口,发送调试命令和接收调试信息,完成调试过程。
●软件调试。嵌入式Linux系统内核调试,可先在Linux内核中设置一个调试桩(debug stub),用作调试过程中和宿主机之间的通信服务器。然后在宿主机中通过调试器的串口与调试桩进行通信,并通过调试器控制目标机上Linux内核的运行。
嵌入式上层应用软件的调试可以使用本地调试和远程调试两种方法。如果采用本地调试,首先要将所需的调试器移植到目标系统中,然后直接在目标机上运行调试器来调试应用程序;如果采用远程调试,则需要移植一个调试服务器到目标系统中,并通过它与宿主机上的调试器共同完成应用程序的调试,目标机上使用的调试服务器通常是gdbserver,而宿主机上使用的调试器则是gdb。两者相互配合共同完成调试过程。
3.4系统测试
嵌入式系统的硬件一般采用专门的测试仪器进行测试,而软件则需要在相关测试技术和测试工具的支持下,采用特定的测试策略进行测试。在嵌入式软件测试中,常常要在基于目标机的测试和基于宿主机的测试之间做出折衷:基于目标机的测试需要消耗较多的时间和费,而基于宿主机的测试虽然代价较小,但毕竟是在仿真环境中进行的,难以完全反映软件运行时的实际情况。这两种测试可以发现不同的缺陷,关键是要对两种测试环境下的测试内容进行合理取舍。
4.嵌入式Linux面临的挑战
4.1Linux的实时性扩充
L i n u x 分内核态和用户态两种模式。进程运行在用户态时。 实时进程具有较高的优先级,能进行进程抢占, 故可以较好的
完成任务。当进程运行在内核态时,如系统调用,实时进程不能抢
占该进程。因此, 本质上, L i n u x 内核是非抢占 式的。所以在开发嵌入式Linux系统过程中,首要问题是扩展Linux的实时性能。可从两方面进行:向外扩展和
向上扩展。向外扩展即从范围上扩展,让Linux支持的范围更广、支持的设备更多;向上扩展是扩充Linux内核,从功能上扩充Linux的实时处理和控制系统。
4.2改变Linux内核的体系结构
Linux内核采用Monolithic结构,内核的所有部分都集中在一起且所有部件在一起编译连接。但在系统较大时体积也较大,与嵌入式系统容量小、资源有限的特点不符。要使嵌入式Linux应用更加广泛,可将目前Linux的Monolithic内核结构中的一部分改造成MicroKernel结构,使Linux既有很好的实时性,又能满足嵌入式系统体积小的要求。
4.3完善Linux的集成开发环境
完整的嵌入式系统集成开发环境一般需提供的工具是:编译/连接器、内核调试/跟踪器和集成图形界面开发平台。其中集成图形界面开发平台包括编辑器、调试器、软件仿真器和监视器等。
在Linux系统中,具有功能强大的gcc编译器工具链,使用了基于GNU的调试器gdb的远程调试功能,但Linux在基于图形界面的特定系统定制平台方面,与Windows操作系统相比还存在差距。因此要使嵌入式Linux在嵌入式操作系统领域中的优势更加明显,集成开发环境还有待提高和完善。
结束语
由于Linux的免费与开源性、对各种设备的广泛支持性等独特的技术优势和独特的开发模式,使得越来越多的企业和高校表现出对它极大的研发热情。但是随着其实时性能的逐步完善,以及嵌入式L i n u x 系统在控制领域的深入应用, 必然进一步促进新型控制算法的实现,开辟一个崭新的控制天地。
参考文献:
[1]马义德,刘映杰,张新国.嵌入式系统的现状及发展前景[J].信息技术,
[2]谢蓉.Linux基础及应用[M].中国铁道出版社,2008.6.
[3]霍拉鲍夫.嵌入式Linux-硬件、软件与接口[M].陈 雷,钟书毅,译.北京:电子工业出版社, 2003.
[4]李善平,刘文峰,王焕龙.Linux与嵌入式系统[M].清华大学出版社,
[5]马忠梅.ARM&Linux嵌入式系统教程[M].北京航空航天大学出版社,