ARM嵌入式系统的软件开发方法
ARM嵌入式系统在硬件选型和PCB硬件平台设计完成之后,就可以根据硬件和应用的需求,开始软件系统的功能和结构设计了。一般而言,嵌入式系统的软件可以采用两种,一种是缺少操作系统的嵌入式控制系统软件,另一种是在具备嵌入式操作系统情况下的嵌入式软件。
例如,有些系统的ARM芯片上运行Linux等操作系统;而另外一些ARM芯片上使用的却是不带操作系统的软件,如使用ADS开发的ARM Evaluator,其程序的运行通过板载程序配合下载程序实现。不过嵌入式操作系统在嵌入式系统中的作用日显重要,它可以为嵌入式系统开发人员提供一个基本的软件开发和运行的支撑平台,从而大大减小复杂嵌入式系统的开发难度和开发周期,增强系统的稳定性,降低开发和维护成本。
1. 软件开发流程
ARM嵌入式软件的一般开发过程是:设计目标硬件板,建立嵌入式Linux开发环境,编写、调试Boot-loader,编写、调试Linux内核,编写、调试应用程序,调试ARM板。Boot-loader用于初始化目标板、检测目标板和引导Linux内核。高速BDM(BackgroundDebug Mode,背景调试模式)/JTAG接口用于目标板开发,它可以检测目标板硬件、初始化目标板、调试Boot-loader和BSP,如图所示。
图 嵌入式软件开发流程
在嵌入式Linux开发过程中,选择好的嵌入式Linux开发平台和调试工具可以极大地提高嵌入式Linux开发效率。嵌入式系统的特点是系统资源小,因此具体目标板的设备驱动程序(Device Driver)需要定制,BDM /JTAG调试工具是开发Linux内核的很好手段。调试工具利用CPU的JTAG接口,对运行程序进行监控,不占用系统的其他资源。
从软件开发的角度出发,一个嵌入式Linux系统可以分为4个层次。
(1)引导和加载Linux内核的程序,主要是用户自己编制的Boot-loader程序。Boot-loader的功能相当于PC的BIOS,在硬件板一加电后就开始运行,它要用串行电缆把PC与硬件开发板连接起来,在PC端通过对程序的编译,生成一个bin文件,通过简易的JTAG探头,把它烧写到Nand-Flash。
Boot-loader主要完成硬件初始化,同时设置Linux启动时所需要的参数,然后跳到Linux内核启动代码的第一个字节开始引导Linux。
(2)Linux内核,为特定的嵌入式硬件系统板定制的内核及内核的启动参数。为了实现Linux内核的移植,要把编译生成的Boot-loader,Kernal Image(内核)及Root Filesystem(根文件系统)烧写到Hash中。在编译内核的时候,还可以选择需要支持的网络协议,所支持的主要协议包括TCP/IP(如TCP、IP、UDP、ICMP、ARP、RARP、FTP、TFTP、BOOTP、DHCP、RIP、OSPF、HTTP等)。由于内核己经支持多种网络协议,因此通过加载不同的应用程序,就可以实现相应类型的应用。
(3)和Linux内核配合使用的根文件系统,包括建立根文件系统和建立于Flash设备上的文件系统。将文件系统也烧写到Hash后,Linux就可以在硬件板上正常运行了。
(4)用户应用程序。为了使人机交互界面友好,通常在用户应用程序和Linux内核层之间移植一个嵌入式图形用户界面(Graphic User Interface,GUI)。
2. 软件开发环境构建
对于Linux下的ARM开发环境,最重要的是一个交叉编译器,其次是一个标准的C库。然而编译一个可靠的ARM交叉编译器,是非常复杂的工作,有两个方法可以得到一个ARM交叉编译器。
(1)到专门为ARM开发建立的网站下载一个别人编译好的编译器,如网站ftp∶//ftp.arm.linux.Org.uk/pub/armlinux/toolcham,这里提供了多个版本的交叉编译器,它们都是基于glibc的C库,但glibc的C库比较庞大,不适合作为小型的嵌入式系统开发使用。所以可以选择第二种方法去构造一个基于更小的C库μClibc的编译器。
(2)编译一个交叉编译器,虽然这个工作非常复杂,但Linux平台下面有全世界的爱好者在共同维护,所以可以找到许多编译一个交叉编译器的方法。
www.μClibc.Org网站中提供了一个基于pClibc的C库交叉编译器的构造方法,这个编译器是针对多平台的。μClibc是原来μCLinux(一个专门用于没有MMU的嵌入式芯片使用的Linux版本)开发过程中的一个C库,现在已经独立于μLinux项目并且进一步完善。它目前己经可以支持很多的系统平台,而且它比glibc更加小巧,非常适合作为嵌入式的开发。很多原来基于glibc开发的软件在μClibc下面也可以很方便地移植,甚至无须做任何改动就可以编译运行。;μClibc对glibc的大部分函数都做了重写,并且保持名称一样。利用μClibc构建嵌入式Linux系统将比glibc占用更小的空间。
构建好了软件开发环境或交叉编译器,就可以
- Linux嵌入式系统开发平台选型探讨(11-09)
- 基于ARM体系的嵌入式系统BSP的程序设计方案(04-11)
- 在Ubuntu上建立Arm Linux 开发环境(04-23)
- 达芬奇数字媒体片上系统的架构和Linux启动过程(06-02)
- SQLite嵌入式数据库系统的研究与实现(02-20)
- 革新2410D开发板试用手记(04-21)