引言
在将Linux内核下载到基于ARM处理器的目标系统时,常用的方法是通过在DOS命令提示符中输入相关命令,或启动串口虚拟终端,通过串口,逐条手工输入命令并发送到目标机中执行。这是一个相当不友好的过程。这种下载过程造成下载过程繁琐、输入命令和参数过多、下载易错、重新下载等问题,给开发人员带来不便。
国内外较好的嵌入式集成开发环境一般都提供可视化的下载工具,将宿主机上开发的目标机运行的程序下载到目标板RAM、Flash中,如ARM公司的ARM Development Suite[1]集成开发环境中提供的ARM eXtended Debugger[1],是下载程序到目标板并调试的工具。但出于商业利益的考虑,这些嵌入式集成开发环境都未开放源代码。此外,提供可视化下载工具有诸多限制,与具体目标板的处理器、操作系统相关。如微软的WinCE IDE中的下载工具只能对目标板进行下载WinCE嵌入式操作系统,缺乏广泛的实用性。
为此,本文对RedBoot、Linux内核和文件系统的下载过程进行了研究,利用VC6.0开发了一个可视化配置下载信息并自动下载的工具,提供了简捷的Linux内核下载功能。该工具已成功集成到所研发的嵌入式Linux集成开发环境中[23],并在ARM9(EP9315)处理器的目标板上进行了验证。
1传统下载流程
下载到目标板上运行的Linux包括引导程序、Linux内核和文件系统。基本下载步骤是:先下载引导程序,在其基础上进行下载Linux内核和文件系统。
虽引导程序的下载方式根据目标板硬件系统的不同而有所差异,但原理基本相同:通过JTAG[1]方式把引导程序下载到目标板的Flash中。图1是采用UML[4]的Sequence图[4],简单描述了通过JTAG方式下载引导程序到目标板的过程。
图1JTAG下载引导程序的序列图
在下载Linux内核和文件系统时,首先把宿主机和目标机通过串口和以太网口两种方式连接起来,串口负责命令的传送;以太口通过TFTP协议负责文件的传输。配置好串口参数后连接启动目标机,并进入RedBoot的命令提示符状态,再逐一输入配置下载参数的命令(如以太网IP设置、Flash分区设置等)和下载内核及文件系统的命令。
从上述过程可以看出,传统的下载过程步骤繁杂,需要输入的命令过多;命令参数复杂而且操作多在非图形化的命令行界面下进行,不够友好。因此,不熟悉的下载人员常要查阅相应手册等进行下载,造成下载工作繁杂、易错。
2可视化自动下载
针对上述问题,本文提出了一种可视化[5]自动下载方案。根据下载的前后阶段分下载RedBoot和下载Linux内核、文件系统两部分进行设计实现。
2.1Redboot的可视化下载
对RedBoot具体下载过程和原理进行分析得知:通过JTAG接口下载RedBoot时,宿主机端需启动JTAG下载命令的进程,并在其中指定下载到目标板上运行的可执行二进制映像文件的目录(这里是redboot.bin)和下载到Flash的地址等参数。其做法是:在DOS命令提示符下执行JTAG命令,此命令的作用就是按照输入参数让Windows操作系统加载JTAG下载的进程[5],此进程将下载过程的提示信息输出到标准输出设备上(即命令提示符窗口)上,下载人员依据下载提示信息进行进一步下载操作。
根据上述分析,设计了一个下载RedBoot的对话框程序以实现下载操作的可视化。图2是此程序的设计流程,具体设计如下:在开始下载按钮的消息响应函数[6]中启动一个创建JTAG下载程序的线程和一个读JTAG下载进程标准输出信息的管道线程,下载线程负责按特定下载参数启动JTAG下载进程,读管道线程负责把JTAG下载进程的标准输出信息读到图形化程序的进程中,以判断下载状态并在图形化界面中输出来显示下载进度和结果。图3是JTAG程序运行时的界面图。
图2JTAG下载RedBoot程序流程
图3JTAG下载程序的运行界面图
2.2Linux内核和文件系统的自动下载
对具体的Linux内核和文件系统下载过程是:让目标板运行起通过JTAG接口下载到目标板的RedBoot,通过串口虚拟终端在宿主机上进入RedBoot的命令提示符状态下,通过串口发送配置下载Linux内核和文件系统的参数命令和下载命令。串口负责命令发送,以太口负责下载执行映像的文件传输。实现下载命令序列的自动生成,需要用户先在可视化程序界面中配置好下载的各个具体参数,如下载的执行映像文件路径、下载到目标板RAM或Flash中的地址、目标板的IP地址等;实现下载命令序列自动地通过串口逐一依次地发送执行,需要在程序中实现各个命令逐一依次执行的同步机制。图4是下载Linux内核和文件系统程序流程。
图4下载Linux内核和文件系统程序流程
采用FSM理论,设计并实现了Linux内核和文件系统的自动下载。宿主机上运行的自动下载程序根据用户输入的下载配置参数自动生成下载命令序列。当用户单击下载按钮时,按照生成的下载命令序列逐一向目标机发送下载命令。目标机接收到下载命令后,解释执行此命令,并及时向宿主机自动下载程序返回命令执行结果信息。宿主机根据接收到返回信息后,判断当前命令执行情况,并自动确定是否发送下一条下载命令,直到下载命令序列自动执行完成。整个下载过程由所实现的FSM自动控制,不需要用户输入执行下载的命令。图5和图6分别是宿主机和目标机的自动机模型图。图7给出了下载程序运行时的界面。
图5宿主机下载程序FSM
图6目标机下载过程中的FSM
图7自动下载程序运行界面
3效果与测试
从上述的设计和实现可知,整个下载工具提供了可视化的下载操作界面和自动下载Linux内核和文件系统的功能。这些处理尽可能地避免了下载工作的繁琐,提高了下载效率。特别地,在项目完成的嵌入式Linux集成开发环境中,对Linux内核进行配置剪裁并生成了多个目标机上运行的Linux内核执行映像zImage文件。需逐一下载到开发板上验证运行是否正确时,利用此下载工具比传统下载方式节约了很多时间。表1给出了相关数据统计对比。
表1工具和手动下载对比
4结论
本文提出了一种基于FSM的嵌入式Linux内核的自动下载方法。基于该方法实现的可视化下载工具,使得繁琐的嵌入式Linux内核下载过程变得人性化、易操作。可以方便地应用于数量大、工作量多的下载工程应用中。与国内外一些商用的嵌入式集成开发环境中提供的下载工具比较,虽功能相对简单,不够强大,但其支持Linux的嵌入式开发。随着Linux在嵌入式开发领域中起到越来越重要的作用,其开发工具的研究也势必越来越深入。
目前,此下载工具尚局限于下载针对ARM目标板的Linux内核,不够灵活。希望经过进一步的研究,实现面向不同应用、与目标处理器无关的自动下载工具。