版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、2013/01OMAP35xx(EL-ARM860)嵌入式系统实践教程嵌入式系统实践教程 刘彦文刘彦文()说明:本教程可作为EL-ARM860实验平台实验内容讲授使用。授课可使用刘彦文编著,清华大学出版社出版的嵌入式系统原理及接口技术教材。第3章 主机开发环境配置 n虽然Linux编程环境能够支持众多编程语言,例如C、C+、Java、Perl、Python、Ada、Forth、Lisp、Fortran等等,但是目前最常用的是C语言。n本章主要描述了使用C语言编程时,主机开发环境的跨平台工具链的安装。n另外目标板在运行程序时,使用到网口和串行端口,因此需要事先对主机Linux环境网络和串行端口进
2、行配置。3.1 交叉开发平台基础3.1.1 本地开发及交叉开发 本地开发n本地开发(native development)也称本机开发,指的是在主机某种操作系统下对源程序进行编译、链接,产生的可执行文件仍然能够在相同的主机和相同的操作系统下运行。nLinux系统支持本地开发的软件,主要指编译器及C程序库等,它们通常包含在Linux发行套件中,主机安装Linux系统时,会同时将其安装在硬盘。 交叉开发n交叉开发(cross development)主要是指,在主机编译源程序并构建能够在目标板上运行的可执行文件的过程,并且主机、目标板处理器架构应该是不同的。n例如在PC机对源程序进行编译、链接,并
3、且产生可以在基于ARM处理器架构的目标板上运行的文件的过程。这里通常主机和目标板运行的应该是相同的操作系统,如Linux。n交叉开发过程中,在主机输入源程序、编译、链接,仅仅在目标板上运行程序,主要原因是目标板上硬件资源少,缺少键盘、显示器、硬盘;内存容量比较小;处理器速度比较慢。 3.1.2GNU跨平台工具链组成n跨平台工具链(cross-platform toolchain)经常被简写为交叉工具链(cross toolchain),或者就称为工具链(toolchain)。本书中出现的工具链一词,通常指的是跨平台工具链,有时也称为交叉编译器。Linux使用的工具链的大部分组件来自GNU项目。
4、n工具链通常包含以下二进制(可执行文件)工具程序:预处理器、链接器、汇编器、打包器(archiver)、C(或其他语言的)编译器,以及C程序库与它的头文件。n其中,C程序库与它的头文件是一种共享程序库,其行为有如内含“原始Linux内核API”的打包程序,而且在Linux系统中执行的任何应用程序几乎都会用到它。3.1.3 如何获取工具链根据自己的开发环境,通过以下4种途径可以获得工具链:n购买一个商业版的工具链。n网上下载一个免费的工具链。n购买目标板时,附带的光盘上通常会带有一个工具链。n网上下载组成工具链的源代码,使用工具自行创建一个工具链。 购买目标板所附带的工具链,是大多数用户最常使用
5、的工具链,使用时要安装到主机Linux系统下。3.1.4 工具链的组件及GDB简介 工具链组件简介 GCC编译器集nGCC(GNU Compiler Collection,GNU编译器集)并不仅仅是个C编译器,它是一个GNU编译器集,能够支持对C、C+、Objective C、Java、Fortran(F77)以及Ada语言的编译。n可以对GCC进行配置,使GCC能够为不同的目标处理器生成代码,使之成为一个交叉编译器。目前GCC支持的处理器体系结构有40余种,常见的有x86、ARM、PowerPC等。GCC除了能够在Linux环境下运行,还可以在Windows下运行。nGCC是一个能够控制很多
6、其他工具的前端软件,被控制的工具在编译过程中会使用到,如cpp预处理器、C编译器、汇编器、链接器等。 GNU binutils 工具链的另一个重要的组件是GNU binutils套件,此套件中含有两个重要的工具程序,GNU汇编器as以及GNU链接器ld。此外还有10多个工具程序,如ranlib是为archive(静态程序库)的内容产生索引、strip是用于去除目标文件中的符号,等等。 标准C程序库 Linux用到的标准C程序库就是GNU C程序库,常被写作glibc。glibc是一个可移植、高性能的C程序库,支持所有相关标准(ISO C 99、POSIX.1c、POSIX.lj、POSIX.1
7、d、Unix98以及Single Unix Specification)。 线程程序库 Linux内核2.6版之前对线程的支持非常有限。Linux 2.6系列随附了一个新的线程实验品,称为New POSIX Threading Library,即新的POSIX线程库NPTL。NPTL所依靠的是Linux内核对线程新的支持。NPTL被当作glibc新近版本的一部分对外发布。 Linux内核头文件 工具链中会用到某一版本的Linux内核头文件,目的是支持程序员编程中使用到的对Linux内核的系统调用。构建工具链用到的Linux内核文件,应该与目标板上使用的Linux内核,来自相同的版本。 GDB简
8、介nGDB(GNU Debugger)通常不包括在工具链中,是一个Linux上最常用的调试器工具。nGDB需要进行编译,使之能够调试运行在目标板处理器上的代码。调试器本身运行在主机,能够对目标板上的代码进行调试,被称为远程调试。n运行被调试的程序时,目标板上同时还要运行一个占位程序,占位程序通常是gdbserver,通过串口或网口连接,负责与运行在主机上的GDB调试程序进行通信。3.2 交叉工具链安装举例n通常购买目标板时会随附一张光盘,光盘上不同目录下可能会有支持Linux、Windows CE和C/OS系统的程序。工具链安装到主机的方法有两种:n一种是在主机运行Linux系统时,进入光盘中
9、与Linux相关的目录,启动install.sh安装脚本程序,系统会自动将交叉工具链(包含相关库)安装到主机硬盘指定的目录。另外光盘上还可能有一些实验例程,将会一同被安装到主机硬盘指定的目录。n另一种是手工安装,例如输入命令将光盘工具链压缩包拷贝到主机Linux指定目录、输入命令解压缩并安装到指定目录。n以下将交叉工具链称为交叉编译器,安装过程针对EL-ARM860教学实验系统。n要安装的交叉编译器压缩包文档名为:narm-2007q3-51-arm-none-linux-gnueabi-i686.tar.bzn假定主机在Windows环境下已经安装了虚拟机及Red Hat Enterpris
10、e Linux 5操作系统。 n交叉编译器可以从光盘或U盘拷贝到Linux的/usr/local子目录下,然后在该子目录下建立arm子目录,交叉编译器解压缩后存放在/usr/local/arm子目录下。n安装、解压缩交叉编译器后,要在/root/.bashrc文件中增加路径环境变量,并重启这个文件,之后系统就能够在指定路径下自动找到该交叉编译器,而不用每次使用时都要指出其绝对路径。3.2.1 交叉工具链安装举例 从光盘将交叉编译器拷贝到/usr/local子目录n假定交叉编译器在光盘如下子目录:/OMAP3530/软件目录/tools/。n启动虚拟机、运行Linux后,光驱中插入对应光盘,在虚
11、拟机窗口右下,点击光盘图标,点击Connect菜单条,在Linux图形桌面点击光盘图标,查找并选择交叉编译器arm-2007q3-51-arm-none-linux-gnueabi-i686.tar.bz,选择复制菜单条,如图3.1所示。图3.1 选择光盘中的交叉编译器n然后在Linux图形桌面环境,在/usr/local子目录,点击鼠标右键,选择“粘贴1个URL”,交叉编译器将会粘贴到该子目录,如图3.2所示。图3.2 粘贴交叉编译器 从U盘将交叉编译器拷贝到/usr/local子目录 如果交叉编译器在U盘,可以使用如下方法。n同样先启动虚拟机、运行Linux,然后在Windows窗口,选择
12、U盘中的交叉编译器文件,选择复制菜单,如图3.3所示。n然后将该文件粘贴到Linux的/usr/local子目录。n图3.3 选择U盘中的交叉编译器 建立/usr/local/arm子目录并解压缩交叉编译器n在Linux终端窗口输入如下命令,将建立/usr/local/arm子目录,然后将交叉编译器解压缩到该子目录下。n要求启动Linux时,以root用户名登录。 rootlocalhost local# mkdir /usr/local/arm rootlocalhost local# tar xvjf arm-2007q3-51-arm-none-linux-gnueabi- i686.t
13、ar.bz -C /usr/local/armn解压缩后的代码分6个子目录保存,可以用如下命令查看。rootlocalhost local# cd /usr/local/armrootlocalhost arm# ls -l总计 8drwxr-xr-x 8 root root 4096 12-25 10:30 arm-2007q3rootlocalhost arm#rootlocalhost arm# cd arm-2007q3rootlocalhost arm-2007q3# ls -l总计 48drwxrwxr-x 6 root root 4096 2007-09-28 arm-none-
14、linux-gnueabidrwxr-xr-x 2 root root 4096 2007-09-28 bindrwxrwxr-x 2 root root 4096 2007-09-28 includedrwxrwxr-x 3 root root 4096 2007-09-28 libdrwxrwxr-x 4 root root 4096 2007-09-28 libexecdrwxrwxr-x 3 root root 4096 2007-09-28 share3.2.2 对查找工具链的路径变量进行修改 安装了交叉编译器后,需要修改/root/.bashrc文件内容,应该在这个文件中增加一行语
15、句,指出交叉编译器所在的路径。之后每当打开终端窗口时,Linux自动运行/root/.bashrc文件,给出缺省路径名的交叉编译器的查找路径。 在/root/.bashrc文件中增加语句n可以用如下命令检查原来的路径变量值: rootlocalhost local# echo $PATH /usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/binn然后用vi增加一行语句:
16、rootlocalhost local# vi /root/.bashrcexport PATH=/usr/local/arm/arm-2007q3/bin:$PATHnvi是一个文本编辑程序,如同Windows下的记事本。进入vi后,输入“a”或“i”即进到插入状态。输入Esc、Esc、:、w、q、!键后,保存文件并退出vi程序。 重启/root/.bashrc文件n可以使用source命令重启/root/.bashrc文件,然后系统才能修改查找路径: rootlocalhost # source /root/.bashrcn如果不使用source命令重启文件,也可以用exit命令关闭终端窗
17、口,然后再次打开终端窗口,打开终端窗口过程中系统会自动启动/root/.bashrc文件。 检查新的路径变量值n用echo命令可以检查新的路径变量值: rootlocalhost # echo $PATH /usr/local/arm/arm-2007q3/bin:/usr/lib/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin3.3 主机Linux环境网络配置举例3.3.1
18、主机Linux环境IP地址设置 主机Linux环境IP地址设置简介n主机Linux环境IP地址,应该与目标板Linux的IP地址4个分组中的前3组完全相同,只允许最后一组不同。n例如,目标板Linux的IP地址如果为192.168.1.9,那么主机IP地址前3组必须设置为192.168.1,最后一组可以是1253中的一个数字。n以下例子中,假定主机IP地址设置为192.168.1.5。 主机Linux环境IP地址设置方法 常用的方法有两种:n一种是根据目标板Linux IP地址,设置主机Linux IP地址。这种方法需要先查询目标板Linux IP地址,如果目标板还没有设置过IP地址,应该先进
19、行设置。n另一种是保留主机Linux IP地址不变,根据这个地址设置目标板的IP地址。 目标板IP地址配置、检查n如果目标板Linux IP地址还没有配置,那么在minicom窗口输入ifconfig命令之后,没有任何输出信息: rootTechv_OMAP35xx:# ifconfig rootTechv_OMAP35xx:#n这时应该对目标板Linux IP地址进行配置,假定配置为192.168.1.9,输入命令和参数,回车后显示: rootTechv_OMAP35xx:# ifconfig eth0 192.168.1.9 eth0: link down rootTechv_OMAP35
20、xx:# eth0: link up, 100Mbps, full-duplex1然后输入ifconfig命令,检查配置情况:rootTechv_OMAP35xx:# ifconfig eth0 Link encap:Ethernet HWaddr 00:00:AA:BB:CC:DD inet addr:192.168.1.9 Bcast:192.168.1.255 Mask0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric1 RX packets:4 errors:0 dropped:0 overruns:0 frame0 TX packets:
21、0 errors:0 dropped:0 overruns:0 carri0 collisions:0 txqueuelen:1000 RX bytes:1392 (1.3 KiB) TX bytes:0 (0.0 B) Interrupt:81 DMA chan:ffn用上述方法配置的目标板Linux IP地址,没有保留在目标板的外部存储器。目标板关机或RESET后丢失,下一次使用还需要重新配置。 主机Linux IP地址配置、检查n在主机终端窗口,输入ifconfig eth0 192.168.1.5,将IP地址配置为192.168.1.5。 rootlocalhost # ifconfi
22、g eth0 192.168.1.5n然后用ifconfig命令检查配置的参数: rootlocalhost # ifconfigeth0 Link encap:Ethernet HWaddr 00:0C:29:5E:89:68 inet addr:192.168.1.5 Bcast:192.168.1.255 Mask:255.255.255.0 inet6 addr: fe80:20c:29ff:fe5e:8968/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:19403 errors:0
23、 dropped:0 overruns:0 frame:0 TX packets:38 errors:0 dropped:0 overruns:0 carrier:0n主机Linux IP地址配置后的值,保存到外设,主机Linux在虚拟机中用挂起方式退出、关机后,再次启动仍保留以前配置过的值,直到下一次配置新的地址为止。如果主机Linux在虚拟机中以power off方式退出,再次以power on方式启动运行Linux后,保存的IP地址丢失,需要重新配置。3.3.2 主机Linux环境网络防火墙设置 设置方法:n在主机Linux终端窗口,输入setup命令并回车,然后在弹出的菜单中选择“防火
24、墙配置(Firewall configuration)”见图3.4,回车。图3.4 选择配置防火墙n之后在弹出的界面中用光标移动键选择“禁用”防火墙,选择“确定”后回车,退出设置,见图3.5。图3.5 选择禁用防火墙n另一种设置方法是:在主机Linux图形桌面,点击“红帽子”“安全级别和防火墙”,在弹出的窗口选择禁用防火墙,如图3.6所示。图3.6 在图形桌面设置禁用防火墙3.3.3 主机与目标板网络通信测试 在主机终端窗口用命令测试主机与目标板的通信n在主机Linux终端窗口,输入ping命令,后面跟随目标板IP地址,例如:nrootlocalhost /# ping 192.168.1.9
25、n可以用Ctrl+c键去终止ping命令。PING 192.168.1.9 (192.168.1.9) 56(84) bytes of data.64 bytes from 192.168.1.9: icmp_seq=1 ttl=64 time=0.792 ms64 bytes from 192.168.1.9: icmp_seq=2 ttl=64 time=0.278 ms64 bytes from 192.168.1.9: icmp_seq=3 ttl=64 time=0.531 ms64 bytes from 192.168.1.9: icmp_seq=4 ttl=64 time=0.3
26、35 ms- 192.168.1.9 ping statistics -4 packets transmitted, 4 received, 0% packet loss, time 2999msrtt min/avg/max/mdev = 0.278/0.484/0.792/0.201 ms 在目标板终端窗口用命令测试目标板与主机的通信n在目标板终端窗口(输入minicom后的窗口),输入ping命令,后面跟随主机IP地址,例如: rootTechv_OMAP35xx:# ping 192.168.1.5PING 192.168.1.5 (192.168.1.5): 56 data byte
27、s64 bytes from 192.168.1.5: seq=0 ttl=64 time=8.484 ms64 bytes from 192.168.1.5: seq=1 ttl=64 time=0.489 ms64 bytes from 192.168.1.5: seq=2 ttl=64 time=0.458 ms.- 192.168.1.5 ping statistics -3 packets transmitted, 3 packets received, 0% packet lossround-trip min/avg/max = 0.458/3.143/8.484 ms ping命
28、令测试提示的错误信息n如果网络不通,系统会产生Unreachable(不可到达)提示信息,这时要检查:网络防火墙设置是否正确,因为防火墙不允许ICMP流量通过;网口电缆与接口是否正确连接;ping命令中的IP地址是否为正确地址;测试命令和IP地址是否在正确的终端窗口输入。3.3.4 主机Linux环境NFS设置 NFS简述nNFS(Network File System,网络文件系统)协议,允许在一组通过网络互联的计算机中,计算机A的某个存储位置(导出),能够被计算机B使用。n例如,嵌入式Linux开发环境中,主机与目标板通过网口连接,且已经根据前几节设置了主机IP地址、防火墙,测试网络通信正
29、常,那么通过对主机NFS设置,并且目标板执行相应的mount挂接命令后,目标板就能够通过网口,把主机的指定目录(导出),连接到目标板直接使用。当然前提是目标板Linux内核配置时,允许使用NFS。nNFS协议通过网口的连接,把主机导出目录的文件,连接到目标板的指定目录,目标板可以像使用本地文件一样,使用这些文件。 主机NFS设置 选择NFS服务n一种设置方法是,选择:红帽子服务,在弹出的服务窗口用光标选择nfs服务,见图3.7。n同时还要选择去掉iptables服务。n然后关闭该窗口。图3.7 选择主机Linux允许NFS服务n另一种设置方法是,在主机终端窗口,输入setup命令,在弹出的窗口
30、中选择“系统服务”并回车,然后用光标键上、下移动,用空格键选中nfs服务,见图3.8,然后去掉iptables服务,最后用F12键退出。图3.8 另一种方法选择主机Linux允许NFS服务 设置主机NFS导出目录及读写权限n除了要设置主机Linux允许NFS服务外,还要指定主机的哪些目录作为NFS区域,即导出目录,同时要指定该目录允许的读写权限。n设置方法是用vi编辑器打开/etc/exports文件:rootlocalhost # vi /etc/exportsn将其内容修改为:/ *(rw)/home/nfs1 *(rw)n然后保存、退出。 启动NFS设置n通过以下命令,按新的设置重启NF
31、S:rootlocalhost # /etc/init.d/nfs restart 查看NFS配置文件n可以用vi查看/etc/exports文件:rootlocalhost # vi /etc/exports/ *(rw)/home/nfs1 *(rw) 将主机/home/nfs1目录挂接为目标板/tmp目录n此处所谓挂接指的是,在目标板对应的终端窗口,使用mount命令,执行NFS协议的挂接。 挂接前主机建立/home/nfs1子目录 rootlocalhost /# mkdir /home/nfs1n然后进入/home/nfs1子目录,用vi建立一个文件,文件名为abc,文件内容可以随意
32、输入并保存。建立这个文件目的是在挂接后能够从目标板看到主机/home/nfs1下的这个文件。rootlocalhost /# cd /home/nfs1rootlocalhost nfs1# vi abcrootlocalhost nfs1# ls -l总计 4-rw-r-r- 1 root root 10 01-09 10:15 abc 在目标板对应终端窗口,执行挂接命令 rootTechv_OMAP35xx:/# mount -o soft,nolock,rsize=1024 -v 192.168.1.5:/home/nfs1 /tmpn上述命令中的参数192.168.1.5:/home/
33、nfs1是主机IP地址及导出目录,参数/tmp是目标板目录,挂接成功后,查看目标板/tmp目录,相当于查看主机/home/nfs1目录。 挂接后目标板/tmp目录列表 rootTechv_OMAP35xx:/# cd /tmp rootTechv_OMAP35xx:/var/volatile/tmp# ls -l -rw-r-r- 1 root root 10 Jan 9 2013 abcn另外,一次挂接成功,NFS挂接有效保持到目标板RESET或关机为止,每次开机或RESET后都要重新挂接。3.4 输入、编译、运行一个程序 全过程举例n假定要在主机/home/nfs1目录下,建立一个子目录h
34、ello,在该子目录下建立一个hello.c文件、建立一个Makefile文件,然后在主机编译hello.c文件,产生可执行文件hello,在目标板执行该文件,执行这些操作的全过程及相关文件的内容如下所示。n下述操作中,在主机Linux终端窗口输入minicom后,这个窗口成为目标板终端窗口,然后挂接NFS;n操作中,命令是在目标板终端窗口输入的;n其余操作、均在主机Linux终端窗口进行;n而和表示要输入的文件的内容。 建立hello目录,进入hello目录rootlocalhost nfs1# mkdir /home/nfs1/hellorootlocalhost nfs1# cd /ho
35、me/nfs1/hello 用vi编辑程序建立hello.c源文件rootlocalhost hello# vi hello.c hello.c文件内容为#include #include int main(int argc, char *argv) printf(Hello Reader,Congradulations!n); return(0); 建立Makefile文件rootlocalhost hello# vi Makefile Makefile文件内容为CC = /usr/local/arm/arm-2007q3/bin/arm-none-linux-gnueabi-gccall:
36、 $(CC) -o hello hello.cclean: -rm -f *.o hellon输入上述代码后,保存文件并退出。n上述Makefile文件内容中: CC 表示主编译器 all: 表示主入口 clean:表示清除以前编译产生的结果另外,语句“$(CC) -o hello hello.c”和“-rm -f *.o hello”,前面有一个制表符Tab,不是空格。 在目标板终端窗口挂接NFSn如果没有挂接NFS,则需要挂接。# mount -o soft,nolock,rsize=1024 -v 192.168.1.5:/home/nfs1 /tmp 在主机终端窗口对hello.c文件进行编
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 外聘融资顾问合同范本
- 塑料滑梯销售合同范本
- 园林盆景购销合同范本
- 园艺造景服务合同范本
- 土地流转解除合同范本
- 地产佣金返还合同范本
- 回收废旧物资合同范本
- 国外展会参展合同范本
- 幼儿园消防安全课件
- 绿色校园植树节活动方案
- 冻干车间配液岗位操作规程
- 《工程伦理学》配套教学课件
- 公共管理英语 第一篇 教学内容 (15)课件
- 初中数学北师大八年级上册 一次函数一次函数与三角形面积 -平行线转移法王思利
- IQC来料检验规范
- 打破自我标签重新定义自己课件-高中心理健康教育
- 工程力学ppt课件(完整版)
- 建筑灭火器配置缺陷项分类及验收报告
- 幼儿园绘本故事:《妈妈买绿豆》 PPT课件
- 当代大学德语3课后习题答案
- JavaScript基础知识完整版.ppt课件
评论
0/150
提交评论