集计算机技术、通信技术、微电子技术等多种技术为一体的嵌入式技术进入到了一个飞速发展的阶段,嵌入式系统已被广泛应用到了航空、消费电子、信息家电、网络通信等各个领域。ARM Cortex-A8是嵌入式处理器中性价比较优秀的芯片系列,在各个领域的开发应用有着广阔的应用前景。
船舶导航技术也应随着科学技术背景的改变不断地向着高性能稳定性的方面发展,潜入式技术,为其提供了优质的开发资源。
嵌入式系统需要一套高度简练、易开发、多任务,价格低廉的操作系统。源码开放的Linux满足这些要求。并且标准Linux操作系统比较庞大,因此,需要根据实际应用对标准Linux进行重新的移植、裁剪和配置,生成代码紧凑、代码量小的特定操作系统。
2.导航系统的硬件设计
所设计的车载导航系统的硬件平台以基于Cortex-A8的TI公司的32位高性能嵌入式微处理器AM335X开发板为核心,包含了LCD液晶显示模块、存储器模块(Flash、SDRAM)、GPS模块、串行接口、USB接口、网络接口等外围部分,其硬件构成如图1所示。
AM335X嵌入式微处理器采用16/32位精简指令集,属于Cortex-A8内核,具有高性价比,低功耗,高性能的特点,为掌上设备和一般类型应用提供了小型微控制器的解决方案。为了减少总的系统消耗,AM335X包括了以下部分:独立的32KB指令缓存和32KB数据缓存,MMU,LCD控制器(STN/TFT),NAND Flash启动加载器,存储管理器(片选逻辑与SDRAM控制器),6通道的UART,64通道的DMA,脉宽调制定时器,I/O端口,RTC实时时钟,8通道10位的A/D控制器及触摸屏接口,IIC接口,IIS接口,音频接口,USB主机,USB设备,SD主机/多媒体卡接口,2通道的SPI,摄像头接口,PLL时钟发生器以及电源管理等。
3.船舶导航系统的软件设计
3.1软件功能与组成
船舶导航系统的软件包括嵌入式操作系统、GUI图形用户界面、应用程序三个部分,其中嵌入式操作系统和GUI图形用户界面属于关键技术,它们的好坏决定了系统能否得到成功的应用。应用程序建立在嵌入式操作系统和GUI图形用户界面之上,上电之后启动过程如图2所示。在软件设计中,操作系统采用使用广泛的内核源代码开放的嵌入式Linux,GUI图形用户界面采用源代码开发的Micro windows。
图2 系统启动过程
3.2 交叉编译环境的建立
在满足系统稳定、安全、可靠的基础上,嵌入式产品的体积要尽可能小,从而不能够提供足够的资源供编译过程使用,因此,必须建立一种交叉编译的环境,即在高性能的宿主机上对即将运行于目标机上的程序进行编译,生成可在目标机上可以运行的代码格式,然后下载到目标机中运行。Linux环境下使用GNU工具完成编译、链接等过程,包括针对目标系统的编译器gcc、针对目标系统的二进制工具binutils、针对目标系统的标准c库glibc和针对目标系统的Linux内核头文件。
在linux的根目录下,通过命令tar Ixvf cross-2.95.3.tar.bz2进行解压缩,执行完毕之后在/usr/local/目录下自动生成arm/2.95.3目录,进入2.93.3目录下可以看到arm-linux、bin、include、lib等各种目录,说明交叉编译工具安装完毕,编译环境已经建立起来了。
3.3 引导程序的移植
受嵌入式系统资源的限制,嵌入式系统的引导程序并不像PC机上的引导程序一样是由BIOS和位于硬盘MBR中的引导程序组成,整个系统的引导加载任务主要是由BootLoader的引导程序来完成的。BootLoader是系统复位后首先要执行的代码,主要作用是初始化硬件设备、建立内存空间的映射等,将系统的软硬件环境带到一个合适的状态,从而为操作系统和应用程序的调用建立一个良好的环境。
系统的软件设计中采用的引导程序是韩国Mizi公司开发的BootLoader----vivi。在嵌入式系统中,BootLoader是高度依赖于硬件的,在嵌入式系统中建立一个通用的BootLoader几乎是不可能,因此对于每一种特定的平台,都要移植一个BootLoader。
针对系统的引导程序移植的思路是找到一个与所设计的平台最相近的平台的BootLoader,然后根据所设计平台的硬件参数对BootLoader进行修改,从而完成BootLoader的移植。首先根据实际情况修改vivi工程管理文件Makefile文件中的相关参数,包括交叉编译器库和头文件路径,交叉编译开关选项设置,Linux内核代码中的库和头文件路径等。然后根据硬件平台的参数修改相应的配置,如处理器时钟、存储器初始化、通用I/O初始化。然后进行配置、编译生成可执行的代码。
3.4 内核的移植
由于嵌入式系统是针对特定应用的,而且资源有限,所以标准Linux无法应用到嵌入式系统中,因此必须根据实际情况对Linux进行裁剪、配置,从而产生一个适用的嵌入式Linux操作系统。Linux内核的移植包括获取源代码、修改设置、裁减配置和编译。
3.4.1获取源代码
Linux内核源代码一般都有专门的机构负责维护,我们可以从这些机构的网站上下载下来使用。修改设置
嵌入式系统的应用的针对性很强,从站点上下载下来的内核不可能包含针对所有嵌入式系统的代码,因此需要对代码进行修改设置,从而适合目标平台。一般包含下面几步。
① 编写与处理器相关的代码。主要包括时钟设置、中断设置、存储器分配及其他一些寄存器的设置等等,这些与AM335X处理器相关的代码放在/arch/arm/mach-AM335X目录下。
② 修改根目录下的工程管理文件Makefile,指定所移植的硬件平台和交叉编译器的路径。
③ 修改/ arch/arm目录下的工程管理文件Makefile,指定内核运行的虚拟地址,修改该目录下的配置文件config.in,以便在执行配置命令时能够显示AM335X的相关信息。
④在/arch/arm/def-configs目录下添加配置好的AM335X的配置文件。在/arch/arm/boot/compressed目录下添加处理器的初始化代码head-AM335X.s。
⑤ 修改/arch/arm/kernel目录下的工程管理文件Makefile,确定文件类型之间的依赖关系。
3.4.2裁减配置及编译
修改完内核设置后,就可以对内核进行裁减配置及编译了,在配置中剪裁掉冗余的部分,使编译生成的最终的内核的映像文件代码量尽可能小。执行如下命令:
# make menuconfig
进入配置菜单,选择处理器类型和所需要的各种外设、协议的支持等等, 包含了LCD、触摸屏、串口、声音、EXT2、FAT和JFFS2文件系统以及TCPIP协议的支持.
# make dep
搜索Linux编译输出与源代码之间的依赖关系,并生成依赖文件。
# make zImage
编译Linux内核,生成压缩的内核映像文件zImage。存放在/arch/arm/boot/目录下。
3.5 驱动程序的编写
驱动程序是操作系统内核和底层硬件之间的接口,驱动程序为应用程序屏蔽了硬件的细节,通过驱动程序,应用程序对硬件的操作可以像对普通的文件操作一样方便。驱动程序的主要作用是初始化和释放硬件设备,检测和处理硬件设备出现的问题,在应用程序、内核和底层硬件之间传输数据。
由于嵌入式系统是针对具体应用的,因此,应该根据具体的平台编写相应设备的驱动程序,以方便应用程序对底层硬件的访问。每一个系统调用都对应着file_operations结构的每一个成员,编写驱动程序主要是编写底层设备需要的各个操作函数并填充结构file_operations,该结构在/include/Linux/fs.h文件中定义。
驱动程序通过设备名、主设备号和从设备号与具体的硬件相联系。驱动程序可以以动态或者静态方式加载到内核当中,在调试阶段,一般以动态的方式加载驱动程序,而在最终形成产品时,添加到内核当中,每次启动内核时自动加载。
3.6 根文件系统
一个嵌入式产品的稳定运行,除了引导程序、内核之外,还必须有一个区域用来为用户提供支持架构和用户使用的应用软件,存放数据读写的结果,这个区域就是根文件系统。嵌入式系统中通常使用的根文件系统有:Romfs、Cramfs、Ramfs、JFFS2、yaff2、EXT2等,另外根文件系统既可以建立在RAMDISK上,也可以建立在Flash上,在RAMDISK上建立根文件系统Cramfs。
4.结束语
在船舶导航系统中采用源代码完全开放的嵌入式Linux完全可以代替WinCE等商业操作系统,从而减低了系统的成本,增加了市场的竞争力。通过对系统的开发,笔者有以下创新点:
(1)在程序中加入一些输出语句,以便在调试过程中,在超级终端上显示一些通过串口打印的调试信息,可以对程序运行情况进行观察。
(2)由于串口下载速度较慢,BootLoader要尽可能支持网络,通过网络下载内核和文件系统,加快开发进度。
相关产品:
Cortex-A8开发板、AM335X开发板、ARM9开发板、AT91SAM9260开发板、AT91SAM9263开发板、AT91SAM9G45开发板、AT91SAM9M10开发板、EP9315开发板、CIRRUS LOGIC EP9315工控板、 AT91SAM9263工控板、ARM9工业控制板、ARM9工控板、TI开发板、ARM9核心板