嵌入式Linux开发环境搭建广州嵌入式软件公共技术支持中心梁老师2007年04月嵌入式系统定义嵌入到对象体中的专用计算机系统三要素:嵌入、专用、计算机嵌入式系统的特点:由三要素引出嵌入性:嵌入到对象体系中,有对象环境要求专用性:软、硬件按对象要求裁减计算机:实现对象的智能化功能嵌入式系统的应用嵌入式Linux开发环境嵌入式系统通常是一个资源受限的系统,因此直接在嵌入式系统的硬件平台上编写软件比较困难,有时候甚至是不可能的。解决办法:首先在通用计算机上编写程序;然后通过交叉编译生成目标平台上可以运行的二进制代码格式;最后再下载到目标平台上的特定位置上运行。嵌入式Linux开发环境关于交叉编译在一种平台上编译出能在另一种平台(体系结构不同)上运行的程序。在PC平台(X86CPU)上编译出能运行在arm平台上的程序,编译得到的程序在X86CPU平台上是不能运行的,必须放到arm平台上才能运行。用来编译这种程序的编译器就叫交叉编译器。为了不跟本地编译器混淆,交叉编译器的名字一般都有前缀。例如:arm-linux-gcc嵌入式Linux开发环境嵌入式Linux开发环境嵌入式Linux开发环境需要交叉开发环境(CrossDevelopmentEnvironment)的支持是嵌入式应用软件开发时的一个显著特点。交叉编译器只是交叉开发环境的一部分。交叉开发环境是指编译、链接和调试嵌入式应用软件的环境,它与运行嵌入式应用软件的环境有所不同,通常采用宿主机-目标机模式。嵌入式Linux开发环境宿主机-目标板模式宿主机(Host)是一台通用计算机,它通过串口或者以太网接口与目标机通信。宿主机的软硬件资源比较丰富,能够大大提高嵌入式应用软件的开发速度和效率。目标板(Target),应用程序实际运行的平台,或者是能够替代实际运行环境的仿真系统。软硬件资源通常都比较有限。嵌入式Linux开发环境宿主机-目标机模式首先利用宿主机上丰富的资源和良好的开发环境开发和仿真调试目标机上的软件;然后通过串口或者以网络将交叉编译生成的目标代码传输并装载到目标机上,并在监控程序或者操作系统的支持下利用交叉调试器进行分析和调试;最后目标机在特定环境下脱离宿主机单独运行。嵌入式Linux开发环境开放的交叉开发环境的典型代表是GNU工具链目前已经能够支持x86、ARM、MIPS、PowerPC等多种处理器。商业的交叉开发环境则主要有MetrowerksCodeWarrior、ARMSoftwareDevelopmentToolkit等等。嵌入式Linux开发环境GNU交叉工具链交叉编译器,例如arm-linux-gcc交叉汇编器,例如arm-linux-as交叉链接器,例如arm-linux-ld用于处理可执行程序和库的一些基本工具。例如arm-linux-strip嵌入式Linux开发环境GNU交叉工具链的下载ARM官方网站下载://ftp.arm.linux.org.uk/pub/armlinux/toolchain/cross-3.2.tar.bz2嵌入式Linux开发环境cross-2.95.3.tar.bz2包的安装:1.mkdir/usr/local/arm2.cpcross-2.95.3.tar.bz2/usr/local/arm3.tarzxvfcross-2.95.3.tar.bz24.添加环境变量在文件/etc/bashrc文件最后添加:exportPATH=/usr/local/arm/2.95.3/bin:$PATH5.工具链安装完成。嵌入式Linux开发环境GNU交叉工具链的常用工具介绍嵌入式Linux开发环境主要工具的使用arm-linux-gcc的使用arm-linux-gcc–ohellohello.carm-linux-ar和arm-linux-ranlib的使用建立一个静态库arm-linux-ar–rlibhello.ah1.oh2.o为静态库建立索引arm-linux-ar–slibhello.aarm-linux-ranliblibhello.a由静态库产生可执行文件arm-linux-gcc-ohellohello.c–lhello–L./arm-linux-gcc-ohellohello.clibhello.a嵌入式Linux开发环境主要工具的使用arm-linux-strip的使用移除所有的符号信息--strip-allCphellohello1arm-linux-strip-strip-allhello-rwxr-xr-x1armroot28567月315:14hello-rwxr-xr-x1armroot136827月315:13hello1被strip后的hello程序比原来的hello1程序要小很多。移除调试符号信息-garm-linux-strip-ghello-rwxr-xr-x1armroot45017月315:17hello-rwxr-xr-x1armroot136827月315:13hello1远程访问目标板如何观察应用程序在目标板的运行情况,即查看程序的输出信息?通过串口线连接宿主机和目标板。配置串口做为目标板的输出设备。例如在交叉编译目标板的linux内核时,配置指定终端为串口:noinitrdroot=/dev/mtdblock2init=/linuxrcconsole=ttyS0,115200在宿主机上通过串口通信软件查看目标板系统的运行情况。远程访问目标板超级终端的使用打开超级终端超级终端程序通常位于附件中的通讯中,“Hypertrm”图标所指即是超级终端程序。为新的连接取一个名字远程访问目标板超级终端的使用选择连接目标板的串口远程访问目标板超级终端的使用设置串口注意必须选择无流控制,否则只能看到输出而不能输入。串口波特率是11520远程访问目标板超级终端的使用当所有的连接参数都设置好以后,打开目标板电源开关,就会看到系统的启动信息,当Linux启动以后,超级终端就相当于虚拟终端,可通过它来操作目标板。选择超级终端“文件”菜单下的“另存为…”,保存该连接设置,以便于以后再连接时就不必重新执行以上设置了远程访问目标板超级终端的使用打开目标板电源开关,就会看到系统的启动信息,当Linux启动以后,超级终端就相当于虚拟终端,可通过它来操作目标板。远程访问目标板minicom的使用minicom的设置:minicom-s远程访问目标板minicom的使用选择串口选择菜单中的“Serialportsetup”,按回车,进入如下图所示界面。按“A”以设置“SerialDevice”(串口1-/dev/ttyS0,串口2-/dev/ttyS1)远程访问目标板minicom的使用设置波特率按“E”键进入设置“bps/par/Bits”(波特率)界面。再按“I”以设置波特率为115200。远程访问目标板minicom的使用设置无流控制按回车退回到上一级菜单,按“F”键设置“HardwareFlowControl”为“NO”,其他选项使用缺省值。远程访问目标板minicom的使用保存设置再选择“Exit”退出设置模式。刚才的设置被保存到“/etc/minirc.dfl”。设置完毕打开目标板电源的电源开关,minicom输出目标板的启动信息,当Linux启动以后,minicom就相当于虚拟终端,可通过它来操作目标板。远程访问目标板minicom的使用退出minicom同时按下“Ctrl+A”键,紧接着再按下“Q”键,在跳出的窗口中,选择“Yes”。下载程序映象到目标板通过串口下载使用三星公司的DNW软件。设置波特率115200、端口号、下载地址0x30200000上电启动开发板,进入BIOS界面选择2串口下载点击“serialport”菜单,选择“Transmit”选项下载程序映象到目标板通过usb下载同样使用三星公司的DNW软件。设置波特率115200、端口号、下载地址0x30200000上电启动开发板,进入BIOS界面接上USBDEVICE的连接线,选择“0”,选择USB下载,注意用USB下载要先在PC端装好驱动程序,保证USB连接好。有时PC端出现发现无法识别的USB设时,可在BIOS中输入ESC取消下载,等几秒钟再输入“0”启动USB下载。出现“NowUSBisconnected”说明USB正确枚举。点击“USBPort””Transmit”选项。下载程序映象到目标板通过TFTP方式下载TFTP协议是简单的文件传输协议,适合目标板Bootloader的使用。(u-boot、vivi)TFTP文件传输基于UDP。通过TFTP来传输目标板启动需要的内核映象文件zImage传输速度快,使用方便。下载程序映象到目标板通过TFTP方式下载tftp分服务器和客户端。在宿主机开启tftp服务,设置好tftp的根目录内容在目标板开启tftp客户端程序。在目标板的bootloader交互节目中通过tftpboot命令下载内核。tftpboot0x30200000zImage下载程序映象到目标板通过TFTP方式下载Linux的tftp服务器的配置编辑/etc/xinetd.d/tftp,只有在安装了tftp服务后,才会出现tftp文件。修改其中disable和server_args项,其余可保持不变。Servicetftp{sockettype=dgramprotocol=udpwait=yesuser=rootserver=/usr/sbin/in.tftpdserver_args=-s/tftpboot--设置tftp服务输出目录。disable=no--默认为yes,应修改成noper_source=11cps=1002flags=IPv4}下载程序映象到目标板通过TFTP方式下载重启xinetd服务,使得更改的配置有效Servicexinetdrestart确认tftp服务是否已经开启netstat-au在目标板启动tftp客户端程序tftpboot0x30200000zImage下载信息:TFTPfromserver10.0.0.1;ourIPaddressis10.0.0.110Filename'zImage'.Loadaddress:0x30200000Loading:#################################################################################################################################################################doneBytestransferred=913880(df1d8hex)下载程序映象到目标板通过挂载NFS方式下载NFS服务就是将宿主机的一个目录通过网络可以被挂载到其他计算机上,并且作为其他计算机的一个目录。在嵌入式开发中,通过NFS可以很方便的将修改的文件通过NFS传输到目标板上。不用反复烧写镜像文件。下载程序映象到目标板通过挂载NFS方式下载NFS的使用分服务器端和客户端服务器端提供要共享的文件,客户端通过挂载“mount”实现对共享文件的访问操作。mount192.168.0.1:/home/nfs/tmp/testNFS服务器端通过读取配置文件/etc/exports决定所共享的文件目录。配置文件的语法:每一行由输出路径,客户名列表以及每个客户名后紧跟的访问选项构成:[共享的目录][主机名或IP(参数,参数)][共享的目录][IP1(参数1,参数2)][IP2(参数3,参数4)]下载程序映象到目标板通过挂载NFS方式下载重启NFS服务:servicenfsrestart通过sho