《嵌入式系统开发环境的建立.ppt》由会员分享,可在线阅读,更多相关《嵌入式系统开发环境的建立.ppt(94页珍藏版)》请在三一办公上搜索。
1、第5章嵌入式系统开发环境的建立,教材:嵌入式系统设计与应用作者:张思民出版:清华大学出版社,5.1 建立主机开发环境5.2 配置minicom5.3 配置NFS服务5.4 编译嵌入式Linux系统内核5.5文件系统的制作 5.6嵌入式系统开发板的烧写,第5章 嵌入式系统开发环境的建立,5.1 建立主机开发环境,5.1建立主机开发环境,构建开发环境是任何开发工作的基础,同样也是嵌入式系统开发的关键步骤。,1、交叉编译,所谓交叉编译就是在一个平台上生成可以在另一个平台上执行的代码。,2、安装开发环境步骤,(1)安装嵌入式系统开发交叉编译器armlinux 到/usr/local 目录下。(开发商提
2、供或网上下载)(2)修改配置文件/etc/profile,建立arm-linux-gcc的搜索路径。,(1)安装 arm-linux,在/usr/local下安装 arm-linux:嵌入式系统开发交叉编译器。这里包含arm-linux-gcc,arm-linux-g+等常用ARM交叉编译器,编译出来的可执行二进制代码只能运行在以ARM为核心处理器上。,通常由硬件开发商提供或网上下载,例5.1 配置PXA270宿主机的交叉编译环境,开发商提供的安排光盘中有二个文件包:arm-linux.tar.gz:该文件包主要提供ARM系统开发的交叉编译器;pxa270_linux.tar.bz2:该文件包
3、主要提供用于PXA270开发板的BootLoder、linux内核、文件系统、JTAG烧写工具等。,(1)将文件包复制到/usr/local/目录下,并解包:,cp arm-linux.tar.gz/usr/localcd/usr/local,(2)再将 pxa270_linux.tar.bz2 文件包复制到根目录下,并解包:,cp pxa270_linux.tar.bz2/cd/,安装完毕后,生成两个子目录,(1)在根目录下生成pxa270_linux目录:(2)在/usr/local下生成arm-linux目录:,pxa270_linux:嵌入式系统开发工作目录,存放了PXA270 Blo
4、b,Linux工程文件,包括源代码以及交叉编译好的镜像文件;各种实验例程,包括应用层程序与驱动层程序。,arm-linux:嵌入式系统开发交叉编译器。这里包含arm-linux-gcc,arm-linux-g+等常用ARM交叉编译器,编译出来的可执行二进制代码只能运行在以ARM为核心处理器上,(2)修改profile,为了我们可以在所有目录下直接使用这个工具,我们需要修改文件:vi/etc/profile在其中加入语句:pathmunge/usr/local/arm-linux/bin如下所示:rootlocalhost root#vi/etc/profile,#Path manipulati
5、onif id-u=0;then pathmunge/sbin pathmunge/usr/sbin pathmunge/usr/local/sbin pathmunge/usr/local/arm-linux/bin pathmunge/usr/X11R6/bin fiunset pathmunge,当修改文件后,保存并退出终端。rootlocalhost root#exit 重新登录终端,或运行source命令,使我们的设置生效。rootlocalhost root#source/etc/profile,修改文件后,保存并退出终端。重新登陆终端,测验交叉编译环境是否成功。arm-linux
6、-gcc v,rootlocalhost root#arm-linux-gcc-vtarget=arm-linux-host=i686-host_pc-linux-gnu-prefix=/usr/local/arm-linux-with-cpu=xscale-with-headers=/usr/local/arm-linux/arm-linux/include-disable-nls-enable-threads=posix-enable-symvers=gnu-enable-_cxa_atexit-enable-languages=c,c+-enable-shared-enable-c99-
7、enable-long-long-without-fpThread model:posixgcc,5.2 配置minicom,配置minicom窗口,宿主机与开发板通过串口连接后,在宿主机端需要通过minicom窗口控制嵌入式系统开发板的运行。配置步骤:1、用串口线正确连接宿主机与开发板2、配置minicom窗口的各项参数,1、用串口线连接宿主机与开发板,宿主机通过串口与开发板连接,2、配置minicom的各项参数,在宿主机Linux终端中输入:或输入:minicom,然后再按CTRL-A-O。,minicom s,弹出minicom设置选项菜单,串口设置,选择Serial port setu
8、p,确定串口,如果使用第1个串口,则设置串口号为:ttyS0,如果使用第2个串口,则将串口号设为ttyS1。,将串口配置为:波特率115200,8位数据位,1位停止位,没有流控。,选择Save setup as dfl,将设置保存为默认值。,5.3 配置NFS服务,NFS服务,NFS(Network File System)类似于windows中的文件共享服务。在NFS服务中,主机是被挂载(mount)端,为远端客户机提供可以访问的共享文件。主机需要配置两方面内容:设置NFS服务,允许“指定的NFS用户”使用。,开发板与主机连接好网线,1、设置NFS服务,打开NFS服务命令:setup弹出系统
9、设置选项菜单,选择System services,将nfs一项选中(出现*表示选中),2、指定NFS服务的用户,在文件“exports”中指定NFS服务的用户:使用vi,在配置文件exports中加入:其中“/linux_nfs”是共享文件目录。然后按 后输入“:”,再输入“wq”,然后回车,存储退出。,/linux_nfs*(rw),重启NFS服务,重新启动nfs服务,使设置生效:/etc/rc.d/init.d/nfs restart,3、在客户机端挂接共享目录,现在还需要将宿主机NFS服务提供的共享目录挂接到嵌入式系统开发板上。我们利用minicom作为被开发目标板的终端。,(1)进入m
10、inicom终端界面,用串口线连接宿主机和开发板,并在宿主机的终端进入到minicom界面。rootlocalhost root#minicom,打开设备电源,这时,可以所观察到的是开发板上所运行的嵌入式Linux系统的启动过程。,(2)设置开发板的IP地址:通过minicom终端界面,我们可以设置开发板的IP地址192.168.0.16:.#ifconfig etho,(3)挂载共享目录,将宿主机NFS服务共享的目录/linux_nfs挂载到开发板的/mnt目录下(假设宿主机的IP地址为):rootlinux/#mount o soft,timeo=100,rsize=1024 192.16
11、8.0.1:/linux_nfs/mnt,也可以使用下列方法挂接:,rootlinux/#mount t nfs 192.168.0.1:/linux_nfs/mnt或:rootlinux/#mount rw 192.168.0.1:/linux_nfs/mnt,经过上面的设置,就可以在嵌入式系统的开发板上使用宿主机NFS服务提供的共享目录了。在嵌入式系统开发板/mnt目录下的文件就是宿主机/linux_nfs 目录下的文件。,5.4 编译嵌入式Linux内核,5.4 编译嵌入式Linux内核,编译内核需要三个步骤,分别是:1、内核配置、2、建立依存关系、3、建立内核。,5.4.1 内核裁剪配
12、置,1、确定处理器类型 Linux内核源代码支持20多种微处理器类型,在编译之前要先确定微处理器类型。,在ARM系统文件的根目录中的Makefile里,为“ARCH”设定目标板微处理器的类型值,如:ARCH:=arm或输入命令手工进行设置:rootlocalhost linux#exprot ARCH=arm,5.4.1 内核裁剪配置,2、确定配置方法内核支持 4种不同的配置方法,每种方法是读取一个根目录下隐藏的配置文件“.config”。这 4 种方式如下。make config:基于文本的最为传统的配置界面,不推荐使用。make menuconfig:基于文本选单的配置界面,字符终端下推荐
13、使用。make xconfig:基于图形窗口模式的配置界面,Xwindow 下推荐使用。make oldconfig:自动读入“.config”配置文件,并且只要求用户设定前次没有设定过的选项。,使用广泛,【例】以 make menuconfig 为例进行S3C2410系统的内裁剪核配置。,运行make menuconfig命令#make menuconfig 弹出内核裁剪配置窗口,从该图中可以看出,Linux 内核允许用户对其各类功能逐项配置,共有19类配置选项,这19类配置选项见表5.2。在menuconfig 的配置界面中是纯键盘的操作,用户可使用上下键和“Tab”键移动光标以进入相关子
14、项,图 5.10 所示为进入了“System Type-”子项的界面,该子项是一个重要的选项,主要用来选择处理器的类型。这里,带有“-”的选项表示当前项还有下一级菜单子项。,图5.10“System Type-”子项的界面,每一个选项前都有个括号,可以通过按空格键或“Y”键表示包含该选项,按“N”表示不包含该选项。在每一个选项前面都有括号。这里的括号有 3 种,即中括号、尖括号或圆括号。“”表示该选项有两种选择:*选择该项编译进内核;不编译该选项。“”表示该选项有三种选择:将该项选进内核;将该项编译成模块,但不编译进内核;不编译该选项。我们可以用空格键选择相应的选项。,在完成配置之后,就可以保
15、存退出,如图 所示。,内核编译,1、建立依赖关系 由于内核源码树中的大多数文件都与一些头文件有依赖关系,因此要顺利建立内核,内核源码目录中的每个 Makefile 就必须知道这些依赖关系。建立依赖关系往往发生在第一次编译内核的时候,它会在内核源码目录中每个子目录产生一个“.depend”文件。#make dep,内核编译,2、建立内核映像文件 建立内核映像可以使用“make zImage”或“make bzImage”,建立压缩内核映像文件。压缩的内核映像通常名为 zImage,位于“arch/$(ARCH)/boot”目录中。#make zImage#ls arch/arm/boot/Ima
16、ge install.sh Makefile zImage,生成的内核映像文件,5.5文件系统的制作,文件系统,文件系统是嵌入式Linux系统必备的一个组成部分,是系统文件和应用文件存储的地方。,1、文件目录,/bin目录下需要包含常用的用户命令,如sh等。/sbin目录要包含所有系统命令,如reboot等。/etc目录下是系统配置文件。/boot目录下是内核映像/dev目录含有系统所有的特殊设备文件/lib目录包含系统所有的库文件/mnt目录只用于挂接,可以是空目录/proc目录是/proc文件系统的主目录,包含了系统 的启动信息/usr目录含有用户选取的命令。,2、上述目录还包含适当的文件
17、和子目录,(1)目录/binbin 中包含命令文件:date、sh、login、mount、umount、cp、ls、ftp、ping。(2)目录/sbinsbin包含命令文件mingetty、reboot、halt、sulogin、update、init、fsck、telinit和mkfs。,2、上述目录还包含适当的文件和子目录,(3)目录/etcetc包含配置文件HOSTNAME、bashrc、fstab、group、inittab、nsswitch、pam.d、passwd、pwdb.conf、rc.d、securetty、shadow、shells以及lilo.conf。,2、上述目录
18、还包含适当的文件和子目录,(4)目录/devdev包含设备文件console、hda1、hda2、hda3、kmem、mem、null、tty1和ttyS0。5)目录/liblib包含库文件、和security。,3、制作文件系统的镜像文件,嵌入式 Linux 支持多种文件系统。这些文件系统的总体架构是一样的,都是采用目录树的结构。在嵌入式中常见的文件系统有 cramfs、romfs、jffs、yaffs 等。,【例3】制作 cramfs 文件系统。,cramfs 文件系统是一种经压缩的、极为简单的只读文件系统,因此非常适合嵌入式系统。不同的文件系统都有相应的制作工具,制作 cramfs 文件
19、系统需要用到的工具是 mkcramfs。,假设用户已经设置了一个文件系统,在目录“/fs/root/”下,如下所示:,#ls rootbin dev etc home lib linuxrc proc Qtopia ramdisk sbin tmp usr var,使用 mkcramfs 工具了,命令格式为:mkcramfs 系统文件目录名 生成的镜像文件名,系统文件目录,现将系统文件子目录root生成镜像文件camare_rootfs.cramfs:#./mkcramfs root camare_rootfs.cramfs,【例3】制作 cramfs 文件系统。,【例4】制作jffs2文件系
20、统。,jffs2是一种可读/写的文件系统。制作它的工具叫做mkfs.jffs2。可以用下面的命令来生成一个jffs2的文件系统。#./mkfs.jffs2-r rootfs-o xscale_fs.jffs2-e 0 x40000-p=0 x01000000这样,在fs目录下生成一个名为xscale_fs.jffs2 的文件系统。,5.6 嵌入式系统开发板的烧写,5.6.1 Bootloader,1、基本概念 Bootloader 是系统加电后运行的一段代码,称为引导加载程序。它在操作系统内核运行之前运行。通过这段程序,完成硬件设备的初始化,并建立内存空间的映射表,从而建立系统的软硬件环境。,
21、5.6.1 Bootloader,1、基本概念 Bootloader对硬件设备依赖很强。对于两块不同的嵌入式开发板,即使它们采用的相同CPU,运行在其中一块电路板上的Bootloader,要在另一块电路开发板上运行,需要对其参数、源程序进行修改。,5.6.1 Bootloader,1、基本概念(1)每种不同的 CPU 体系结构都有不同的 Bootloader。(2)系统加电或复位后,CPU 将首先执行 Bootloader程序。(3)Bootloader 的启动过程分为单阶段和多阶段两种。,5.6.1 Bootloader,1、基本概念(4)Bootloader 包含:“启动加载”和“下载”两
22、种不同的操作模式。启动加载模式:直接从Flash启动。下载加载模式:将压缩的内核映像文件从Flash中复制、解压到RAM,再从RAM上启动。,5.6.1 Bootloader,2、Bootloader 启动流程 Bootloader 的启动流程一般分为两个阶段:(1)第1阶段主要完成以下工作 基本的硬件初始化,包括屏蔽所有的中断、设置 CPU 的速度和时钟频率、RAM 初始化、初始化 LED、关闭 CPU 内部指令和数据 cache 等。,5.6.1 Bootloader,2、Bootloader 启动流程 Bootloader 的启动流程一般分为两个阶段:(2)第2阶段主要完成以下工作 初始
23、化本阶段要使用到的硬件设备,包括初始化串口、初始化计时器等。检测系统的内存映射,加载内核映像和根文件系统映像,设置内核的启动参数。,3、Bootloader的烧写把Bootloader烧写到Flash中,要用到JTAG。,5.6.1 Bootloader,5.6.2 ARM S3C2410开发板的烧写,下面介绍基于S3C2410微处理器开发板的Bootloader、内核、文件系统的烧写方法。其Bootloader为vivi。,5.6.2 ARM S3C2410开发板的烧写,1、vivivivi是韩国 MIZI Research公司为S3C2410开发板编写的Bootloader。vivi默认的
24、工作模式为:启动加载模式之后,经过一段短暂的时间延迟自行启动Linux内核。,5.6.2 ARM S3C2410开发板的烧写,1、vivi在vivi的下载模式下,vivi提供了一个命令行接口,通过该接口可能使用一些vivi命令,见表5.3。,5.6.2 ARM S3C2410开发板的烧写,5.6.2 ARM S3C2410开发板的烧写,2、烧写步骤 对于S3C2410开发板,嵌入式Linux系统的Bootloader、内核、文件系统将烧写到Flash中。,5.6.2 ARM S3C2410开发板的烧写,2、烧写步骤(1)我们首先要将Linux引导加载程序 BootLoader(vivi)烧写到
25、Flash中,引导Linux启动;(2)对Flash进行分区;,5.6.2 ARM S3C2410开发板的烧写,2、烧写步骤(3)将vivi程序烧写到Flash的0地址处;(4)将内核zImage烧写到Flash相应的位置;(5)最后把文件系统root烧写到Flash相应的位置。,5.6.2 ARM S3C2410开发板的烧写,3、烧写引导加载程序vivi下载文件vivi到开发板Flash的命令格式为:Jflash-s3c2410/t=,5.6.2 ARM S3C2410开发板的烧写,其中,Flash 类型有如下选项:1:SMDK2410:K9S3208 4MB 2:SMDK2410:K9S6
26、408 8MB 3:SMDK2410:K9S2808 16MB 4:SMDK2410:K9S5608 32MB 5:SMDK2410:K9S1208 64MB 6:SMDK2410:AM29LV800BB,5.6.2 ARM S3C2410开发板的烧写,在宿主机上,通过终端窗口进入存放vivi文件的目录2410_Image,并输入命令:#./Jflash-s3c2410 vivi_init/t=5,5.6.2 ARM S3C2410开发板的烧写,在烧写过程中,有3次提示,要求用户选择:(1)在“Select the function to test:”后面输入“0”,表示对型号为K9S1208
27、的Flash芯片进行烧写,烧写类型为程序。(2)在“Input target block number:”后面输入“0”,表示从偏移地址0处开始烧写。如图5.13所示。,5.6.2 ARM S3C2410开发板的烧写,5.6.2 ARM S3C2410开发板的烧写,(3)经过数分钟的烧写之后,将vivi烧写到Flash之中。再次出现提示:,5.6.2 ARM S3C2410开发板的烧写,在“Select the function to test:”后面输入“2”,退出vivi烧写。并关闭开发板电源,拔下JTAG连接线。,5.6.2 ARM S3C2410开发板的烧写,4、烧写嵌入式Linux系
28、统各部分内容在完成vivi烧写之后,使用串口线,通过串口将宿主机与开发板连接起来。,5.6.2 ARM S3C2410开发板的烧写,在宿主机上打开超级终端minicom窗口,再按下“Backspace”(回格)键不放,接通开发板电源。这时我们通过超级终端minicom窗口可以观察到嵌入式系统开发板上Linux系统的启动过程,并在出现提示符“vivi”时停住(如果Linux系统有启动,但没有“vivi”提示符出现,则需要再一次按住键盘上的“Backspace”(回格)键不放,对开发板“Reset”重启)。进入vivi提示状态如图5.14所示。,5.6.2 ARM S3C2410开发板的烧写,5.
29、6.2 ARM S3C2410开发板的烧写,(1)对Flash分区在“vivi”提示符下用命令“bon part”对Flash进行分区:bon part 0 192k 1M其中,从地址0处开始为vivi,地址192k(192*1024196608)处开始为内核,地址1M(1*1024*10241048576)处开始为文件系统。,5.6.2 ARM S3C2410开发板的烧写,嵌入式Linux系统的Bootloader、内核、文件系统内容在Flash中的地址分配位置如图5.15所示:,5.6.2 ARM S3C2410开发板的烧写,运行分区命令后,显示结果如下:,5.6.2 ARM S3C241
30、0开发板的烧写,由于对Flash进行了重新分区,原来烧写在Flash中从地址0处开始的引导加载程序vivi亦被擦除了,因此,这时不能掉电,也不能重启开发板,必须紧接着重新烧写vivi程序。,5.6.2 ARM S3C2410开发板的烧写,(2)重新烧写vivi在提示符“vivi”下,下载文件到开发板Flash的一般命令格式为:load flash x,5.6.2 ARM S3C2410开发板的烧写,在这里,我们利用超级终端的xmodem协议向目标板发送文件。在超级终端minicom界面窗口,输入命令:vivi load flash vivi x当出现:Ready for downloading
31、 using xmodem.Waiting.然后,按下Ctrl+A+S,弹出一个对话框,如图5.16所示:,5.6.2 ARM S3C2410开发板的烧写,5.6.2 ARM S3C2410开发板的烧写,(3)烧写内核当vivi烧写完毕后,需要重新启动开发板,使刚才的分区及引导程序生效。重新启动开发板时,操作过程如前所述,按下“Backspace”(回格)键不放的同时,重新启动开发板系统,出现提示符“vivi”。,5.6.2 ARM S3C2410开发板的烧写,输入命令:vivi load flash kernel x然后重复上面做过的操作,利用xmodem协议传送内核文件zImage_ini
32、t。,5.6.2 ARM S3C2410开发板的烧写,(4)烧写文件系统紧接着上面的操作,在提示符“vivi”下,输入命令:vivi load flash root x利用xmodem协议传送文件系统root.cramfs到开发板RAM中,再由RAM将其拷贝到Flash。,5.6.2 ARM S3C2410开发板的烧写,至此,S3C2410开发板的Linux系统烧写工作全部完成。重启嵌入式系统开发板,我们可以看到嵌入式Linux系统的启动过程。,本章小结,本章详细讲解了嵌入式Linux开发环境的搭建,包括minicom和NFS服务的配置,如何烧写开发板,如何移植嵌入式Linux内核以及如何制作文件系统。这些都是操作性很强的内容,而且在嵌入式的开发中也是必不可少的一部分,因此希望读者确实掌握。,