嵌入式开发环境的构建
嵌入式Linux系统从软件的角度看可以分为4个层次:
(1)引导加载程序。包括固化在固件中的启动代码(可选)和Bootloader两大部分。
(2)内核。特定于嵌入式开发板的定制内核以及控制内核引导系数的参数。
(3)文件系统。包括根文件系统和建立于Flash内存设备之上的文件系统。它是提供管理系统的各种配置文件以及系统执行用户应用程序的良好的运行环境的载体。
(4)用户应用程序。特定于用户的应用程序。有时在用户应用程序和内核层之间可能还包括一个嵌入式图形用户界面。
建立嵌入式开发环境是编写GUI应用程序的基础,主要包括Bootloader的固化,交叉编译环境的建立,内核编译、剪裁和移植,将编写的应用程序交叉编译,然后是根文件系统的更新和移植,最后在开发板上运行。
1.1 引导程序Bootloader的固化
嵌入式系统的引导代码的固化是系统运行的一个基本的前提条件。嵌入式系统的启动代码和处理器体系结构是紧密相关的,而且一般是C语言和汇编语言联合使用。没有这段代码,多么精悍的内核也不能发挥作用。
在一个基于ARM的嵌入式系统中,系统在上电或复位时通常都从0x00000000处开始执行,而这个地址处安排的一般就是系统的Bootloader。在嵌入式系统中Bootloader要完成的任务有:初始化硬件;将内核从flash存储器拷贝到RAM,并执行内核;提供写入flash存储器的功能;提供向目标板发送命令和通知用户目标板状态的界面。
目前主要有两种Bootloader:u-boot 和vivi。本文采用的引导代码是u-boot,当开发板中的u-boot被擦除时,将导致开发板不能开机,既不能从Nor Flash启动,也不能从Nand Flash启动。开发板中没有u-boot的表现在于:串口不输出信息或者LCD白屏。当开发板中没有u-boot时必须通过开发板的JTAG接口烧写。目前有三种方式可以通过TQ2440的JTAG接口来烧写u-boot:
(1)使用SJF2440软件,配合PC并口,进行烧写。
(2)使用H-Jtag软件,配合PC并口,进行烧写。
(3)使用Jlink软件,PC机没有并口采用此方法。
开发板从NorFlash启动u-boot的情况:
开发板从NandFlash启动u-boot的情况:
建立交叉编译环境首先要在PC机上安装虚拟机(VMware-workstation- 6.5.1-126130),安装之后,就可以在PC机上不用改动分区的情况下安装 Linux操作系统了。本文所采用的Linux操作系统Fedora10。
在安装Linux系统之前,应该安装好机器硬件,根据硬件安装说明接好各连线。此外,还需要进行其他准备工作。准备工作有4个步骤:
(1)备份数据
(2)收集硬件信息
(3)准备DOS启动盘
(4)制作Fedora 10 Linux的引导盘
大多数Linux发行版光盘都具有自动启动的功能,可以直接从光驱启动
安装程序。如果因为某种原因不能从光驱启动安装程序,则需要制作启动软盘。
Fedora10 Linux有自己的文件系统(Linux/ext3),要单独占用自己的分区。硬盘分区有3种类型的分区:主分区(Primary Partition)、扩展分区(Extended Partition)和逻辑分区(Logical Partition)。Fedroa 10 Linux既可以安装在主分区上,也可以安装在逻辑分区上。
安装Linux系统的步骤如下:
(1)启动虚拟机,导入安装程序;(2)光盘介质检测;
(3)选择默认语言为英文(English),因为有些软件在中文条件下不能运行;
(4)设置根口令,主机名为root,密码为123456;
(5)创建Linux分区,本文采用手动创建分区,共创建3个分区,分别
是:挂载到/opt目录下的分区、挂载到/root目录下的分区、一个交换分区;
(6)安装软件包,在这里一定要见所需要的软件包安装齐全;1.3 交叉编译链EABI-4.3.3
绝大多数的Linux软件开发都是以native方式进行的,即本机(HOST)开发、调试,本机运行的方式。这种方式通常不适合于嵌入式系统的开发,没有足够的资源在本机(即开发板上系统)运行开发工具和调试工具。
对于嵌入式Linux,一般采用交叉编译的方法,宿主机上的操作系统为Fedora Linux。硬件方面需要宿主机上有可用串口。剪裁好的系统内核、yaffs文件系统映像以及Bootloader的更新(最初的u-boot烧写是通过JTAG进行的)都需要在宿主机上进行编译从串口下载到ARM平台上运行,这个过程就称为交叉编译。
建立交叉编译环境主要是安装交叉编译链。本文选用的交叉编译链为EABI-4.3.3,安装包可以到Linux相关网站上下载或者选用天嵌科技提供的EABI-4.3.3_EmbedSky_20100610.tar.bz2安装包。本文选着天嵌科技提供的安装包,将其复制到PC的Linux系统中,本文复制到了Linux系统的“/opt/EmbedSky/”目录下,进入该目录,然后再PC的Linux的终端输入命令:#tar xvfj EABI-4.3.3_EmbedSky_20100610.tar.bz2–C /,就可以将其解压到PC的Linux的“/opt/EmbedSky/4.3.3/”目录下了。设置系统变量,使刚刚安装的交叉编译器生效。首先修改/etc/profile文件,在其中添加交叉编译器的环境变量的设置,在终端输入命令“#gedit /etc/profile”打开profile文件,修改内容如图3-6所示 ,然后再在终端输入命令:“#source /etc/profile”使交叉编译器生效。使用命令:“arm-linux-gcc -v”来验证交叉编译器是否生效,生效的情况的截图如图3-7所示,(对于没有成功,系统会给出没有找到该命令的语句)。
这样,内核或者其他应用程序均可用arm-linux-来指定使用该交叉编译器。本文主要使用arm-linux-gcc和gcc两个交叉编译工具。
1.4 Linux内核剪裁、移植
Linux是一个移植性非常好的操作系统,它广泛支持许多不同体系结构的硬件平台。嵌入式系统是“硬件可裁剪”的,工程师们设计的硬件电路总会有不同,从而同一个linux内核在不同的硬件电路上可能无法正确的运行(比如Linux内核解压的地址不同),所以必须结合自己的硬件电路,对已有的内核代码进行剪裁移植。本文使用的Linux源代码由广东天嵌计算机科技有限公司提供,包含了最基本的驱动程序,是一个可以运行的系统。
1.5 文件系统的更新、移植在系统启动后,操作系统要完成的最后一步操作就是将文件系统挂载到开发板上。嵌入式系统可以使用硬盘和光盘,但是这与嵌入式的便携特性相违背,所以通常采用Flash作为存储介质,这样即使开发板掉电,文件系统仍旧保存。所以保存的文件和设置在掉电后都不会丢失。
本文采用了可读写的YAFFS文件系统,主要更新的的内容是文件系统存放图形用户界面(GUI)的opt目录,即将设计的图形用户界面所需要的文件复制到opt目录下。
文件系统的移植与本文3.3.2小节Linux内核的移植步骤一样,只是所需要输入的命令为6,命令6的作用是将名为root.bin的YAFFS文件系统镜像烧写到Nand Flash中。