刘彦兰
(国营第七八五厂,山西太原030024)
μCLinux在无MMU的嵌入式系统中具有较好的技术优势,而ARM7TDMI又是一种高效,低功耗的RISC处理器。本文构造了一个μCLinux嵌入式操作系统,将它嵌入到基于ARM7TDMI内核的系统中。
TI公司提供的嵌入式芯片TMS320VC5471集成了基于TMS320C54X体系结构的DSP子系统和基于ARM7TDMI核的RISC微控制器子系统的双CPU定点数字信号处理器。TMS320VC5471的功能框图如图1所示:
图1 TMS320VC5471的功能框图
μCLinux的移植过程,大致需要分成四个步骤:
(1)建立交叉编译环境;
(2)裁减、编译内核;
(3)装载内核;
(4)内核启动。
在μCLinux的移植中,ARM体系结构的交叉编译环境,分为主机和目标机两方面。在本设计中,主机安装的是RedHat linux7.3操作系统,并在其上建立GCC的ARM体系结构的交叉编译环境。
2.2.1 获得μCLinux源代码开发包
本课题采用的版本为Kernel-2.4.18。可以从互联网上下载得到μCLinux-2.4.18、μClibc和elf2flt源码及应用程序源码包。文件为:μCLinux-dist-20040218.tar.gz,把它保存到/home目录下,然后执行:tar zxvf μCLinux-dist-20040218.tar.gz。当tar程序运行完毕后,在/home目录下会有一个/home/μCLinux-dist的新目录,这就是 μCLinux的源码根目录,里面有进行μCLinux开发的所有的源代码。
2.2.2 Clinux内核的修改、配置和编译
由于本设计是将μClinux移植到VC5471平台上,所以需要根据 VC5471下面的 ARM7TDMI架构,重新修改μCLinux内核。修改μCLinux内核有三方面的工作:一个是函数库的问题;二是重写Makefile以适应目标板;三是修改μCLinux/Linux/arch/armnommu/目录下的文件,以使它适应ARM7TDMI架构。
μClinux内核的配置系统由三部分组成,分别是:
(1)Makefile:分布在μClinux内核源代码中的Makefile,定义了μClinux内核编译规则;
(2)配置文件(config.in):给用户提供配置内核的选择功能;
(3)配置工具:包括配置命令解释器(对配置脚本中使用的配置命令进行解释)和配置用户界面(提供基于字符界面、基于图形界面以及基于Xwindows图形界面的用户配置界面,各自对应于 Make config、Make menuconfig和 Make xconfig)。
make xconfig根据课题的需要配置内核编译选项
—Choose a Vendor/Product combination.
(TI/5471)Vendor/Product
(linux-2.4.x)Kernel Version
(μClibc)Libc Version
[Exit]
Do you wish to save your new kernel configuration?
[Yes]
.make dep建立依赖关系
.make lib_only编译库文件
make user_only编译用户应用程序文件
make romfs生成romfs文件系统
make编译内核
若成功,在μClinux-dist下有一个images目录,下面有四个文件:
(1).image.elf:ELF格式含调试信息和 romfs的μCLinux,可以用gdb装载调试运行
(2).romfs.img:romfs的二进制文件
(3).linux.bin:不含romfs的μCLinux二进制文件
(4).image.bin:linux.bin和romfs.bin合并而成,并多了4个字节的校验,这个文件的内容拷贝到ram里后就可以直接从入口运行了。
将μCLinux内核加载到内存上运行的方式,需要编写一段启动代码Bootloader。
(1)Bootloader的操作模式
多数Bootloader都包含两种操作模式:“启动加载”模式和“下载”模式。Bootloader从固态存储设备上将操作系统加载进RAM中运行,整个过程并没有用户的介入。这种模式是Bootloader的正常工作模式。下载模式下,Bootloader将通过串口或网络等通信手段从主机下载文件,此模式通常在首次安装内核与根文件系统或以后的系统更新时使用。工作于这种模式下的Bootloader需要向终端用户提供一个简单的命令行接口。
(2)Bootloader的基本任务
Bootloader一般是被烧录或者下载到bootrom的0x0地址处,作为上电后执行的第一部分指令,Bootloader需要完成以下几个任务:<1>硬件初始化;<2>存储器重映射;<3>下载内核映像和根文件系统或把内核装载到SRAM里;<4>调用内核。
(3)Bootloader的实现
(a)硬件设备初始化:该部分代码用ARM汇编实现
Ⅰ进入SVC32工作模式,并且禁止所有的中断。可以通过写CPU的中断屏蔽寄存器或状态寄存器(ARM的CPSR寄存器)来完成。
mov r0,#(ARM_MODE_SVC|I_BIT|F_BIT)
msr cpsr,r0
Ⅱ设置CPU的速度和时钟频率。
Ⅲ网口初始化,为内核的下载准备条件。
ⅣLCD和键盘初始化,为人机交互准备条件
Ⅴ RAM初始化,为Bootloader的C代码运行准备空间。
(b)拷贝Bootloader的C代码到RAM空间中。
拷贝时要确定两点:① C代码的可执行映象在固态存储设备的存放起始地址和终止地址;② RAM空间的起始地址。以上可以通过链接文件来确定。
(c)设置堆栈指针sp
ldr sp,=__stack(__stack的值可以通过链接文件确定)
(d)地址重映射(Remap)
具体的实现代码如下:
ramlow()
{
(*(long*)0xffff2804)&=0xfffffffc;
(*(long*)0xffff2800)&=0xfffffffc;
}
(e)跳转到C代码的入口点开始执行。由于VC5471评估板没有固化BOOT程序,所以使用CCS软件通过JTAG接口,先将Bootloader程序下载到RAM中,然后写到Flash的起始地址,上电后从Flash中开始执行Bootloader。到此Bootloader的任务就完成了。
本文以DSP+ARM结构的嵌入式处理器TMS320VC5471评估板(EVM)作为目标板,搭建了基于GDB的嵌入式操作系统集成开发调试环境并实现了μCLinux操作系统的移植。对同类型的嵌入式操作系统的移植工作具有一定的参考价值。
[1]TI,TMS320VC547x CPU and Peripherals Reference Guide[M].2001.
[2]TMS320VC5471 Fixed-PointDigital Signal Processor Data Manual[M].2001.
[3]杜春雷.ARM体系结构与编程[M].北京:清华大学出版社,2003.10.
[4]赵炯.Linux内核完全注释[内核版本0.11(0.95)]修正版V1.9.5[M].北京:机械工业出版社,2004.5.