由于嵌入式系统是一个资源受限的系统,所以嵌入系统的软件开发是采用交叉开发实现的。本文总结了嵌入式系统软件的开发技术,分析了嵌入式软件开发的各个过程,给出了每个过程能够使用的各种方法和技术,详细叙述了它们的实现过程,主要内容包括启动软件的选择、启动软件的各种烧写方法、操作系统内核的下载方法、根文件系统的下载方法、NFS文件系统的配置、通过NFS应用程序的交叉开发和目标机程序的编译等。
嵌入式系统将拥有最大的市场。目前在世界范围内嵌入式系统带来的工业年产值已超过了一万亿元, 现在嵌入式系统正处在高速发展阶段。 嵌入式系统通常是一个资源受限的系统,因此直接在嵌入式系统的硬件平台上开发软件比较困难,有时候甚至是不可能的。目前一般采用的解决办法是首先在通用计算机上编写程序,然后通过交叉编译生成目标平台上可以运行的二进制代码格式,最后再下载到目标平台上的特定位置上运行。需要交叉开发环境(Cross Development Environment)的支持是嵌入式应用软件开发时的一个显著特点,交叉开发环境是指编译、链接和调试嵌入式软件的环境,它与运行嵌入式软件的环境有所不同,通常采用宿主机/目标机模式,目标机和宿主机之间的连接通常有三种连接方式:目标机的串口连接宿主机的串口,目标机的JTAG口连接宿主机的并行口,目标机的网口连接宿主机的网口。
本文选用某公司生产的OURS_ ARM9_2410EP为嵌入式目标系统,OURS_ARM9_2410EP是一个典型的嵌入式实验系统, 支持ARM9,具有丰富的外部接口,包括串口、JTAG口、PCMCIA卡、SMC卡、SD卡、USB 、网口和VGA接口等,支持三种启动方式,分别可以从两种NOR FLASH和一种NAND FLASH启动,具有丰富的扩展功能,可扩展GPS&GPRS、射频卡和蓝牙等模块。
一、目标机程序的编译
嵌入式系统中的软件一般包含四个部分:启动部分、操作系统内核、根文件系统和应用程序,这些程序是在宿主机的交叉编译环境中编译成目标机CPU能够运行的目标代码,然后下载到目标机。常用的嵌入式集成开发环境有Tornado、PB(Platform Builder)、ADS(ARM Developer Suite)、GNU工具链等。
二、启动部分的烧写
启动部分的烧写有三种方法:通过JTAG接口使用命令烧写、使用仿真器烧写和交叉烧写,其中交叉烧写要求嵌入式系统中含有两个启动部分。
ARM9_2410EP可以直接从FLASH硬盘的零地址执行代码,也就是说将初始启动代码烧写到FLASH零地址开始的地方就可以启动目标系统。支持ARM结构的启动软件有:U_BOOT、PPCBOOT、REBOOT和BLOB,本文以PPCBOOT为例进行说明。
PPCBOOT是源代码开放并遵守GPL(General Public License )的自由软件,支持多种CPU架构,包括alpha、arm、x86、ia64、mips、mips64、ppc、s390、sh、sparc和sparc64,是被广泛使用的一个启动软件。
首先使用GNU工具链将PPCBOOT编译成在目标机可运行的程序ppcboot.bin,编译过程请参阅文献[1]。
1.通过JTAG接口烧写
JTAG技术可以实现在目标机是裸机的情况下将程序烧写到目标机,是简单和直接的烧写方法。
用JTAG连接线连接宿主机的并口和目标机的JTAG接口,确认已经将JTAG 连接好,通过跳线开关配置要烧写的NOR FLASH。在Red Hat Linux或 Windows XP打开命令窗口,运行命令:
./JFLASH_2410EP_Nor /f: ppcboot.bin
其中JFLASH为烧写工具,/f表示文件,ppcboot.bin是OURS_ARM9_2410EP系统引导程序。
后面有两个选择,表示要烧写的目标地址,分别选择0,0,即开始对FLASH烧写引导程序ppcboot.bin。此后大约等待六七分钟,烧写完成。烧写结束后又出现选择,输入2退出,这时目标板的启动部分烧写完成。使用这种方法烧写的时间比较长,一般较少使用。
2.通过仿真器烧写
在Windows XP中安装ARM ADS集成开发环境,即ARM Developer Suite。安装Multi-ICE仿真器,在宿主机的并口和目标机的JTAG接口之间连接仿真器,连接宿主机的串口和目标机的串口,安装Multi-ICE v2.2软件。运行Multi-ICE Server,点击软件界面左上角的Auto-Configure按钮,在出现仿真器符号后,仿真器连接成功。
通过仿真器可以使程序直接运行在目标机的内存中,不使用目标机的FLASH,有很多程序就是通过仿真器在目标机运行和调试的。
在Windows XP中打开超级终端,在ADS集成开发环境中编译项目ProgramFlash,ProgramFlash是专门编写的操作FLASH的一个软件。通过仿真器运行ProgramFlash,ProgramFlash在超级终端的运行界面。
选择写入的FLASH,然后在超级终端发送ppcboot.bin,按照提示就可以完成启动的烧写。
3.交叉烧写
在目标机支持多启动的情况下, 可以从一个FLASH启动,利用启动软件写FLASH的功能,通过热跳线,写到另一个FLASH中。
如图3所示是一个支持烧写FLASH的启动软件的运行界面,此时通过热跳线到另一个FLASH, 然后选择4就可以实现交叉烧写。
三、操作系统内核的下载
操作系统内核下载到目标机有三种方法:通过JTAG烧写、通过网口和串口从宿主机下载。其中通过JTAG烧写的操作与第一部分相同。在目标机启动PPCBOOT后,由于PPCBOOT支持网口和串口下载,操作系统内核就通过网口或串口下载到目标机。PPCBOOT的详细使用说明见参考文献[2]。
目前使用较多的嵌入式实时操作系统有:美国WindRiver公司设计开发的嵌入式实时操作系统VxWorks、微软公司的WindowsCE、Linux、UC/OS、eCos、Lynx实时系统公司的LynxOS和QNX软件系统有限公司的QNX等。
本文以Linux为例说明操作过程,Linux内核的交叉编译是在Red Hat Linux环境中实现的,编译后内核的文件名是bzImage。
下面分别说明通过网口和串口内核的下载过程。
1.使用网口
从网口下载操作系统内核,首先要在Red Hat Linux或Windows XP中启动tftp服务,启动超级终端,然后启动目标机的PPCBOOT,在超级终端中就可以使用PPCBOOT的tftp命令,将内核下载到目标机。[4]
下面分别说明在Red Hat Linux和Windows XP环境中的操作过程。SMDK2410 #表示PPCBOOT的提示符。
(1)Red Hat Linux环境
实现过程:1)在Red Hat Linux中启动tftp服务;2)在根目录下建立/tftpboot目录;3)把Linux 内核bzImage拷贝到/tftpboot目录下;4)在Red Hat Linux中启动超级终端minicom;5)启动目标板的PPCBOOT;6)在超级终端中运行tftp命令SMDK2410 # tftp 0x30008000 bzImage。其中数值0x30008000为内核下载到实验箱内存中的地址。7)下载Linux内核, SMDK2410# fl 0x1040000 0x30008000 0x100000。三个参数的意义:0x1040000为内核烧写到Flash的地址,当PPCBOOT启动后它会从此地址加载Linux内核。0x30008000为上一步使用的内核下载到内存中的地址。0x100000为内核的大小,0x100000可被替换为大于内核大小且是0x20000倍数的最小整数。
(2)Windows XP 环境
实现过程:1)在Windows XP中启动tftp服务器;2)在Windows XP中启动超级终端;3)启动目标板PPCBOOT;4)在超级终端中运行命令:SMDK2410 # tftp 0x30008000bzImage;5)下载Linux内核:SMDK2410# fl 0x1040000 0x30008000 0x100000。
2.通过串口
从串口下载操作系统内核,同样需要在Red Hat Linux或Windows XP中启动超级终端。启动目标机的PPCBOOT,在PPCBOOT的提示符下输入loadb命令, loadb命令的功能是通过串行线下载可执行文件到目标机,命令格式是:loadb [offset] [baud], 其中Offset是地址偏移量,baud是串口的波特率。
这个命令开始执行后,在超级终端中打开发送文件选项,出现发送文件对话框,在文件名选择项中加入要烧写的内核,然后单击发送,注意超级终端的波特率要与loadb命令的波特率一致。
四、根文件系统
根文件系统(Root File System)下载到目标机的方法与操作系统内核的方法相同。
首先制作根文件系统,Linux根文件系统的制作见文献[5],假定制作后根文件系统的文件名是ramdisk.image.gz,使用下面的命令下载。
SMDK2410# tftp 30800000 ramdisk.imag.gz
SMDK2410# fl 1140000 30800000 200000
其参数意义与上面的内核下载相同。
五、应用程序
由于应用程序运行在内核和根文件之上,所以应用程序的交叉开发能采用更方便的方法,一般采用NFS系统实现。在应用程序运行之前,应交叉编译为目标机的可执行程序。
NFS(Network File System)指网络文件系统,是Linux系统中经常使用的一种服务,NFS是一个RPC service,很像Windows中的文件共享服务。它的设计是为了在不同的系统间使用, 所以它的通讯协议设计与主机及作业系统无关。当使用者想使用远端档案时只要用“mount”就可把远端档案系统挂接在自己的档案系统之下,使得远端的档案在使用上和本地的档案没两样。
NFS系统配置包括目标机和宿主机的配置,其中以宿主机已配置为主。
在NFS服务中,宿主机(Servers)是被挂载(mount)端,为了远端目标机(Clients)可以访问宿主机的文件,宿主机配置两方面内容:打开NFS服务,允许“指定用户”使用。
在Red Hat Linux或Windows XP中均可以使用NFS服务,本文以Red Hat Linux为例进行说明。
1.NFS文件系统配置
宿主机NFS 文件系统的配置过程如下。
首先打开/etc/exports文件,加入如下内容:
/ 192.168.2.* (rw,sync,no_root_squash)。
其中:/表示宿主机的目录,在目标机共享,192.168.2.*为目标机的IP地址范围,括弧内表示操作的权限,然后运行命令:exportfs。
NFS服务的启动是由一些命令来完成的,它们是:portmap、rpc.nfsd、rpc.lockd、rpc.statd、rpc.mountd和rpc.rquotad,如果系统中有这几个命令,就运行下列命令启动NFS服务:service nfs start或/etc/rc.d/init.d/nfsstart;如果系统中没有,就下载工具包nfs-utils-1.0.7.tar.gz,然后编译安装就可以了。在目标机也应该启动NFS服务。在上述的工作完成以后,目标机和宿主机就可以通过NFS 文件系统进行软件的调试和运行,即软件编译在宿主机完成,运行在目标机。
2.通过NFS文件系统进行访问
访问过程的实现如下:在宿主机的Red Hat Linux 中运行命令:minicom,minicom是Linux下的超级终端,进入超级终端后进行一些设置,首先按下Ctrl-A,再按Z,然后选择O,进入配置界面,按上下键选择Serial port setup 进行如下设置:
Serial Device:/dev/ttyS0
BPS/par/bits:/115200 8N1
硬件流、软件流均选择无
然后按ESC键退出配置界面,启动目标机,就在超级终端出现Linux命令提示符,键入命令:ifconfig eth0 192.168.2.2,配置目标机的IP地址,然后在宿主机的控制台运行命令:ifconfig eth0 192.168.2.10,配置宿主机的IP地址。
然后在宿主机的超级终端中键入命令:mount-t nfs 192.168.2.10://mnt/,它的作用是把宿主机的/目录挂接到目标机的/mnt/ 目录中,这时宿主机的/目录下的程序就可以运行在目标机中。需要注意的是宿主机应关闭防火墙。
六、结论
本文对嵌入式开发进行了总结,总结了嵌入式目标机软件的各个部分各种不同的实现方法,详细介绍了它们的实现过程。本文选用OURS_ARM9_2410EP作为实验对象,OURS_ARM9_2410EP是一款具有代表性的嵌入式实验平台,其他产品的操作是类似的。本文介绍的方法可在S3C2410的产品中使用,可对嵌入式开发提供一些参考方法。