第5章嵌入式软件设计
- 格式:pdf
- 大小:438.41 KB
- 文档页数:13
嵌入式信息系统讲义第5章嵌入式软件设计
Written by Zhou, BISTU
5-
1第5
章
嵌入式软件设计5.1 GNU
软件开发环境
5.3
引导加载程序
BootLoader5.4 Linux
内核移植
5.5 文件系统
<25.1 GNU软件开发环境
GNU开发环境的组成主要介绍:¾编译工具:gcc、arm-Linux-gcc(交叉编译)¾make 和makefile¾gdb
<3源程序词法分析语法分析语义分析生成中间代码优化代码错误处
理生成目标代码符号表及其管理
目标程序编译工具的基本结构
<45.1.1 GCC简介GCC(GNU Compiler Collection) 是在UNIX 以及类UNIX 平台上广泛使用的编译器集合,它能够支持多种语言前端,包括C, Objective-C, Ada, Fortran, Java 和treelang等。GCC 设计中有两个重要的目标,其中一个是在构建支持不同硬件平台的编译器时,它的代码能够最大程度的被复用,所以GCC 必须要做到一定程度的硬件无关性;另一个是要生成高质量的可执行代码,这就需要对代码进行集中的优化。为了实现这两个目标,GCC 内部使用了一种硬件平台无关的语言,它能对实际的体系结构做一种抽象,这个中间语言就是RTL(RegisterTransfer Language)。
<
5源码解析语法树的优化RTL代码生成函数调用优化转移指令优化寄存器扫描SAA(Static Single Assignment)优化公用子表达式削减二次公用子表达式优化数据流分析指令合并局部寄存器分配动循环语句优化指令时序调整
二次指令时序调整寄存器类优先级选择寄存器移动
基本块重新安排重载二次转移指令优化可延迟性分支时序安排多分支指令合并寄存器使用优化调试信息输出输出与程序对应的汇编语言程序用GCC编译程序流程
<6-ansi只支持ANSI 标准的C 语法。这一选项将禁止GNU C 的某些特色,例如asm或typeof关键词-c 只编译并生成目标文件-E 只运行C 预编译器-g 生成调试信息。GNU 调试器可利用该信息-o FILE 生成指定的输出文件。用在生成可执行文件时-O0 不进行优化处理-O 或-O1 优化生成代码-O2 进一步优化-O3 比-O2 更进一步优化,包括inline 函数-w 不生成任何警告信息-Wall 生成所有警告信息gcc常用选项
嵌入式信息系统讲义第5章嵌入式软件设计
Written by Zhou, BISTU
5-
<7交叉编译就是在一个处理器硬件平台上(通常为
x86
)编译可运行于另一个不同处理器硬件平台上的应用程序。也就
是有应用程序的源代码生成另一种机器码。
交叉编译工具用于在
PC
机Linux
环境下开发基于其它硬件
平台的应用程序。基于ARM的交叉编译工具在原来x86工具上加前缀arm-linux-,交叉编译工具本身也是x86应用程序,只是其生成的应用程序只可在ARM硬件平台上运行,即生成ARM指令。5.1.2交叉编译
<8名称归属作用arm-linux-asbinutils编译ARM汇编程序arm-linux-arbinutils把多个.o合并成一个.o或静态库(.a)arm-linux-ranlibbinutils为库文件建立索引,相当于arm-linux-ar-sarm-linux-ldbinutils连接器(Linker), 把多个.o或库文件连接成一个可执行文件arm-linux-objdumpbinutils查看目标文件(.o)和库(.a)的信息arm-linux-objcopybinutils转换可执行文件的格式arm-linux-stripbinutils去掉elf可执行文件的信息,使可执行文件变小arm-linux-readelfbinutils读elf可执行文件的信息arm-linux-gccgcc编译.c或.S开头的C程序或汇编程序arm-linux-g++gcc编译c++程序常用ARM交叉编译工具
<9GNU的所有开发工具都可以从ftp://ftp.gnu.org上下载,GNU的编译器功能非常强大,共有上百个操作选项,这也是这类工具让初学者头痛的原因,不过实际开发中只需要用到有限的几个,大部分可以采用缺省选项。基于ARM和Linux的GNU
工具源代码可以从http://kegel.com/crosstool/获得。要得到x86二进制的编译工具,还需要用gcc编译源代码生成。实验中建立开发环境只需在Linux环境下运行博创公司提供的交叉编译工具安装脚本install.sh即可完成开发工具的安装和配置。开发工具的获取和安装
<101、下载源代码:ftp://ftp.gnu.org/binutils, gcc, glibc, Linux内核2、编译binutils:Configure用—prefix指定安装路径用--target=arm-Linux指定目标机类型make install3、配置Linux内核头文件:make menuconfigARCH=arm,根据实际需要配置内核,配完后将头文件目录include/asm-arm和include/Linux拷贝到安装目录/arm-Linux/include下交叉编译环境建立步骤
<114、第1次编译gcc:由于还没有适用于arm的glibc库,先关掉一些选项,再编译得到最简单的arm-Linux-gcc5、交叉编译glibc:用arm-Linux-gcc编译得到适用于arm的glibc6、第2次编译gcc:再次编译得到完整的arm-Linux-gcc工具链交叉编译环境建立步骤
更多细节可参考http://kegel.com/crosstool/crosstool-0.42/ doc/crosstool-howto.html编译工具链是一个较麻烦的工作,除非确有必要,一般直接使用编译好的,实验中使用现成的工具链安装即可。<12嵌入式Linux 开发流程1、搭建硬件开发环境2、搭建软件开发环境
嵌入式信息系统讲义第5章嵌入式软件设计
Written by Zhou, BISTU
5-
<1、搭建硬件开发环境:OMAP4460开发板(安卓4.0)
2个
USB
口+1
网口RS232
串口5V电源输入
<15串口线网线(交叉线)
并口线JTAG调试器Com?LPT1搭建硬件开发环境
JTAG2个USB口+1网口RS232串口
音频接口
OMAP4460开发板USB转RS232串口
<16可以将嵌入式开发板看作一个没有键盘的Linux主机,有几种方法与该主机交互:1、外接键盘,启动Qtopia图形环境后可用鼠标或触摸屏;2、在Linux主机上启动一个minicom任务,将该任务窗口作为开发板的终端,通过该终端与嵌入式Linux交互,要求配置串口波特率、帧格式等;具体方法见实验指导书第17-19页。3、如果在Windows环境下则通过超级终端,启动一个窗口与嵌入式Linux系统交互,同样要求配置串口波特率、帧格式等。嵌入式系统的人机交互方法
<17JTAG标准即IEEE 1149.1标准,联合测试行动组(Joint Test Action Group, JTAG)起草了边界扫描测试(Boundary Scan Testing, BST)规范, 边界扫描技术的基本思想是在靠近芯片的输入输出管脚上增加一个移位寄存器单元。通过这些边界扫描寄存器单元,可以实现对芯片输入输出信号的观察和控制。另外,芯片输入输出管脚上的边界扫描(移位)寄存器单元可以相互连接起来,在芯片的周围形成一个边界扫描链(Boundary-Scan Chain)。JTAG接口
<18JTAG不但可以用来测试内部功能模块状态,还可以实现在线调试(ICE)功能。ARM系列处理器正是通过JTAG使用内部集成的ICE功能,并采用这种方式实现在线调试的。实验中JTAG主要用来烧写BootLoader,即当开发板上的Flash中没有任何程序时,用JTAG方式写入最基本的引导程序BootLoder(类似PC的BIOS)。在Linux下有开放源代码的JTAG烧写程序j-flash,需要有并口JTAG模块配合(可自制)。一旦BootLoader工作正常,以后就可以由BootLoader负责将Linux内核、文件系统、应用程序等烧写到Flash中。JTAG接口
<
嵌入式信息系统讲义第5章嵌入式软件设计
Written by Zhou, BISTU
5-
<192、搭建软件开发环境1)建立开发环境,操作系统一般使用UbuntuLinux ,选择定制安装或全部安装,通过网络下载相应的gcc交叉编译器进行安装(比如arm-linux-gcc、arm-uclibc-gcc),或者安装产品厂家提供的交叉编译器。2)配置开发主机,配置minicom,一般的参数为波特率115200,数据位8 位,停止位1,无奇偶校验,软件硬件流控设为无。在Windows下的超级终端的配置也是这样。minicom软件的作用是作为调试嵌入式开发板的信息输出
的监视器和键盘输入的工具。<20嵌入式Linux 开发流程3)移植引导装载程序(BootLoader)、Linux内核、根文件系统,建立应用程序的FLASH 磁盘分区。(开发板已经预先做好)4)烧写BootLoader、Linux内核、根文件系统、应用程序。(开发板已经预先做好)5)开发应用程序,通过网络(tftp,nfs)、minicom命令、USB等方式将得到的elf格式的可执行文件存入文件系统中。也可重复3、4直至符合最终要求。
<21¾用vi编写C、C++语言或汇编源程序(.S文件/.asm
文件),在windows环境下用UE或者写字板编辑源文件,不能用记事本;¾用arm-linux-as, arm-linux-gcc或arm-linux-g++生成目标文件,甚至C
语言直接嵌入汇编,
GCC也能处理;
¾
编写连接脚本文件,用连接器生成最终目标文件(elf格式);¾
用
GDB调试,最后用二进制转换工具生成可下载的二进制代码;(也可以直接运行程序,根据输出反复修改)¾在
Linux/uClinux
下一般把编译、连接、安装工作用shell脚本来描述,使用make 命令来完成。开发应用程序流程
>
<22串口线网线(交叉线)com1典型软硬件环境配置示例
网口+2个USB口RS232串口59.64.74.77gccarm-linux-gcctftp服务器59.64.74.79tftp客户
<23makefile基本上就是『目标』(target), 『关连』(dependencies) 和『动作』三者所组成的一连串规则。make 会根据Makefile的规则来决定如何编译(compile) 和连结(link) 程序。实际上,make 可做的不只是编译和连结程序,Makefile还可以做到自动下载源代码,解压缩(extract) ,修补(patch),设定,然後编译,安装至系统中。在UNIX系统中,习惯使用Makefile作为makefile文件。如果要使用其他文件作为makefile,则可利用类似下面的make 命令选项指定makefile文件:>$ make -f Makefile.debug5.1.3 make和Makefile
<24makefile中一般包含如下内容:¾需要由make工具创建的项目,通常是目标文件和可执行文件。通常使用“目标(target)”一词来表示要创建的项目;¾要创建的项目依赖于哪些文件;¾创建每个项目时需要运行的命令。makefile基本结构