0引言
嵌入系统开发已经趋于规范化,但是嵌入式系统的开发并不像在普通PC机上进行软件开发那样容易,它同样需要一个高度集成的开发平台,来降低开发的难度。目前市场上的嵌入式系统集成开发平台特点是: ( 1)多数嵌入式系统集成开发平台都是以Windows为系统环境,很少有以Linux为系统环境的;( 2)部分集成开发平台具有一定的开放性,许多功能作为插件供用户选择; ( 3)多数集成开发平台通用性较差,仅支持一个或者几个系列的微处理器; ( 4)目前嵌入式系统集成开发平台产品大都价格昂贵; ( 5)很少有集成开发平台集成有图形模块支持的功能。
为了解决其它嵌入式集成开发平台的缺点,本文研究了嵌入式系统可视化集成开发平台,ESGIDE ( Embedded system graphical integrated development environment),其最大特点是具有图形化人机交互功能和ARM CPU工作方式自动初始化。所谓图形化人机交互,是指把将要裁剪和配置的系统级软件(比如bootloader、kernel、通用I /O输入、输出等)化整为零,封装成不同功能的形象化图形模块,开发者根据自己开发的系统需要,选择不同图形模块,动态生成bootloader、kernel、I /O等系统级的源代码,不需要开发者自己输入,这大大简化了开发步骤,减轻了程序员的负担,减少了 *** 作的复杂度,提高了开发效率。另一方面,ARM系列CPU应用比较广泛,不同型号的CPU在开发时需要对使用的内部资源进行初始化。传统的做法是开发者确定工作方式,确定工作方式字,然后手动编程。我们采用开发模式是:以定时器应用为例,将定时器的个数,工作方式确定,时钟频率的确定,是否允许中断等编写成对话框模式,开发者只要选中其中的方式,初始化控制字自动生成,编写代码自动生成,同样大大简化了开发步骤,减轻了程序员的负担。
面向对象技术是当前实现软件模块化、提高软件复用性最优的方法,现在成为计算机领域中的一种主流技术,本文提出利用面向对象的技术来设计一种嵌入式软件IDE,对嵌入式软件开发中的各个对象的类进行分析与设计,架构一个通用的开发模型,根据硬件配置自动产生基本的系统软件方案。只需要系统中的每个对象类的属性及其 *** 作设置,自动搭建交叉编译环境,降低 *** 作系统裁减和移植的难度,产生驱动程序的基本框架。开发人员只需要配置好各个模块的基本信息,将更多精力集中在系统的应用上。
1嵌入式软件的开发流程
与常见的PC和服务器软件不同,嵌入式软件主要是对设备内部各部分的运行进行协调,并不与设备使用者发生直接接触。PC和服务器软件的运行环境是标准化的,而嵌入式软件的运行环境随电子设备的不同而改变,必须针对不同的电子产品进行专门的设计、开发和优化。由于嵌入式Linux *** 作系统在嵌入式开发中占据了主流,因此本文围绕针对移植有Linux *** 作系统的嵌入式开发流程进行讨论。
典型的基于嵌入式Linux *** 作系统的嵌入式软件开发流程如下[1]:( 1)获取硬件系统的信息:如选取的微处理器体系,Flash型号、网卡型号及其他外设的信息等;( 2)建立交叉编译工具:一般的GCC工具都是针对X86体系的,为了能够生产目标板执行的代码必须建立交叉编译工具;( 3)开发Bootloader:建立启动系统的主引导程序;( 4)移植Linux内核:如基于Linux2.6内核移植;( 5)开发一个根文件系统:如rootfs的制作;( 6)开发特定硬件的驱动程序:如LCD,Keypad等;( 7)开发上层的应用程序:如QT GUI开发。
对于开发过程的各个环节,有的提供了辅助的开发工具,有的需要完全依赖经验手工从底层开发,嵌入式软件开发依然停留在手工作坊式的方式,很难做到工程化管理。本文所设计的IDE将涵盖整个开发的各个重要环节,力求最大程度上降低开发难度,在集成化开发环境里完成主要工作。
2 IDE面向对象的分析与设计
对于运行嵌入式Linux *** 作系统的系统,根据其开发流程,利用面向对象技术分析设计出6个基本的大类,并给出对象之间的协作关系图,如图1、图2所示。这几个大类贯穿了嵌入式软件开发的重要环节。
图1嵌入式软件IDE基本类
图2基本对象类的协作图
硬件系统信息类,承载了硬件系统的描述信息,比如选取何种体系的微处理器,处理器的工作频率设置,采用何种启动方式,是NandFlash,还是NorFlash或者EPROM等,用户通过设定这些参数,其他对象将获取其中的信息进行配置。
嵌入式开发需要交叉编译,Linux环境下一般就是采用开源Gcc系列进行配置,环境搭建类管理交叉编译链的源代码,根据体系架构的信息自动生成运行脚本,在制定目录下生成完整的交叉编译链,这是嵌入式开发的基础。
工程管理类,集成开发环境的主要目的就是同一组织文档,省却人工管理,自动编译运行源码,其中包含了文件 *** 作,组织好源代码之间的关系,利用make技术进行编译,牵扯到大量全局环境参数的设定。
引入控制字库类是方便部分程序的编写,比如Bootloader类需要对处理器初始化,基本的驱动控制器进行 *** 作,其中包含了汇编指令级别和C语言的 *** 作,开发人员往往需要对参考手册熟练掌握,大大降低了开发效率。控制字库尽量包含了常见的处理器系列的寄存器控制字库,只需选择某个具体功能,便可产生需要的指令源码。同样驱动程序开发中,也是频繁利用了C语言对寄存器进行 *** 作。
系统移植类涵盖了整个系统需要移植的模块,引导程序, *** 作系统内核和文件系统,各类封装了大量繁杂的细节内容,尽量以最简化形式帮助开发人员完成 *** 作,重要的环节只需设定参数,其他交由对象自动执行。
面向对象最重要的特征就是“高内聚度和低耦合性”,各个对象封装了细节 *** 作,只需要有限的外部接口交换信息,这种柔性思想最大程度上提高了软件的复用性。本文所设计的IDE,根据体系结构的不同,所需修改的只是个别对象的内部数据和 *** 作,整体架构不受任何影响[2,3]。
图3给出了面向对象嵌入式集成开发平台的结构。
图3面向对象的嵌入式集成开发平台结构框图
3系统的具体实现
目前可视化的面向编程语言种类比较多,从对面向对象技术的支持程度上来说,微软最新的VC#从封装性、类型安全性方面相当强大。重要的是,类层次清晰,编码容易,可以根据面向对象设计的框架轻松的进行转换,却和C ++一样强大。所以本文利用VC#设计了嵌入式软件IDE,对各个类编写详细代码。
整个系统基本架构如图4所示。
图4 IDE的系统架构图
集成开发环境运行于Windows平台下,但需要Linux的强大命令集,在此,本文提出了Cygwin技术来模拟Linux运行环境,从而使得IDE的底层得到强大的各种命令支持,可以运行各种脚本文件。此技术属于开源项目,安装后需个别地方的细节修改。
交叉编译工具链模块是IDE设计的核心,开发一个实用的编译器,需要花费大量的人力物力和财力,其可靠性也要经受时间的考验。幸运的是,GNU提供了免费的、功能强大的GCC工具链,它不仅可以编译Linux *** 作系统下的应用程序以及Linux内核,而且还是一款交叉编译器,支持ARM、PowerPC、x86、Intel960、M68等几乎所有知名的CPU厂家,而且国外大多数集成开发工具都从GCC移植而来。
本文的交叉编译工具链模块并不是单独的针对某个体系结构,可以重定向,根据参数配置,生成某个系列的编译工具,如图5所示。
图5交叉工具链模块
软件设计的一个重要环节就是,要组织好源代码之间的关系,编译连接,这就要用到工程化的手段去管理源码。这是IDE设计中的桥梁。
本文利用的Makefile技术对整个工程进行管理,主要就是针对驱动程序和应用程序的组织和编译。Makefile是Linux工程管理的一项成熟的技术,有一套完整的规则,只需要按照规则去编写Makefile文件,然后由make命令去解释执行。Cygwin中集成了Gnumake,因此只要编写好Makefile文件,只需一个make命令,就可以完成所有的编译连接工作,如图6所示。
图6工程管理模块
大多数的IDE都有这个命令,比如: Delphi的make,Visual C + +的nmake,Linux下GNU的make.可见,makefile都成为了一种在工程方面的编译方法。
一个关键技术就是显示信息重定向到IDE指定的输出窗口,各种脚本运行信息都是标准控制台输出,因此需要将编译中的标准信息和错误信息进行重定向。通常是靠管道技术来解决这个问题,但嵌入式开发中许多编译过程长达数小时,信息往往需要进程结束才能完全显示。本文IDE则采用了管道技术加异步式读取技术,使得重定向和信息显示同时进行,及时反馈编译过程中的各种信息。
Bootloader是嵌入式系统的引导加载程序,它的作用是初始化必要的硬件设备,创建内核需要的一些信息并将信息通过相关机制传递给内核,从而将系统的软硬件环境带到一个合适的状态,最终调用 *** 作系统内核,真正起到引导和加载内核的作用[5]。
Bootloader依赖于硬件实现,除了体系结构,还依赖于具体的嵌入式板级设备的配置,因此Bootloader是嵌入式开发移植最困难的部分,一般来说都是将已有的代码进行大量的修改,本文采用的是U-Boot 1.2.0,目前来说是比较通用的Bootloader.如图7所示,针对这部分移植,为了最大程度上帮助用户完成代码的修改,IDE提供不同类型的体系架构需要修改的源码的提示信息,以及某种配置下需要修改的提示信息,需要建立一个帮助文件数据库。通过控制字库模块添加需要的源码。其实一般来说,修改都是大同小异,最主要的是修改两个方面,何种方式启动,是Nadflash还是Norflash,如果是Nandflash启动,需要定义芯片配置函数,增加Nandflash拷贝数据到内存的代码。
还有就是为了利用tft协议烧录内核到flash,需要针对某种网卡芯片进行修改。
图7 Bootloaer移植模块
简单来说,内核配置无非就是生成一个配置文件,由Makefile来读取,不同的架构,就会选择不同架构目录下的源码。但是内核配置比较繁杂,一般人员很难理清源码之间的关系,配置不好,不仅无法编译,即使勉强编译成功,也未必能够正常运行。
而且,内核不单单是配置问题,还有部分源码根据需要必须修改,比如如果是Nandflash作为存储器,需要建立Nandflash分区表。
对于内核配置,本文IDE提供利用模板来进行二次配置,建立模板数据库,根据用户的参数设定,提供符合条件的模板,如果模板基本符合要求,就可以利用模板进行编译,如果需要细节的修改,则调用内核配置工具来进行配置,内核配置工具利用make xconfig形式,产生图形化界面,当然需要X系统的支持,需要在Cygwin中安装、修改。
对于内核源码修改,则需要帮助文件数据库,根据用户参数设置,产生需要的源码,添加到内核中去。如图8所示。
图8内核移植模块
根文件系统是Linux /Unix系统启动的一个重要组成部分,也是 *** 作系统正常工作时候的必要组成部分,在启动时候内核需要跟文件系统来挂载。在现代Linux *** 作系统中,内核代码影像文件保存在根文件中,系统引导启动程序会从这个根文件设备商把内核代码加载到内存中取运行。如图9所示。
图9根文件制作模块
嵌入式根文件系统有RomFS,JFFS2,NFS,EXT2,RAMDISK,Cramfs等,每个系统都有自己的特点,最常用的就是Cramfs文件系统,Cygwin工具集中提供了Cramfs工具,mkcramfs.嵌入式根文件的最底层目录中,都有其具体的用途和目的,因此必须建立最基本的根目录。而且一些根目录下必须有固定的文件,如/bin,/ sbin,/ usr /bin,/ usr /sbin需要放置Linux命令工具,/ etc目录下需要系统配置文件,包括启动文件。因此,本模块要完成这么几个功能,提供必须的根目录,根目录下的文件,将根目录制作成某种跟文件系统,本文暂时提供Cramfs文件系统。嵌入式Linux命令工具集由BusyBox工具提供,它包含了很多标准Linux工具的单个可执行实现,本文的IDE提供了一个BusyBox的标准配置,只需要利用交叉工具链进行编译。
4嵌入式微处理器内部资源驱动
嵌入式微处理器有大量的内部I /O接口资源,如定时计数器、中断、DMA、开关量输入输出等,要选择其中的接口应用,首先要进行初始化,编写驱动程序。
驱动程序编写模块和应用程序编写模块只要提供一个文本编辑器,利用工程管理部分去组织源码进行编译就可以。对于驱动程序的编写,Linux驱动程序都有一套固定的模式,比如字符型、块型、网络型数据结构都有区别,但每种类型的驱动程序架构都一样。另外驱动程序编写中最重要的就是根据每个接口资源确定的工作方式确定控制字,即使开发人员对某个体系下的各类CPU内部资源的控制字十分熟悉,也要经常参考手册才能准确无误。
本文提出了驱动程序编写模式,一个是选择类型,自动生成某种类型的模板,在此模板上进行添加修改;第二就是利用控制字模块,在开发驱动程序过程中,开发人员可以选择某个体系结构下的针对某种具体寄存器的 *** 作,然后会自动产生必要的代码,如图10、图11所示,只需要将代码嵌入到驱动程序源码中。
图10是定时器的选择界面,开发者只要根据需求选择相应的定时器,确定其功能,初始值,然后选择确认按钮,初始化代码自动生成,如图11包含初始化控制字,非常快捷、便利。另外,如果驱动程序要添加到内核去,重新重新配置内核即可。
图9根文件制作模块
嵌入式根文件系统有RomFS,JFFS2,NFS,EXT2,RAMDISK,Cramfs等,每个系统都有自己的特点,最常用的就是Cramfs文件系统,Cygwin工具集中提供了Cramfs工具,mkcramfs.嵌入式根文件的最底层目录中,都有其具体的用途和目的,因此必须建立最基本的根目录。而且一些根目录下必须有固定的文件,如/bin,/ sbin,/ usr /bin,/ usr /sbin需要放置Linux命令工具,/ etc目录下需要系统配置文件,包括启动文件。因此,本模块要完成这么几个功能,提供必须的根目录,根目录下的文件,将根目录制作成某种跟文件系统,本文暂时提供Cramfs文件系统。嵌入式Linux命令工具集由BusyBox工具提供,它包含了很多标准Linux工具的单个可执行实现,本文的IDE提供了一个BusyBox的标准配置,只需要利用交叉工具链进行编译。
4嵌入式微处理器内部资源驱动
嵌入式微处理器有大量的内部I /O接口资源,如定时计数器、中断、DMA、开关量输入输出等,要选择其中的接口应用,首先要进行初始化,编写驱动程序。
驱动程序编写模块和应用程序编写模块只要提供一个文本编辑器,利用工程管理部分去组织源码进行编译就可以。对于驱动程序的编写,Linux驱动程序都有一套固定的模式,比如字符型、块型、网络型数据结构都有区别,但每种类型的驱动程序架构都一样。另外驱动程序编写中最重要的就是根据每个接口资源确定的工作方式确定控制字,即使开发人员对某个体系下的各类CPU内部资源的控制字十分熟悉,也要经常参考手册才能准确无误。
本文提出了驱动程序编写模式,一个是选择类型,自动生成某种类型的模板,在此模板上进行添加修改;第二就是利用控制字模块,在开发驱动程序过程中,开发人员可以选择某个体系结构下的针对某种具体寄存器的 *** 作,然后会自动产生必要的代码,如图10、图11所示,只需要将代码嵌入到驱动程序源码中。
图10是定时器的选择界面,开发者只要根据需求选择相应的定时器,确定其功能,初始值,然后选择确认按钮,初始化代码自动生成,如图11包含初始化控制字,非常快捷、便利。另外,如果驱动程序要添加到内核去,重新重新配置内核即可。
图11自动产生初始化代码界面
5结语
本开发平台具有友好的用户界面、文本编辑器、工程管理工具、交叉编译器、烧录和下载工具、图形化模块支持。本集成开发平台可以供学生、老师或者工程技术人员学习嵌入式linux的裁剪和移植,ARM系列CPU的开发和应用。
利用本文研究的嵌入式软件IDE,针对ARM系列的2410平台进行了U-Boot、Linux2.6内核、根文件系统的配置和移植,编写出基本的网卡驱动程序,测试取得成功。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)