第 2 章 嵌入式Linux开发环境搭建

第 2 章 嵌入式Linux开发环境搭建

进行嵌入式项目开发,需要建立嵌入式开发环境。建立嵌入式Linux开发环境包括安装Bootloader工具;针对不同平台的交叉编译器(在本书中都是针对ARM平台)arm-linux-gcc;需要编译配置内核时还要安装内核源码树;在调试时使用的一些终端软件、TFTP软件、FTP软件,有内核和文件系统的烧写工具,一般硬件厂家会提供这样的工具。本章主要介绍嵌入式Linux系统移植过程中用到的交叉编译环境建立,以及各种工具的安装和配置。

2.1 虚拟机及Linux安装

很多工具都是Windows版本的,而要求的开发环境是Linux环境。在Windows系统中安装虚拟机,然后再虚拟一个Linux环境,使Linux和Windows能够互相通信。这种方案解决了很多软件不兼容两种平台的问题。

2.1.1 虚拟机的安装

虚拟机软件Vmware的安装和普通软件的安装过程一样,此处就不详细介绍了。这里主要介绍在虚拟机中安装Linux系统的过程。正确安装VMware后启动时的界面如图2.1所示。

{%}

图 2.1 VMware启动界面

下面介绍安装Linux的主要步骤,省略了一些只需要单击“下一步”按钮的步骤。

1. 准备安装系统软件Fedora-Live-Desktop-i686-19-1.iso,可以在网上下载。

2. 运行VMware,选择“文件”|“新建虚拟机”命令,或者直接单击“新建虚拟机”图标。

3. 在“新建虚拟机向导”窗口中选择“自定义”选项,如图2.2所示。

{%}

图 2.2 虚拟机配置

4. 虚拟机硬件兼容性窗口按默认选择安装。

5. 在“安装客户机操作系统”窗口中,选择“我以后再安装操作系统”选项。

6. 在选择客户机操作系统的时候选择Linux选项。在“版本”下拉菜单中选择准备安装的Linux版本。这里使用的是Fedora选项,如图2.3所示。

{%}

图 2.3 Linux安装版本选择

7. 单击“下一步”按钮,进入主题为虚拟机取名称的对话框。在此对话框中为安装的虚拟机取名字,同时确定安装路径,注意选择安装的分区应该有足够的空间安装Linux系统。因为在后面还要安装Linux源码树,所以建议安装在一个有8GB~10GB空闲空间的分区上。

8. 单击“下一步”按钮,进入处理器配置对话框,在其中根据实际情况选择处理器的个数。

9. 在对虚拟机内存进行划分时,可以根据实际主机硬件的配置进行划分,一般可以按默认的配置安装。如果实际主机配置比较高,可以给虚拟机多分配点内存。

10. 在网络连接类型中可以选择任意一种类型,该设置在后面需要修改的时候可以进行修改,此处可以按默认选项进行安装。

11. I/O适配器窗口可以按照默认配置安装。

12. 在“选择磁盘”对话框中,选择“创建一个新的虚拟磁盘”单选按钮,如图2.4所示。

{%}

图 2.4 选择创建一个新的虚拟磁盘

13. 在“选择磁盘类型”对话框中,选择IDE单选按钮,如图2.5所示。

{%}

图 2.5 虚拟磁盘类型

14. 在“指定磁盘容量”对话框中,确定磁盘大小,为Linux系统预留20GB空间,并且选择“立即分配所有磁盘空间”复选框,如图2.6所示。

{%}

图 2.6 指定磁盘容量

15. 指定磁盘文件对话框按默认名字和路径进行安装,单击“下一步”按钮,确认虚拟机设置。然后单击“完成”按钮,创建虚拟磁盘。结果如图2.7所示。

{%}

图 2.7 创建虚拟机

16. 单击“CD/DVD(IDE) 自动检测”选项,打开“虚拟机设置”对话框,如图2.8所示。

{%}

图 2.8 “虚拟机设置”对话框

17. 选择“使用ISO镜像文件”选项,然后单击“浏览”按钮,选择下载好的Fedora镜像文件。然后单击“确定”按钮,关闭对话框。

18. 在工具栏中单击绿色的按钮,或者单击“打开此虚拟机电源”选项,如图2.9所示。

{%}

图 2.9 启动虚拟机

19. 进入虚拟机安装界面,如图2.10所示。用户不需要操作,系统会自动加载光盘,进入Fedora Live界面,如图2.11所示。

{%}

图 2.10 Fedora启动界面

{%}

图 2.11 安装开始界面

20. 单击右侧的Install to Hard Drive文字,进入Fedora安装界面。

21. 在选择语言选项的时候,建议选择“简体中文”选项。然后单击“继续”按钮,进入“安装信息摘要”界面,如图2.12所示。

{%}

图 2.12 “安装信息摘要”界面

22. 在该界面提供本地化、软件、存储、键盘四项。依次确认或设置后,“开始安装”按钮就不再是灰色。然后单击“开始安装”按钮,进入“配置”界面,如图2.13所示。

{%}

图 2.13 “配置”界面

23. 进入该界面后,系统就默认开始安装。同时,该界面提供ROOT密码设置和创建用户功能。依次设置后,等待Fedora自动安装。安装完成后,系统提示重新启动计算机,如图2.14所示。

{%}

图 2.14 安装完成

24. 在VMware软件中,选择“虚拟机”|“发送Ctrl+Alt+Del”命令,重新启动Fedora操作系统,进入Fedora启动界面,如图2.15所示。

{%}

图 2.15 Fedora启动界面

25. 选择第一项,按回车键后,进入系统。由于是第一次登录,需要对语言、输入源、在线账号做一个简单设置。设置完成后,进入操作系统桌面,如图2.16所示。

{%}

图 2.16 进入Fedora桌面

注意:在设置账号密码的时候,如果密码安全等级较低,系统会显示警告信息。如果确定使用该密码,就需要单击两次左上角的“完成”按钮,强制密码生效。

2.1.2 虚拟机和主机通信设置

很多资料和软件往往都放在主机上,当需要在虚拟机环境下对这些资料进行访问时,或者将虚拟机编译好的文件传送到主机上时,就需要建立两者之间的通信。建立虚拟机和主机通信的过程如下所述。

1. 选择“虚拟机”|“设置”命令,打开“虚拟机设置”对话框。选择“硬件”选项卡中的 “网络适配器”选项。在“网络连接”选项区域中选择“自定义:指定虚拟网络”单选按钮,在下拉列表框中设置网络连接为VMnet8 (NAT)。然后单击“确定”按钮,如图2.17所示。

{%}

图 2.17 “虚拟机设置”对话框

2. 选择“编辑”|“虚拟网络编辑器”命令,进入“虚拟网络编辑器”对话框。选择NAT标签,将VMnet host设置为VMnet8。然后单击“确定”按钮,如图2.18所示。

{%}

图 2.18 “虚拟网络编辑器”对话框

3. 在该对话框中,显示NAT子网的IP和子网掩码分别为192.168.81.0和255.255.255.0。

4. 设置网卡连接状态。双击虚拟机窗口右下角的网络适配器标志,如图2.19所示。在“设备状态”选项框中,选择“已连接”和“打开电源时连接”复选框,如图2.20所示。

{%}

图 2.19 双击网卡标志

{%}

图 2.20 设置网卡状态

5. 打开一个终端,通过ifconfig查看虚拟机的IP地址,如图2.21所示。图中显示网卡地址为192.168.81.136。

{%}

图 2.21 虚拟机IP地址

6. 确定主机的VMware net8网卡为已连接状态,在主机端ping虚拟机,结果如图2.22所示。查看主机VMware net8网卡的IP地址,一般和虚拟机网关为一个网段,并且其IP地址为192.168.81.1。在虚拟机中ping该IP,结果如图2.23所示。互相都可以ping通说明主机和虚拟机通信成功。

{%}

图 2.22 主机ping虚拟机

{%}

图 2.23 虚拟机ping主机

2.1.3 虚拟机与主机共享文件

设置文件共享后,能够在主机和虚拟机之间进行文件传输。

1. 选择“虚拟机”|“设置”命令打开虚拟机设置(Virtual Machine Setting)对话框。选择“选项”标签,在其中选择“共享文件夹”选项。在“文件夹共享”选项框选择“总是启用”单选按钮,如图2.24所示。

{%}

图 2.24 设置共享文件夹

2. 单击“添加”按钮,弹出“添加共享文件夹向导”对话框。单击“下一步”按钮,弹出“共享文件夹名称”对话框,如图2.25所示。

{%}

图 2.25 “共享文件夹名称”对话框

3. 设置完成后,单击“下一步”按钮,进入“指定共享文件夹属性”对话框,如图2.26所示。选择“启用该共享”选项,然后单击“完成”按钮,保存设置。进入/mnt目录下,会发现多了一个目录share。进入share,可以看到在Windows系统下的文件。

{%}

图 2.26 “指定共享文件夹属性”对话框

2.1.4 虚拟机与主机文件传输

某些版本的虚拟机或者Linux系统对文件共享支持不够完美,此时可以选择FTP方式进行文件传输,该方法操作方便,在实际开发中被普遍使用。该方法包括服务器端(虚拟机)和客户端(主机)两部分安装,并且包括服务器端和客户端的配置。下面将分别进行介绍。

1. 安装vsftp软件。Fedora默认没有安装FTP,需要用户手动安装。在“软件”程序中,搜索vsftp,并安装,如图2.27所示。

{%}

图 2.27 “软件”对话框

2. 启动FTP服务。在终端中,输入以下命令启动vsftpd服务。

service vsftpd start
Redirecting to /bin/systemctl start  vsftpd.service

3. 在防火墙中设置FTP策略,使得实体机可以访问虚拟机中的FTP服务,设置如图2.28所示。

{%}

图 2.28 “防火墙配置”对话框

4. 在实体机中使用IE等客户端工具,访问FTP服务器,就可以看到FTP所共享的文件,如图2.29所示。

{%}

图 2.29 实体机访问虚拟机的FTP服务

2.2 交叉编译工具

交叉编译工具是为了使在上位机中编译的文件能够在不同平台的目标机中执行。本书介绍的目标平台均为ARM平台。

2.2.1 交叉编译工具安装

交叉编译工具的安装主要包括编译GNU binutils、获得Linux 内核头文件、安装Glibc头文件、安装GCC第一阶段、安装Glibc和完全安装GCC。一次成功安装的过程需要长达数小时的时间,因此在没有成功编译此工具经验时,可以参考一些稳定交叉编译器的版本。下面将详细介绍安装的过程,并提供相关的命令和解释供编译时参考。

1. 建立存放工具、源码目录和设置相关的环境变量。

#mkdir /usr/local/arm                           //建立工作目录
#cd /usr/local/arm                              //进入工作目录
#mkdir -p /usr/local/arm/src                    //建立安装文件的目录
#mkdir -p /usr/local/arm/sysroot                //建立系统根目录
#mkdir -p /usr/local/arm/bin                    //建立生成工具存放的目录
#mkdir -p /usr/local/arm/build                  //建立编译目录
#export HOST=i686-pc-linux-gnu                  //设置HOST环境变量
#export TARGET=arm-linux-gnueabi                //设置TARGET环境变量
#export PREFIX=/usr/local/arm                   //设置PREFIX环境变量
#export SYSROOT=/usr/local/arm/sysroot          //设置SYSROOT环境变量
#export PATH=$PATH:${PREFIX}/bin                //添加生成工具目录到PATH中

注意:在定义好环境变量后,应该使用echo命令查看环境变量是否与预计的变量相符合。在重新打开shell时,或者在第二次接着编译交叉环境时都应该检查环境变量。例如当PATH没有设置正确时,在编译glibc时,就会因arm-liunx-gcc不存在而导致编译失败。

2. 从网站下载安装的源码包,需要下载的源码包如表2.1所示。

表 2.1 源码包列表

软件包名称

下载地址

binutils-2.23.tar.bz2

http://ftp.gnu.org/gnu/binutils/

linux-2.6.33.3.tar.bz2

http://www.kernel.org/pub/linux/kernel/v2.6/

gcc-4.6.0.tar.bz2

http://ftp.gnu.org/gnu/gcc/gcc-4.6.0/

glibc-2.17.tar.gz

http://ftp.gnu.org/gnu/glibc/

glibc-linuxthreads-2.3.6.tar.gz

http://ftp.gnu.org/gnu/glibc/

将获得的源码mkdir复制到/usr/local/arm/src目录下。目录结构如下:

|-- arm
|   |-- bin           //工具目录
|   |-- build         //编译目录
|   |-- src           //存放源码cd
|   |—sysroot        //编译过程生成系统的根目录

3. 编译GNU binutils。

#cd{PREFIX}/src
#tar xvfj binutils-2.23.tar.bz2
#mkdir -p /usr/local/arm/build/binutils-2.23
#cd /usr/local/arm/build/binutils-2.23
#../../src/binutils-2.23/configure --prefix=${PREFIX} --target=${TARGET} --with-sysroot=${SYSROOT} 2>&1 | tee configure.out
#make 2>&1 | tee make.out
#make install 2>&1 | tee -a make.out

编译选项注释:

--target=${TARGET}

这个选项是跟--host一起表示编译生成的可执行文件运行在HOST上面,但这些可执行文件服务的对象是TARGET,也就是说,用这些可执行文件连接和汇编出来的程序运行在TARGET上面。这里,默认就会使用主机的GCC编译器,因此省略了--host选项。

--prefix=${RESULT_DIR}

告诉配置脚本当运行 make install 时,把编译好的东西安装在RESULT_DIR目录下。

--with-sysroot=${SYSROOT}

SYSROOT为系统根目录,生成相应的库放在SYSROOT/lib目录下,可执行文件放在SYSROOT/sbin下,配置文件放在SYSROOT/etc下,用户文件放在SYSROOT/usr下。

在上面的编译过程中如果出现问题,最好的方法就是,删除编译目录下的所有文件,删除Binutils目录,重新解压Binutils,再重新开始安装。安装成功后就会在/usr/local/arm/bin目录下生成下面的工具:

arm-linux-addr2line arm-linux-c++filt arm-linux-nm      arm-linux-ranlib
arm-linux-strings
arm-linux-ar        arm-linux-gprof   arm-linux-objcopy arm-linux-readelf
arm-linux-strip
arm-linux-as        arm-linux-ld      arm-linux-objdump arm-linux-size

Binutils是GNU工具之一,包括连接器、汇编器和其他用于目标文件和档案的工具,它是二进制代码的处理维护工具。安装Binutils工具包含的程序有addr2line、ar、as、c++ filt、gprof、ld、nm、objcopy、objdump、ranlib、readelf、size、strings、strip、libiberty、libbfd和libopcodes。对这些程序的简单解释如下所述。

  • addr2line:把程序地址转换为文件名和行号。在命令行中给它一个地址和一个可执行文件名,它就会使用这个可执行文件的调试信息指出在给出的地址上是哪个文件及行号。

  • ar:用来建立、修改和提取归档文件。归档文件是包括了其他多个文件的一个较大的文件,从该文件中可以恢复其他文件内容。

  • as:主要用来编译GNU C编译器gcc输出的汇编文件,编译产生的目标文件再由连接器ld进行连接操作。

  • c++filt:连接器使用它来过滤 C++ 和 Java 符号,防止发生重载函数冲突。

  • gprof:显示程序调用段的各种数据。

  • ld:是连接器,它把所有编译产生的目标文件和归档文件结合在一起,重新定位数据,并连接符号引用。一般建立一个新编译程序的最后一步就是调用ld。

  • nm:列出目标文件中的符号。

  • objcopy:把一种目标文件中的内容复制到另一种类型的目标文件中。

  • objdump:显示一个或者更多目标文件的信息。使用选项来控制其显示的信息,它所显示的信息通常只有编写编译工具的人才感兴趣。

  • ranlib:产生归档文件索引,并将其保存到这个归档文件中。在索引中列出了归档文件各成员所定义的可重分配目标文件。

  • readelf:显示elf格式可执行文件的信息。

  • size:列出目标文件每一段的大小及总体的大小。默认方式下,目标文件或者归档文件中的单个模块只产生一行输出。

  • strings:打印某个文件的可打印字符串,这些字符串最少4个字符长,也可以使用选项-n设置字符串的最小长度。默认情况下,它只打印目标文件初始化和可加载段中的可打印字符;对于其他类型的文件它打印整个文件的可打印字符。这个程序对于了解非文本文件的内容很有帮助。

  • strip:丢弃目标文件中的全部或者特定符号。

  • libiberty:包含许多GNU程序都会用到的函数,这些程序有getopt、obstack、strerror、strtol和strtoul。

  • libbfd:二进制文件描述库。

  • libopcode:用来处理opcodes的库,在生成一些应用程序的时候也会用到它。

4. 获得Linux内核头文件,并将头文件安装在${SYSROOT}/usr/include目录下。

#cd{PREFIX}/src
#tar xvfj linux-2.6.33.3.tar.bz2
#cd linux-2.6.33.3/
#make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig
#make include/linux/version.h
#mkdir -p{SYSROOT}/usr/include
#cp -a{PREFIX}/src/ linux-2.6.33.3/include/linux{SYSROOT}/usr/include/linux
#cp -a{PREFIX}/src/linux-2.6.33.3/ arch/arm/include/asm{SYSROOT}/usr/include/asm
#cp -a{PREFIX}/src/linux-2.6.33.3/include/asm-generic{SYSROOT}/usr/include/asm-generic

注意:执行make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig时,主要是为了选择一个对应CPU的类型。选择System Type →ARM system type (ARM Ltd. Versatile family)→(X) Samsung S3C2410, S3C2412, S3C2413, S3C2440, S3C2442, S3C2443,如图2.30所示。

{%}

图 2.30 选择系统芯片类型

5. 安装Glibc头文件。Glibc是GUN C库,它是编译Linux系统程序的重要组成部分。在安装GNU C库前需要先安装其头文件。

#cd{PREFIX}/src
#tar xvfz glibc-2.17.tar.gz
#cd glibc-2.17
#tar xvfz ../glibc-linuxthreads-2.3.6.tar.gz
#cd ..
#mkdir -p /usr/local/arm/build/glibc-2.17-headers
#cd /usr/local/arm/build/glibc-2.17-headers
#../../src/glibc-2.17/configure      --prefix=/usr      --host=${TARGET} --enable-add-ons   --with-headers=${SYSROOT}/usr/include   2>&1   |   tee configure.out
#make cross-compiling=yes install_root=${SYSROOT} install-headers 2>&1 | tee make.out
#touch{SYSROOT}/usr/include/gnu/stubs.h
#touch{SYSROOT}/usr/include/bits/stdio_lim.h

6. 安装GCC第一阶段。安装GCC共分为两个阶段,第一阶段是为了安装ARM交叉编译工具没有支持libc库的头文件。

#cd{PREFIX}/src
#tar xvfj gcc-4.6.0.tar.bz2
#mkdir -p mkdir /usr/local/arm/build/gcc-4.6.0
#cd /usr/local/arm/build/gcc-4.6.0
#../../src/gcc-4.6.0/configure --prefix=${PREFIX} --target=${TARGET}
--enable-languages=c --with-sysroot=${SYSROOT} 2>&1 | tee configure.out
#make 2>&1 | tee make.out
#make install 2>&1 | tee -a make.out

7. 安装GNU C库。安装了Glibc后才能对GCC进行完全安装。

#cd{PREFIX}/src
#mkdir -p /usr/local/arm/build/glibc-2.17
#cd /usr/local/arm/build/glibc-2.17
#BUILD_CC=gcc CC=${TARGET}-gcc AR=${TARGET}-ar RANLIB=${TARGET}-ranlib
AS=${TARGET}-as LD=${TARGET}-ld ../../src/glibc-2.3.5/configure --prefix=
/usr
--build=i386-redhat-linux --host=arm-unknown-linux-gnu --target=arm-
unknown-linux-gnu
--without-__thread --enable-add-ons=linuxthreads --with-headers=
${SYSROOT}/usr/include
2>&1 | tee configure.out
#make 2>&1 | tee make.out
#BUILD_CC=gcc CC=${TARGET}-gcc AR=${TARGET}-ar RANLIB=${TARGET}-ranlib
AS=${TARGET}-as LD=${TARGET}-ld../../src/glibc-2.17/configure --prefix=
/usr build=${HOST} --host=${TARGET} –target=${TARGET} --without-__thread --enable-add-ons=linuxthreads --with-headers=${SYSROOT}/usr/include 2>&1 | tee make.out

8. 完全安装GCC。

#cd{PREFIX}/src
#mkdir -p /usr/local/arm/build/gcc-4.6.0
#cd /usr/local/arm/build/gcc-4.6.0
#../../src/gcc-4.6.0/configure --prefix=${PREFIX} --target=${TARGET}
--enable-languages=c --with-sysroot=${SYSROOT} 2>&1 | tee configure.out
#make 2>&1 | tee make.out
#make install 2>&1 | tee -a make.out

编译完成后会在/usr/local/arm/bin目录下增加交叉编译工具,具体生成的工具如下:

arm-linux-addr2line  arm-linux-cpp    arm-linux-gcov   arm-linux-objdump
arm-linux-strings
arm-linux-ar      arm-linux-gcc       arm-linux-ld    arm-linux-ranlib
arm-linux-strip
arm-linux-as     arm-linux-gcc-4.4.0  arm-linux-nm    arm-linux-readelf
arm-linux-c++filt  arm-linux-gccbug    arm-linux-objcopy  arm-linux-size

9. 删除源码目录、临时目录和一些中间目录,得到arm-linux、bin、lib、libexec和share目录。

注意:编译交叉编译器是一个很耗时的工作,对于实际项目的作用并不大。除非在某些应用程序或者驱动模块已经通过测试进入成品库,而这些应用程序或驱动模块依赖某个版本GCC或glibc,同时修改和测试应用程序或驱动模块的工作量相对非常复杂,此时可以选择需要的版本进行建立交叉编译环境。一般情况下,建议读者直接使用开发板厂商提供的交叉编译器,或者在网上下载稳定的交叉编译器。目前针对2.4内核的稳定版本为2.95.3,针对2.6内核的稳定版本为3.4.1。笔者目前还使用开发商提供的4.4.3版本。在后面的内核移植和驱动移植过程中使用的就是4.4.3版本。

2.2.2 交叉编译器测试

在使用新建立的交叉编译器前需要对其进行简单的测试,查看其生成的文件是否可以移植到ARM平台的开发板上运行。

1. 对编译的交叉工具链进行简单的测试。将arm-linux-gcc添加到环境变量中。

# vi /etc/profile

找到# Path manipulation部分,添加arm-linux-gcc所在目录。修改后保存配置重启系统配置生效。

# Path manipulation
if [ "$EUID" = "0" ]; then
       pathmunge /sbin
       pathmunge /usr/sbin
       pathmunge /usr/local/sbin
fi

修改如下:

# Path manipulation
if [ "$EUID" = "0" ]; then
       pathmunge /sbin
       pathmunge /usr/sbin
       pathmunge /usr/local/sbin
       pathmunge /usr/local/arm/bin
fi

2. 编写简单的测试程序,查看程序适应的体系结构。

#include <stdio.h>
int main()
{
       printf("test arm-linux-gcc");
       return 0;
}

对上面的程序进行交叉编译,并查看其头文件信息,看其运行属于哪种平台体系结构。

#arm-linux-gcc –o test test.c            //交叉编译test.c,生成test
# readelf test –h                            //使用readelf命令查看头文件信息 ELF 头:
  Magic:  7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
  Class:                         ELF32
  Data:                          2's complement, little endian
  Version:                       1 (current)
  OS/ABI:                        UNIX - System V
  ABI Version:                    0
  Type:                          EXEC (可执行文件)
  Machine:                       ARM
  Version:                       0x1
  入口点地址:          0x8338
  程序头起点:          52 (bytes into file)
  Start of section headers:         4464 (bytes into file)
  标志:          0x5000002, has entry point, Version5 EABI
  本头的大小:    52 (字节)
  程序头大小:    32 (字节)
  Number of program headers:        10
  节头大小:         40 (字节)
  节头数量:         30
  字符串表索引节头: 27

可以看出该文件运行的环境为ARM。

2.3 超级终端和Minicom

在对目标板进行查看、操作或目标板和上位机进行文件传输与通信时,需要安装终端软件。通过终端软件来对目标板进行配置,或者执行目标板上的程序与主机进行通信。

2.3.1 超级终端软件的安装

在Windows环境中,一般使用系统自带的超级终端软件,或者安装其他的终端软件。下面介绍超级终端软件的使用和设置。

在Windows XP上,可以直接执行“开始”|“所有程序”|“附件”|“通信”|“超级终端”命令,打开超级终端软件。但是在Windows 7中已经没有超级终端。用户需要从网上下载Windows XP的超级终端,然后放到Windows 7中运行。运行后,如图2.31所示。在“名称”文本框中,可以任意为其取名字,可以以开发板型号作为名称。

{%}

图 2.31 打开超级终端软件界面

开发板一般是通过串口线和PC连接。在选择连接使用的端口时,如果有计算机串行接口,则一般默认选择COM1。图2.32是对连接端口的选择。如果第一次设置不清楚时,可以查看设备管理器,如图2.33所示。

{%}

图 2.32 超级终端连接端口选择

{%}

图 2.33 确定与开发板相连的端口

对端口参数的设置包括比特率、奇偶校验、数据流控制等,其相应的选择如图2.34所示。最后单击“确定”按钮保存配置,下次可以直接使用。

{%}

图 2.34 端口参数设置

2.3.2 配置Minicom

Minicom是Linux系统中的终端软件。在Linux系统中可以通过此软件访问目标板。如果上位机中带有串口,那么ttyS0代表COM1,ttyS1代表的就是COM2。如果在上位机中不带串口,那么需要编译加载usbserial模块。加载模块后可以在dev下面生成ttyUSB0。编译内核、驱动的方法和加载驱动的方法将在后面介绍。下面介绍Windows平台下minicom的设置。

1. 在终端中使用minicom –s命令进行配置界面,如图2.35所示。

#minicom –s

{%}

图 2.35 Minicom的配置界面

2. 使用键盘的上下键对光标进行操作,选择Serial port setup项后按Enter键确定进入此项进行配置。如果选错选项可使用Esc键退出。进入串口的配置界面如图2.36所示。

{%}

图 2.36 串口的配置界面

3. 通过按键盘的A、C、D、E、F、G键选择进入各个参数项的配置。配置完成后按Enter键确认配置。对波特率、数据位和停止位的参数配置,如图2.37所示,最终配置如图2.38所示。最后退出并保存配置。

{%}

图 2.37 波特率、数据位和停止位配置

{%}

图 2.38 最终配置

2.3.3 配置SecureCRT

SecureCRT也是一款功能强大的终端软件,其使用环境为Windows环境。它的安装过程比较简单。本节只介绍其第一次使用时的配置过程。配置一次后,以后直接连接即可。

1. 通过菜单File | Connect或File | Quick Connect命令均可进入配置界面,或者通过工具栏的Connect按钮和Quick Connect按钮进入配置界面。两者的配置界面不同,但是参数是一样的。这里举例Quick Connect配置界面,如图2.39所示。

{%}

图 2.39 SecureCRT串口配置

2. 单击Connect按钮保存配置并进入连接状态。下次运行此软件时可以直接选择此连接,如图2.40所示,直接单击Connect按钮进入连接状态。

{%}

图 2.40 重新运行SecureCRT界面

注意:以上3个终端软件任意使用一个即可,并非都要进行安装。

2.4 内核、文件系统加载工具

内核、文件系统加载工具是嵌入式开发必备的工具,在购买开发板时,会得到配套的这类工具。不同的公司提供的工具和方法略有不同。这里针对重要的地方加以介绍。

2.4.1 烧写Bootloader

烧写Bootloader可以使用超级终端的“传送”|“发送文件”命令进入发送文件对话框,使用Xmodem协议和Kermit协议发送Bootloader的各个文件。选择协议如图2.41所示。

{%}

图 2.41 使用超级终端烧写Bootloader

除了比较通用的Bootloader之外,FriendlyARM公司专门为其产品开发了MiniTools工具,该工具的使用方式非常简单,为入门读者提供了方便。使用MiniTools烧写Bootloader程序过程如下所述。

1. 确定开发板与主机相连,并且驱动运行正确。

2. 运行MiniTools软件,将开发板的NOR/NAND选择开关置于NOR位置,然后打开开发板电源。此时可以看到MiniTools工具已经正确连接到开发板,如图2.42所示。

{%}

图 2.42 MiniTools连接开发板

3. 正确连接开发板后,选择开发板的系统类型,如图2.43所示。

{%}

图 2.43 连接开发板

4. 选择Bootloader文件。通过要烧写的文件对应项目后的“…”按钮选择Bootloader文件,并且选中对应项目的复选框,如图2.44所示。

{%}

图 2.44 选择Bootloader文件

5. 烧写Bootloader。单击软件界面右下角的“开始烧写”按钮开始烧写Bootloader。烧写完成后会在“详细信息”窗口中显示成功信息,如图2.45所示。

{%}

图 2.45 烧写完成

2.4.2 内核和文件系统下载

有些公司提供网口下载内核和文件系统的方式;而有些公司采用USB方式下载文件系统和内核。采用网口方式下载时需要安装TFTP工具,然后设置正确的IP地址和下载文件路径,同时需要在U-boot中设置服务器的IP地址为上位机的IP地址。设置开发板的IP地址与上位机的IP地址为同一个网段,在上位机中建立TFTP服务器后,通过终端软件输入tftp命令下载内核和文件系统。

内核和文件系统也可以通过MiniTools工具烧写,烧写过程与烧写Bootloader类似。与烧写Bootloader不同的是,内核和文件系统下载需要选择正确的内核文件和文件系统文件,如图2.46所示。

{%}

图 2.46 选择内核和文件系统文件

在烧写完成后会在“详细信息”中显示操作步骤以及完成信息,如图2.47所示。

{%}

图 2.47 内核和文件系统烧写完成

2.4.3 应用程序和文件传输

整个系统移植成功后,还有一些应用程序或者文件要在开发板和上位机之间进行传输。一般选择使用SecureCRT通过串口进行传输。SecureCRT支持多种传输协议,通常使用Zmodem协议来传输。该协议的传输速度和成功率都是比较优秀的。在SecureCRT正确连接开发板后,通过Transfer|Zmodem Upload List…命令来选择要传输的文件,如图2.48所示。

{%}

图 2.48 选择传输方式

在弹出的对话框中选择要传输的文件,并单击Add按钮添加到传输列表中,如图2.49所示。

{%}

图 2.49 传输文件过程

可以单击Start Upload按钮开始传输文件,如图2.50所示。

{%}

图 2.50 Start Upload

也可以单击OK按钮后通过Transfer|Start Zmodem Upload命令开始传输文件,如图2.51所示。

{%}

图 2.51 Start Zmodem Upload

文件会传输在登录用户的当前工作目录下,如图2.52所示。

{%}

图 2.52 传输完成

2.5 在开发中使用网络文件系统(NFS)

在开发中使用NFS有两个优点:开发过程中不受开发板空间的限制,直接使用网络文件就像使用本地文件一样;调试过程中避免一一将编译后的应用程序和库文件复制到开发板上。在开发板中使用网络文件系统可以为开发和调试节省不少时间。下面介绍虚拟机环境下搭建NFS的过程。

2.5.1 虚拟机设置

这里需要配置虚拟机,让虚拟机能够直接访问局域网内的任何主机。前面为了能够让虚拟机与宿主机进行通信,将虚拟机的网络连接设置为NAT方式,下面主要介绍桥接模式和NAT模式。

1. 桥接模式(Bridged Networking)

在桥接模式下,VMWare虚拟出来的操作系统相当于局域网中一台独立的主机,它可以访问网内任何一台机器。在这种模式下,需要手动为虚拟系统配置和宿主机器处于同一网段的IP地址和子网掩码,这样虚拟系统就可以和宿主机器进行通信。如果配置好网关和DNS的地址,还可以通过局域网的网关或路由器访问互联网。

2. NAT模式(Network Address Translation)

在NAT模式下,虚拟系统借助NAT(网络地址转换)功能,通过宿主机器所在的网络来访问互联网。NAT模式下的虚拟系统的TCP/IP配置信息是由VMnet(NAT)虚拟网络的DHCP服务器提供,无法进行手动修改,因此虚拟系统和局域网中的其他真实主机无法通信。

为了使虚拟机、宿主机和开发板能达到互相通信的目的,虚拟机的网络连接方式应该采用桥接方式,通过选择菜单“虚拟机”,然后在下拉菜单中选择“设置”选项,在弹出的“虚拟机设置”窗口中进行设置,如图2.53所示。

{%}

图 2.53 设置网络连接方式为桥接方式

注意:设置虚拟机网络连接时,应该在虚拟机没有启动时进行设置,否则无法设置或者设置无法生效。

2.5.2 虚拟机的IP地址设置

启动虚拟机,查看虚拟机的IP地址和网络连接状态。在右下角查看虚拟网卡是否已连接,在终端输入ifconfig查看网卡是否已设置,如图2.54所示。

{%}

图 2.54 虚拟机的网络连接状态

或者可以单击右上角的网络图标,然后在弹出的面板中,单击“网络设置”按钮,打开“网络”对话框,如图2.55所示。单击右下角的设置图标进入网卡设置对话框,在该对话框中对虚拟机IP地址和网关进行设置,如图2.56所示。

{%}

图 2.55 虚拟机网络配置

{%}

图 2.56 虚拟机IP地址设置

注意:虚拟机启动后看虚拟机右下角的虚拟网卡标识是否连接上,如果没有连接上则有可能是安装虚拟机时少选了一项VMware Bridge Protocol。如果连接上就不必进行下面的安装过程了。

可以打开主机网络连接的属性窗口,在该窗口中有本地连接VMnet1、VMnet8和网络连接。右击VMnet1或者VMnet8,选择“属性”进入“VMware Network Adapter VMnet1属性”对话框,单击“安装”按钮,如图2.57所示。进入“选择网络功能类型”对话框后,选择“服务”选项,并单击“添加”按钮,如图2.58所示。

{%}

图 2.57 进入“VMware Network Adapter VMnet1属性”窗口

{%}

图 2.58 添加服务

在“选择网络服务”窗口,单击“从磁盘安装”按钮,如图2.59所示。在虚拟机安装路径下的VMware Workstation目录中找到netbridge.inf文件,然后“打开”按钮进行安装,如图2.60所示。

{%}

图2.59 选择从磁盘安装

{%}

图2.60 打开安装文件netbridge.inf

安装过程完成后,在“VMware Network Adapter VMnet1属性”窗口出现了VMware Bridge Protocol项,如图2.61所示。重新启动计算机,并且重启虚拟机。

{%}

图 2.61 安装后出现VMware Bridge Protocol项

2.5.3 验证网络连接

主机的IP地址为192.168.1.109,虚拟机的IP地址为192.168.1.111,开发板的IP地址为192.168.1.113。分别通过ping命令验证两两之间是否可以通信,正常情况下是可以互相ping通,但是如果物理网卡没有连接网线则无法实现通信(开发板与主机采用交叉网线连接),如图2.62是虚拟机ping主机的情况。

{%}

图 2.62 虚拟机ping主机

2.5.4 设置共享目录

编辑文件/etc/exports,在文件中添加以下内容。

/home/nfs 192.168.1.*(rw, sync, no_root_squash)

  • /home/nfs:表示共享给其他主机的共享目录;

  • 192.168.1.*:表示IP地址为192.168.1.2/254的主机都能够挂载/home/nfs目录;

  • rw:表示挂接此目录的客户机对该目录具有读写的权力;

  • sync:表示同步写入存储器;

  • no_root_squash:表示允许挂接此目录的客户机享有该主机的root身份。

使用下面的命令查看共享目录:

# showmount -a

如果出现错误:showmount: can't get address for localhost.localdomain,则修改文件/etc/hosts,将

::1    localhost.localdomain   localhost

修改为:

127.0.0.1    localhost.localdomain   localhost

2.5.5 启动NFS服务

启动NFS服务之前,首先需要在防火墙中允许NFS和RPC-bing服务,并且启动RPC-bing服务。进入“防火墙配置”设置,如图2.63所示。

{%}

图 2.63 禁止防火墙

启动RPC-bing服务和NFS服务的命令如下:

# service rpcbing start     //服务启动
# service rpcbing restart   //服务重启
# service nfs start
# service nfs restart

如果在启动过程中出现“启动 NFS 守护进程失败”等错误提示,则重新计算机后,再进行尝试。

2.5.6 修改共享配置后

修改/etc/exports配置文件后,应该使配置文件重新生效。在启动了NFS之后又修改了/etc/exports,此时就可以用exportfs命令使改动立刻生效,该命令格式如下:

exportfs [-aruv]

  • -a:全部mount或者unmount /etc/exports中的内容;

  • -r:重新mount /etc/exports中共享出来的目录;

  • -u:umount 目录;

  • -v:在 export 的时候,将详细的信息输出到屏幕上。

例如:

exportfs –rv

该命令重新输出全部的共享目录信息。在每次修改了/etc/exports文件后都要运行一次该命令,使共享配置生效。

2.5.7 挂载NFS

在虚拟机上修改共享目录/home/nfs的权限为777。开发板与主机通过交叉网线连接后,虚拟机、主机及开发板三者可以进行互相通信。使用mount命令在开发板上挂载此目录。

#chmod 777 /home/nfs
# mount -t nfs 192.168.1.123:/home/nfs /mnt
或者使用
# mount –o nolock -t nfs 192.168.1.123:/home/nfs /mnt

2.5.8 双网卡挂载NFS

当拥有两张物理网卡时,专门用一张网卡将ARM板和虚拟机相连,将两者的IP设置在一个IP段内。具体过程和单网卡类似,首先做到虚拟机和ARM能相互ping通,能正常启动NFS服务,最后挂载网络文件系统。

在搭建NFS时,给出一些错误情况解决的方法。

  • 当启动NFS服务失败时,解决的办法通常是修改/etc/exports文件,出错的原因通常是权限引起的。

  • 当出现RPC等报错时,应该注意防火墙是否关闭。

  • 当挂载NFS时,出现Permission denied报错时,检查/etc/exports文件中的权限设置,另外检查共享目录的权限设置。

出现任何报错的情况,都应该查看错误日志/var/log/messages,对照错误日志查找问题。笔者在挂载的过程中遇到以下几个问题。

1. mount:RPC:Timed out

该问题是由主机的防火墙引起的,关闭了虚拟机的防火墙后请注意,主机的防火墙也可能对RPC的包进行拦截。遇到此类问题时,请读者注意虚拟机和主机两者的防火墙是否关闭。

2. 在使用下面的mount -t nfs 192.168.1.123:/home/nfs /mnt命令进行挂载时,出现下面的错误。

rpcbind: server localhost not responding, timed out
RPC: failed to contact local rpcbind server (errno 5).
rpcbind: server localhost not responding, timed out
RPC: failed to contact local rpcbind server (errno 5).
rpcbind: server localhost not responding, timed out
RPC: failed to contact local rpcbind server (errno 5).
将挂载命令修改如下后挂载成功
#mount –o nolock 192.168.1.123:/home/nfs /mnt    或者
#mount –o nolock –t nfs 192.168.1.123:/home/nfs /mnt

2.6 小结

安装交叉编译工具是本章最复杂的一节,建议读者在有充足的时间及有必要的情况下才去编译,一般可以直接使用开发板公司提供的稳定的交叉编译工具。另外在编译前,应该参照一些编译成功的例子,与其版本最好一致。如果编译过程中出现问题,首先应该考虑版本是否兼容。更换新版本时应该清除旧版本编译过程中生成的文件。重新编译后应该核对生成工具的版本是否和更换的版本相符。因为初次编译交叉环境需要很长时间,所以在继续编译时有可能出现环境变量失效的问题。读者在安装的过程中直接使用全路径或者设置永久的环境变量的方式。一般而言,对编译安装路径变量不提倡设置为永久的环境变量,因为在以后的内核编译、驱动移植、文件系统移植等编译过程中都会有路径设置情况。

目录

  • 前言
  • 第 1 篇 系统移植基础篇
  • 第 1 章 Linux内核介绍
  • 第 2 章 嵌入式Linux开发环境搭建
  • 第 2 篇 系统移植技术篇
  • 第 3 章 Bootloader移植
  • 第 4 章 Linux内核裁剪与移植
  • 第 5 章 嵌入式文件系统制作
  • 第 3 篇 系统移植与驱动篇
  • 第 6 章 LCD驱动移植
  • 第 7 章 触摸屏驱动移植
  • 第 8 章 USB设备驱动移植
  • 第 9 章 网卡驱动程序移植
  • 第 10 章 音频设备驱动程序移植
  • 第 11 章 SD卡驱动移植
  • 第 12 章 NandFlash驱动移植
  • 第 4 篇 系统移植高级篇
  • 第 13 章 MiniGUI与移植
  • 第 14 章 Qt开发与Qtopia移植
  • 第 15 章 嵌入式数据库Berkeley DB移植
  • 第 16 章 嵌入式数据库SQLite移植
  • 第 17 章 嵌入式Web服务器BOA移植
  • 第 18 章 嵌入式Web服务器Thttpd移植
  • 第 19 章 JVM及其移植
  • 第 20 章 VoIP技术与Linphone编译