《ARM Cortex-A9多核嵌入式系统开发教程》课件第四章_第1页
《ARM Cortex-A9多核嵌入式系统开发教程》课件第四章_第2页
《ARM Cortex-A9多核嵌入式系统开发教程》课件第四章_第3页
《ARM Cortex-A9多核嵌入式系统开发教程》课件第四章_第4页
《ARM Cortex-A9多核嵌入式系统开发教程》课件第四章_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

构建嵌入式开发环境4主机与目标板结合的交叉开发模式建立主机开发的软件环境建立交叉编译工具链Makefile介绍第4章构建嵌入式开发环境4.1交叉开发模式

对于嵌入式开发,最初的嵌入式设备是一个空白的系统,需要通过主机为它构建基本的软件系统,并烧写到设备中。另外,嵌入式设备的资源并不足以用来开发软件,所以需要用到交叉开发模式:在主机上编写、编辑、编译软件和应用程序,然后下载到目标板上,在目标板上运行、验证程序。主机又称宿主机,一般为PC;目标板指正在开发的嵌入式设备或者ARM开发板。图4.1PC系统和嵌入式Linux系统结构对比第4章构建嵌入式开发环境

嵌入式系统软件主要包括:Bootloader、Linux内核和根文件系统(包含各种应用程序)。对于嵌入式开发,主要包括以下几个方面:(1)在主机上编译Bootloader,烧入目标板。(2)在主机上编译Linux内核,通过Bootloader烧入目标板或直接启动。(3)在主机上编译各类应用程序,目标板启动内核后通过NFS运行它们,经过验证后烧入目标板。

在交叉开发模式中,主机与目标板通常有4种连接方式:JTAG、串口、USB、网络。第4章构建嵌入式开发环境4.2建立主机开发的软件环境对于嵌入式开发,主要的就是在主机上开发工作,然后放到目标板上运行验证。通过主机上的软件可以编译内核和开发嵌入式系统中运行的软件。安装软件的过程主要包括:安装宿主机上的Linux操作系统;配置与安装宿主机操作系统下的串口通信工具Minicom、TFTP服务、NFS(NetworkFileSystem,网络文件系统),建立交叉编译工具链。第4章构建嵌入式开发环境4.2.1主机Linux操作系统的安装1.在Windows上安装虚拟机VMware2.

Fedora的安装Fedora(第七版以前为FedoraCore)是一款基于Linux的操作系统,也是一组维持计算机正常运行的软件集合。Fedora由FedoraProject社区开发、红帽公司赞助,目标是创建一套新颖、多功能并且自由和开源的操作系统。第4章构建嵌入式开发环境4.2.2Minicom的安装配置 Minicom是Linux操作系统或者基于Linux操作系统下的一款串口通信软件,在嵌入式开发领域应用十分广泛。Minicom的配置过程如下:(1)先检查宿主机的VMware上是否已经添加了串口(serialport)设备。(2)再次启动Linux之后,注意右下角有一个圆圆的图标,把鼠标放在上面会显示串口信息。(3)对Minicom配置主要是配置串行口、波特率和是否使用流控制技术。(4)借助一些命令来使用Minicom。第4章构建嵌入式开发环境4.2.3TFTP服务的安装配置 TFTP是基于UDP协议实现的,用来下载远程文件的最简单网络协议。TFTP分为服务器程序和客户端程序,在主机上通常同时配置TFTP服务器端和客户端。

嵌入式Linux的TFTP开发环境包括两个方面:一是Linux服务器端的tftp-server支持,二是嵌入式目标系统的tftp-client支持。因为U-Boot本身内置支持tftp-client,所以嵌入式目标系统端就不用配置了。第4章构建嵌入式开发环境TFTP服务的安装配置过程如下:(1)先安装xinetd服务,命令如下: yuminstallxinetd(2)安装xinetd完成后,安装TFTP的客户端和服务器端,命令如下: yuminstalltftp yuminstalltftp-server(3)对TFTP服务器进行配置。把/etc/xinetd.d/tftp.rpmnew复制并改名为/etc/xinetd.d/tftp,命令如下: cp /etc/xinetd.d/tftp.rpmnew /etc/xinetd.d/tftp第4章构建嵌入式开发环境(4)打开 /etc/xinetd.d/tftp文件,并修改其中的某些内容。① disable=yes改为disable=no;②修改user的值,不使用root用户;③修改server_args的行为,将server_args=-s/var/lib/tftpboot改为server_args = -s/tftpboot/-c;④修改 /etc/sysconfig/selinux文件:SELINUX=disabled(系统默认是enforcing,改成disabled);chmod777/tftpboot修改/tftpboot文件夹的权限。至此,TFTP服务已经配置完成。第4章构建嵌入式开发环境4.2.4NFS的安装配置 NFS(NetworkFileSystem,网络文件系统)类似于Windows中的文件共享服务。它的最大特点是可以让网络上不同的机器、不同的操作系统之间彼此共享文件,所以它可以看作一个简单的文件服务器。第4章构建嵌入式开发环境

在NFS服务中,主机是被挂载(mount)端,为远端客户机提供可以访问的共享文件。主机需要配置两方面内容:即设置NFS服务和允许“指定的NFS用户”使用。其具体步骤如下:设置NFS服务。指定NFS服务的用户。在客户机端挂接共享目录。

①进入Minicom终端界面。[root@localhostroot]#

minicom

②设置开发板的IP地址。[root@localhostroot]#

ifconfigetho6

③挂载共享目录。[root@localhostroot]#mount-osoft,timeo=100,rsize=1024:/linux_nfs/mnt第4章构建嵌入式开发环境4.3建立交叉编译工具链

源文件需要经过编译才能生成可执行文件。在Windows下进行开发时,集成开发环境已经将各种编译工具的使用封装好了,只需要点几个按钮即可完成编译。Linux下也有很优秀的集成开发工具,比如gcc、ld、objcopy、objdump等,它们编译出来的程序在x86平台上运行。要编译出能在ARM平台上运行的程序,必须使用交叉编译工具链arm-linux-gcc、arm-linux-ld等。第4章构建嵌入式开发环境4.3.1arm-linux-gcc选项通常,我们所说的“编译”涉及到四个过程,分别是:预处理。将程序中诸如“#include”、宏定义命令“#define”、条件编译命令“#if”、“#ifdef”等展开,输出到一个后缀为.i的文件里。所用到的工具为arm-linux-cpp。编译。把上述的.i的文件翻译成成汇编代码,所用到的工具为cc1。第4章构建嵌入式开发环境(3)汇编。汇编就是将第二步输出的汇编代码翻译成符合一定格式的机器代码。文件一般后缀为.obj,所用到的工具为arm-linux-as。(4)连接。连接就是将上一步生成的OBJ文件和系统库的OBJ文件、库文件连接起来,最终生成可以在特定平台运行的可执行文件,用到的工具是arm-linux-ld。第4章构建嵌入式开发环境例子:以下是一个打印“HelloWorld!”字符串的程序: #include<stdio.h> intmain(intargc,char*argv[ ]) { printf("HelloWorld!\n"); return0; }第4章构建嵌入式开发环境$arm-linux-gcc-ohellohello.ccc1hello.c-o/tmp/cctETob7.sas-o/tmp/ccvv2KbL.o/tmp/cctETob7.scollect2-ohellocrt1.ocrti.ocrtbegin.o/tmp/ccvv2KbL.ocrtend.ocrtn.old被collect2调用来连接程序cpp-ohello.ihello.ccc1hello.i-o/tmp/cctETob7.s编译过程示例:第4章构建嵌入式开发环境选项:1.总体选项(OverallOption)

-c:预处理、编译和汇编源文件,但是不作连接,编译器根据源文件生成OBJ文件。-S:编译后即停止,不进行汇编。

 -E:预处理后即停止,不进行编译。-ofile:指定输出文件为file。 -v:显示制作GCC工具自身时的配置命令;同时显示编译器驱动程序、预处理器、编译器的版本号。第4章构建嵌入式开发环境2.警告选项(WarningOption)-Wall:该选项基本打开了所有需要注意的警告信息,比如没有指定类型的声明、在声明之前就使用的函数、局部变量除了声明就没再使用等。

警告虽然对程序没有坏的影响,但是有些警告需要加以关注,比如类型匹配的警告等。第4章构建嵌入式开发环境3.调试选项(DebuggingOption)-g:以操作系统的本地格式(stabs、COFF、XCOFF或DWARF)产生调试信息,GDB能够使用这些调试信息。在大多数使用stabs格式的系统上,“-g”选项加入只有GDB才使用的额外调试信息。可以使用下面的选项来生成额外的信息:-gstabs+、-gstabs、-gxcoff+、-gxcoff、-gdwarf+ 或 -gdwarf,具体用法请读者参考GCC手册。第4章构建嵌入式开发环境4.优化选项(OptimizationOption)(1)

-O或 -O1:对于大函数,优化编译的过程将占用较多的时间和相当大的内存。(2) -O2:多优化一些。这个选项既增加了编译时间,也提高了生成代码的运行效果。(3) -O3:优化得更多。(4)

-O0:不优化。第4章构建嵌入式开发环境5.目录选项(DirectoryOption)(1)在头文件的搜索路径列表中添加dir目录。

如果以“#include<>”包含文件,则只在标准库目录开始搜索(包括使用 -Idir选项定义的目录);如果以“#include"file"”包含文件,则先从用户的工作目录开始搜索,再搜索标准库目录。第4章构建嵌入式开发环境5.目录选项(DirectoryOption)(2)-I-。任何在“-I-”前面用“-I”选项指定的搜索路径只适用于“-I”这种情况;它们不能用来搜索“#include<>”包含的头文件。(3)

-Ldir。在“-l”选项的搜索路径列表中添加dir目录。第4章构建嵌入式开发环境4.3.2arm-linux-ld选项arm-linux-ld用于将多个目标文件、库文件连接成可执行文件。直接指定代码段、数据段、bss段的起始地址

直接指定代码段、数据段、bss段的起始地址的格式如下:

-Ttext startaddr

-Tdata startaddr

-Tbss startaddr

其中,“startaddr”分别表示代码段、数据段和bss段的起始地址,它是一

个十六进制的数。第4章构建嵌入式开发环境2.使用连接脚本设置地址连接脚本timer.lds的含义:①第2行表示设置“当前运行地址”为0x30000000。②第3行定义了一个名为“.text”的段,它的内容为“*(.text)”,表示所有输入文件的代码段。这些代码段被集合在一起,起始运行地址为0x30000000。③第4行定义了一个名为“.rodata”的段,在输出文件timer_elf中,它紧挨着“.text”段存放。⑤第5、6行的含义与第4行类似。第4章构建嵌入式开发环境4.3.3arm-linux-objcopy选项常用arm-linux-objcopy来将ELF格式的可执行文件转换为二进制文件。 arm-linux-objcopy [-Fbfdname|--target=bfdname] [-Ibfdname|--input-target=bfdname] [-Obfdname|--output-target=bfdname] [-S|--strip-all][-g|--strip-debug] [-Ksymbolname|--keep-symbol=symbolname] [-Nsymbolname|--strip-symbol=symbolname] [-Lsymbolname|--localize-symbol=symbolname] [-Wsymbolname|--weaken-symbol=symbolname] [-x|--discard-all][-X|--discard-locals] [-bbyte|--byte=byte]第4章构建嵌入式开发环境[-iinterleave|--interleave=interleave][-Rsectionname|--remove-section=sectionname][-p|--preserve-dates][--debugging][--gap-fill=val][--pad-to=address][--set-start=val][--adjust-start=incr][--change-address=incr][--change-section-address=section{=,+,-}val][--change-warnings][--no-change-warnings][--set-section-flags=section=flags][--add-section=sectionname=filename][--change-leadingchar][--remove-leading-char][--weaken][-v|--verbose][-V|--version][--help]input-file[outfile第4章构建嵌入式开发环境常用的一些选项:

input-file、outfile:参数input-file和outfile分别表示输入目标文件(源目标文件)和输出目标文件(目的目标文件)。(2) -Ibfdname或 --input-target=bfdname:用来指明源文件的格式,bfdname是BFD库中描述的标准格式名。(3) -Obfdname或 --output-target=bfdname:使用指定的格式来输出文件,bfdname是BFD库中描述的标准格式名。第4章构建嵌入式开发环境常用的一些选项:(4) -Fbfdname或 --target=bfdname:同时指明源文件、目的文件的格式。(5) -Rsectionname或 --remove-section = sectionname:从输出文件中删掉所有名为sectionname的段。这个选项可以多次使用。(6) -S或 --strip-all:不从源文件中拷贝重定位信息和符号信息到目标文件中。(7) -g或 --strip-debug:不从源文件中拷贝调试符号到目标文件中。第4章构建嵌入式开发环境4.3.4arm-linux-objdump选项arm-linux-objdump用于显示二进制文件信息,本书中常用来查看反汇编代码。 arm-linux-objdump [-a][-bbfdname|--target=bfdname] [-C][--debugging] [-d][-D] [--disassemble-zeroes] [--file-headers|-f] [-EB|-EL|--endian={big|little}][-f] [-h][-i|--info] [-jsection|--section=name]

第4章构建嵌入式开发环境[-l][-mmachine][--prefix-addresses][-r][-R][-s|--full-contents][-S|--source][--[no-]show-raw-insn][--stabs][-t][-T][-x][--start-address=address][--stop-address=address][--adjust-vma=offset][--version][--help]objfile...第4章构建嵌入式开发环境常用的一些选项: -bbfdname或 --target=bfdname:指定目标码格式。这不是必需的,arm-linux-objdump能自动识别许多格式。(2)  --disassemble或 -d:反汇编可执行段(executablesections)。(3) --disassemble-all或 -D:与 -d类似,反汇编所有段。(4) -EB或 -EL或 --endian={big|little}:指定字节序。第4章构建嵌入式开发环境常用的一些选项:(5) --file-headers或 -f:显示文件的整体头部摘要信息。(6) --section-headers、--headers或 -h:显示目标文件各个段的头部摘要信息。(7) --info或 -i:显示支持的目标文件格式和CPU架构,它们在“-b”、“-m”选项中用到。(8) --section=name或 -jname:仅显示指定section的信息。(9) --architecture=machine或 -mmachine:指定反汇编目标文件时使用的架构。第4章构建嵌入式开发环境4.4Makefile介绍

一个工程中往往包括很多的源文件,如果一个一个进行编译,往往是很繁琐的,这时候makefile就起到了作用。makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作。因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是“自动化编译”。一旦写好了makefile文件,只需要一个make命令,整个工程便会完全自动进行编译,极大地提高了软件开发的效率。第4章构建嵌入式开发环境

所要完成的Makefile文件描述了整个工程的编译、连接等规则,其中包括:工程中的哪些源文件需要编译以及如何编译,需要创建哪些库文件以及如何创建这些库文件,如何最后产生想要的可执行文件。尽管看起来可能是很复杂的事情,但是为工程编写Makefile的好处是能够使用一行命令来完成“自动化编译”。一旦提供一个(通常对于一个工程来说会是多个)正确的Makefile,编译整个工程所要做的唯一的一件事就是在shell提示符下输入make命令。整个工程完全自动编译,极大地提高了效率。第4章构建嵌入式开发环境例如,一个makefile文件编译一个工程,其中:工程里包含3个头文件和8个C文件。 #sampleMakefile. edit:main.okbd.ocommand.odisplay.o\ insert.osearch.ofiles.outils.o cc-oeditmain.okbd.ocommand.odisplay.o\ insert.osearch.ofiles.outils.o main.o:main.cdefs.h cc-cmain.c kbd.o:kbd.cdefs.hcommand.h cc-ckbd.c command.o:command.cdefs.hcommand.h cc-ccommand.c第4章构建嵌入式开发环境display.o:display.cdefs.hbuffer.h cc-cdisplay.cinsert.o:insert.cdefs.hbuffer.h cc-cinsert.csearch.o:search.cdefs.hbuffer.h cc-csearch.cfiles.o:files.cdefs.hbuffer.hcommand.h cc-cfiles.cutils.o:utils.cdefs.h cc-cutils.cclean: rmeditmain.okbd.ocommand.odisplay.o\ insert.osearch.ofiles.outils.o第4章构建嵌入式开发环境4.4.1Makefile规则一个简单的Makefile文件包含一系列的“规则”,其样式如下:

目标(target)…:依赖(prerequisites)… <tab>命令(command)第4章构建嵌入式开发环境4.4.2Makefile文件里的赋值方法Makefile文件里,变量定义的语法形式如下: immediate=deferred immediate?=deferred immediate:=immediate immediate+=deferredorimmediate defineimmediate deferred endef第4章构建嵌入式开发环境

在GNUmake中对变量赋值有两种方式:延时变量和立即变量。区别在于它们的定义方式和扩展时的方式不同,前者在这个变量使用时才扩展开,后者在定义时它的值就已经确定了。第4章构建嵌入式开发环境4.4.3Makefile常用函数1.字符串替换和分析函数

$(substfrom,to,text):在文本“text”中使用“to”替换每一处“from”。 $(patsubstpattern,replacement,text):寻找“text”中符合格式“pattern”的字,用“replacement”替换它们。$(stripstring):去掉前导和结尾空格,并将中间的多个空格压缩为单个空格。第4章构建嵌入式开发环境(4)

$(findstringfind,in):在字符串“in”中搜寻“find”,如果找到,则返回值是“find”,否则返回值为空。(5)

$(filterpattern...,text):返回在“text”中由空格隔开且匹配格式“pattern...”的字,去除不符合格式“pattern...”的字。(6)

$(filter-outpattern...,text):返回在“text”中由空格隔开且不匹配格式

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论