Linux是一种支持多种体系结构处理器的操作系统,有很强的移植性。描述了将μClinux移植到基于S3C4510B处理器目标板上的方法与过程。首先介绍了S3C4510B处理器和μClinux,并简单说明了如何搭建移植环境,然后着重讨论了在该开发板上Bootloader的设计实现以及μClinux内核的移植方法,最后对在这种基于μClinux的嵌入式系统环境下如何开发应用程序做了简单说明。
Linux supports various architecture and is an operation system which is easy to be ported The technique of porting μClinux to one board based on S3C4510B pr o cessor is introduced in this paper S3C4510B and μClinux are introduced at first, and an explanation of building porting enviorment is givenAll the work co nsists of the design and implementation of Bootloader, the porting of μClinux k ernelAt last, the development of application programme based on μClinux embe dded system is explained
1引言
ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一微处理器的通称,还可以认为是一种技术的名字。
1991年ARM公司成立于英国剑桥,主要出售芯片设计技术的授权。目前,采用ARM技术知识产权(IP)核的微处理器,即我们通常所说的ARM微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于ARM技术的微处理器应用约占据了32位RISC微处理器75%以上的市场份额,ARM技术正在逐步渗入我们生活的各个方面。
采用RISC架构的ARM微处理器一般具有如下特点:体积小、低功耗、低成本、高性能;支持Thumb(16位)/ARM(32位)双指令集,能很好的兼容8位/16位器件;大量使用寄存器,指令执行速度更快;大多数数据操作都在寄存器中完成;寻址方式灵活简单,执行效率高;指令长度固定。ARM的产品主要包括ARM7 Thumb家族和ARM9 Thumb家族、ARM 10 Thumb家族以及StrongARM家族。
2 基于ARM的S3C4510B处理器和μClinux
本文所使用的S3C4510B是Samsung公司使用ARM7处理器内核开发的一块嵌入式微处理器。作为一款高性价比的网络处理器,S3C4510B已广泛应用于各种网络设备中,其中央处理器为ARM7TDMI核。ARM7TMDI是目前使用最广泛的32位嵌入式RISC处理器,属低端ARM处理器核。TDMI的基本含义为:
T:支持16位压缩指令集Thumb;
D:支持片上Debug;
M:内嵌硬件乘法器(Multiplier);
I:嵌入式ICE,支持片上断点和调试点。
ThumbTM16位压缩指令集能以较小的存储空间需求,获得32位的系统性能。S3C4510B处理器包括8kB可配置的一体化Cache/SRAM,1个I2C串行接口,2个UART,2个32位定时器,18个可编程的通用I/O口,以及1个10 M/100 M以太网控制器。丰富的片内外围极大地简化了系统的设计。同时这款微处理器对操作系统的支持广泛,包括Windows CE、Linux、Palm OS等μClinux是针对控制领域的嵌入式Linux操作系统,他从Linux 2.0/2.4内核派 生而来,沿袭了主流Linux的绝大部分特性。适合不具备内存管理单元(Memory Manage ment Unit,简称MMU)的微处理器/微控制器,例如ARM7TDMI,他通常具有很少内存或Flash的嵌入式系统。在GNU通用公共许可证(GUN GPL)的保证下,运行μClinux操作系统的用户可以使用几乎所有的Linux API函数,不会因为没有MMU而受到影响。
3建立μClinux开发环境
嵌入式系统的开发与一般的应用开发最大的差别在于,前者需要建立特殊的硬件环境,而后者一般基于特定的操作系统或分布式平台。后者的平台已经对硬件或网络媒质做了抽象,从而不需要由系统开发者来完成这些工作。而在嵌入式系统开发中,这也由开发者完成。
嵌入式系统开发环境一般分成主机端(HOST)和目标板(TARGET)两个部分。主机端是开发平台,用于运行开发过程中的各种工具;目标板是运行和测试平台,是嵌入式系统的最终驻留环境。在主机端和目标板之间需要通过某种方式进行通信,如使用RS232C串口。这种通信的目的在于发送控制指令和传输数据,同时获得反馈信息。
图1是系统移植工作的硬件环境。
主机端的PC使用COM1通过MAX232和S3C4510B的UART 1相连接,通过串口完成对目标板的必要控制功能。S3C4510B开发板上配备有一块DM9161以太网卡芯片和主机端建立原始(raw ) IP连接,使用链路层地址完成大批量数据的传送。
硬件环境建立之后,就需要创建软件开发环境。软件环境主要是指ARM体系结构的交叉编译环境,在主机端使用RedHat Linux 8.0操作系统,并在其上建立gcc的ARM体系结构的交叉开发环境。可以从http://mac.os.nctu.edu.tw处下载工具链:
(1) armelfbinutils2.115.i385.rpm
一些辅助工具,包括objdump(可以反编译二进制文件),as(汇编编译器),ld(连接 器)等。
(2)armelfgcc2.95.32.i386.rpm
配置目标为arm的GNU的C编译器。使用他在宿主机上开发编译目标上可运行的二进制文件。
(3)genromfs0.5.11.i386.rpm
生成Romfs的工具。Romfs是一种文件系统。这种文件系统相对于一般的ext2文件系统要求更少的空间。
将这3个文件放在宿主机上的任意一个目录下,然后输入下面的命令来安装:
们就建立好了μClinux的软件开发环境。
4 Bootloader的设计实现
Bootloader被用于系统从硬件启动到操作系统启动的过渡,是嵌入式系统中必不可少的一段程序。他相当于PC机中的BIOS和OS Loader,用于初始化运行硬件和启动操作系统,因此其实现方式由硬件的特性决定。和BIOS/OS Loader一样,他需要固化在目标板中,每次启动目标板时,首先会运行Bootloader,在他完成CPU和相关硬件的初始化之后,才从事先规定的地址启动操作系统或嵌入式应用的固化程序。
在嵌入式系统开发过程中,Bootloader还担任了与主机端通信的任务,他相当于一个“服务器”,不断监听从主机端传来的控制信息和数据信息,完成相应的操作。
当系统上电后,Bootloader从地址0x0开始执行,将存储器映射重新配置,如表1所示,并会执行Linux的固化内核。
Bootloader可以使用ARM仿真软件SDT2.5通过JTAG下载到目标板上。
5 μClinux内核的编译和移植
作为操作系统的核心,μClinux内核负责管理系统的进程、内存、设备驱动程序、文件系统和网络系统,决定着系统的各种性能。μClinux内核采用模块化的组织结构,通过增减内核模块的方式来增减系统的功能。
内核配置,在产品列表中选择Samsung/4510B。在库的选择上选uC-lib c。
(2) make dep
寻找依存关系。
(3) make clean
清除以前构造内核时生成的所有目标文件、模块文件和一些临时文件。
(4) make lib_only
编译库文件。
(5) make user_only
编译用户应用程序文件。
(6) make romfs
生成romfs文件系统。
(7) make image
(8) make
通过各个目录的makefile文件进行,会在各目录下生成一大堆目标文件。
上述步骤完成后,就完成了对μClinux源码的编译工作。我们可以在/μClinuxS amsung/images目录下看到2个内核文件:image.ram和image.rom。
其中iamge.rom可以直接烧写入Flash存储器中,当系统复位或上电时,内核自解压到SDRAM运行。Image.ram可以通过SDT载入到SDRAM中直接运行。
μCLinux的内核有2种可选的运行方式:可以在Flash上直接运行,也可以加载到RAM中运行。
Flash运行方式:把内核的可执行映像文件烧到Flash上,系统启动时从Flash的某个地址开始逐句执行。这种方法实际上是很多嵌入式系统采用的方法。
内核加载RAM方式:把内核的压缩文件存放在Flash上,系统启动时读取压缩文件在内存里解压,然后开始执行,这种方式相对复杂一些,但是运行速度可能更快。同时这也是标准Li nux系统采用的启动方式。
6 应用程序在μClinux上的开发
下面将介绍如何把一个应用程序(例如examplec)添加到μClinux上的过程。
首先进入μClinux-Samsung/user目录并建立一个自己的子目录,如myproject。将exam plec复制到myproject目录下,并编写相应的makefile文件。接着进入user目录,增加一行语句到该目录下的makefile文件:
dir_$(CONFIG_USER_MAAPP_LEDNXY)+=myapp
切换到目录μClinuxSamsung/config下,打开configin这个文件,并在最后增加类似下面的语句:
mainmenu_option next_comment
comment'My Application'
bool'example' CONFIG_USER_MYPROJECT_
EXAMPLE
comment'My Application
endmenu
此后,在编译内核的make menuconfig时就可以在Customize Vendor/User Setting(NE W)这一项的子菜单中选中自己的应用程序example,然后按第5节中相同的办法进行编译即可。
但是,如果我们每修改一次应用程序,就要把他加入到内核中重新编译,显然效率太低,也不可行。那么有什么方法来节省调试时间呢?
在上面的章节中曾提到Bootloader可以担当与主机端通信的任务,在这里我们就可以通过他把应用程序快速下载到目标板上。
首先通过elf2flt这个工具交叉编译example.c生成在μClinux下的可执行文件example(flat格式),命令如下:
arm-elf-gcc-Wall-o2- wl,elf2flt- o example example.c
接着将宿主机与目标板通过串口线连接,并在宿主机上启动一个超级终端,例如minic om,选择好一个COM口(通常是串口1),设置波特率为19 200,8个数据位、1个停止位,无校验。然后选择传输协议Zmodom,最后选定需要传输的文件example并发送。传输结束后可以通过超级终端在目标板的目录中发现example,这说明传输成功。
在目标板上将example加上x属性(可执行属性),然后输入命令/example就可以运行此程序了。显然,通过这种方法可以很方便快捷的调试应用程序,等调试结束,再把他加入到内核中一起编译即可。
7 结语
讨论了如何将μClinux移植到ARM7体系微处理器S3C4510B上的基本流程,同时也简要的介绍了Bootloader以及应用程序的加载和调试方法。在不同的宿主机和目标板环境下,具体移植过程中可能会出现各种不同的错误或问题,可以充分利用GCC这个强大的工具,根据他的错误提示来一步步的进行修正,最终成功的移植μClinux。
参考文献
[1]李善平,刘文峰,王焕龙.Linux与嵌入式系统[M].北京:清华大学出版社,2003
[2]李驹光,聂雪媛,江泽明,等.ARM应用系统开发详解[M]北京:清华大学出版社,2003
作者:廖俊