嵌入式系统体系结构.pps_第1页
嵌入式系统体系结构.pps_第2页
嵌入式系统体系结构.pps_第3页
嵌入式系统体系结构.pps_第4页
嵌入式系统体系结构.pps_第5页
已阅读5页,还剩70页未读 继续免费阅读

下载本文档

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

文档简介

嵌入式Linux 的软件开发环境 编译原理 Linux 环境下的GCC 及ARM交叉编译器的 概念和使用 调试技术 内核编译、裁减以及Linux 的移植 什么是编译程序 从功能上看,一个编译程序就是一个语言 翻译程序,它把一种语言(称作源语言)书写的 程序翻译成另一种语言(称作目标语言)的等 价的程序. 功能 术语 编译程序的源语言( 源程序) 编译程序的目标语 言(目标程序) 编译程序的实现语 言 S O I 高级语言 书写的程序 编译程序低级语言程序 S T I 什么是编译程序 分类 软件 系统软件 语言处理系 统 操作系统 编译系 统 裸机 分类 软件:计算机系统 中的程序及其文档 系统软件:居于计 算机系统中最靠近硬 件的一层,其他软件 一般都通过系统软件 发挥作用。他和具体 的应用领域无关,如 编译系统和操作系统 等。 语言处理系统:把软 件语言书写的各种程 序处理成可在计算机 上执行的程序。 软件语言:用于书写 软件的语言。它主要 包括需求定义语言, 功能性语言,设计性 语言,程序设计语言 以及文档语言。 预处理器 编译器 汇编器 装配连接编辑 骨架程序 源程序 目标汇编程序 可重定位机器代码 绝对机器码 可重定位目标文件库 语言处理过程 语言转(变)换系统 C+编译器 C+ C Java Bytecode Java编译器 术语 编译程序(compiler) 编译程序的源语言(源程序) (source language)(source program) 编译程序的目标语言(目标程序) (object or target language)(object or target program) 编译程序的实现语言(implementation language) 语言处理程序(language processor) 语言转(变)换(language transformation) 编译过程和编译程序的结构 编译逻辑过程 词法分析 语法分析 语义分析 中间代码生成 代码优化 目标代码生成 词法分析 从左至右读字符流的源程序、识别(拼)单词 例: position := initial + rate * 60; 词法分析 position := initial + rate * 60; 单词类型单词值 标识符1(id1) position 算符(赋值) := 标识符2(id2) initial 算符(加) + 标识符3(id3) rate 算符(乘) * 整数 60 分号 ; 又如一个C源程序片断: int a; a = a + 2; 词法分析后可能返回: 单词类型单词值 保留字 int 标识符(变量名) a 界符 ; 标识符(变量名) a 算符(赋值) = 标识符(变量名) a 算符(加) + 整数 2 界符 ; 语法分析 功能:层次分析.依据源程序的语法规则把源程序 的单词序列组成语法短语(表示成语法树). position := initial + rate * 60 ; 规则 :=“:=” :=“+” :=“*” :=“(”“)” := := := 赋值语句 标识符表达式 表达式+ 表达式表达式 标识符整数 标识符 := 表达式 * id1:=id2+id3*N := + N 60 * id1 Position id2 initial id3 rate 语义分析 语义审查(静态语义) 上下文相关性 类型匹配 类型转换 例:Program p(); Var rate:real; procedure initial; position := initial + rate * 60 /* error */ /* error */ /* warning */; 又如: int arr 2,abc; abc = arr * 10; Program p(); Var rate:real; Var initial :real; Var position :real ; position := initial + rate * 60 语义分析(semantic analysis) 60 := + * Id1 positionId2 initial Id3 rate inttoreal 中间代码生成(intermediate code generation) 源程序的内部(中间)表示 三元式、四元式、P-Code、C-Code、 U- Code、bytecode ( * id3t1t2) t2 = id3 * t1 t2 := id3 * t1 中间代码生成 id1:= id2 + id3 * 60 (1)(inttoreal,60-t1) (2)(*,id3t1t2) (3)(+,id2t2t3) (4)(:=,t3-id1) 代码优化 id1:= id2 + id3 * 60 (1)(inttoreal60-t1) (2)( * id3t1t2) (3)( +id2t2t3) (4)( :=t3-id1) 变换 (1) ( *id360.0t1) ( 2)( + id2 t1id1) 代码优化(code optimization) t1 = b* c t1 = b* c t2 = t1+ 0 t2 = t1 + t1 t3 = b* c a = t2 t4 = t2 + t3 a = t4 目标代码生成 (*,id360.0 t1) (+,id2t1 id1) movfid3,R2 mulf#60.0,R2 movfid2,R1 addfR2,R1 movfR1,id1 符号表管理(symbol table) 记录源程序中使用的名字 收集每个名字的各种属性信息 类型、作用域、分配存储信息 Const1常量值:35 Var1变量类型:实层次 :2 出错处理(error handling) 检查错误、报告出错信息、排错、恢复编 译工作 编译程序结构(components) 词法分析程序 语法分析程序 语义分析程序 中间代码生成程序 代码优化程序 目标代码生成程序 符号表管理程序 出错处理程序 出 错 处 理 语法分析程序 语义分析程序 目标代码生成程序 词法分析程序 中间代码生成程序 代码优化程序 表 格 管 理 编译阶段的组合 分析,综合(synthesis) 源程序的分析 线性分析 层次分析 语义分析 目标程序的综合 编译的前端(front end) 编译的后端(back end) 遍(趟)从头到尾扫描源程序(各种形式)一遍 (pass) 高级语言解释系统(interpreter) 功能 让计算机执行高级语言(basic,Matlab,prolog) 与编译程序的不同 1)不生成目标代码 2)能支持交互环境 (同增量式编译系统) 源 程 序 初始数据 解释系统 直接对源程序中的语句进行分析,执行其隐含的操作。 如: b := 2 ; a := b+2 ; 编译程序 write a ; 解释程序直接将4的值输出(显示) 编译阶段和运行阶段存储结构 名字表 目标代码缓冲区 编译用源程序中 间表示各种表格 目标代码区 数据区 源程序缓冲区 编译技术的发展和应用 功能:程序 集成环境 实现方式 手工 机器语言 汇编 系统程序设计语言 自动构造工具lex yacc gcc 编译程序的发展 语言范型(paradigms) 命令式(imperative language) 应用式(applicative) 基于规则的(rule-based) 面向对象的(object-oriented) 编译程序执行环境 批处理 交互环境 嵌入系统环境 研究领域 并行编译技术 交叉编译技术 硬件描述语言及其编译技术 并行化编译技术 目的:提高并行计算机体系结构的性能。 超大规模计算的日益增长的需求 高性能计算 机 并行软件 并行体系结构 单机速度并行体系结构 途 径 1 途 径 2 并行体系结 构 编译技术 支持 串行程序并行化 编译技术支持 并行程序设计语言编译 依赖于目标机的优化(低层 ) 由于目标机指令系统与宿主机的指令系统不同, 编译时将应用程序的源程序在宿主机上生成目标机 代码,称为交叉编译。 SO I O AB 交叉编译器 硬件描述语言及其编译技术 电路设计依据 验证结果 如:VHDL 嵌入式开发工具基本概念 嵌入式系统和系统软件级的开发所需的计算 机知识较多,而首当其冲的是嵌入式开发工具的学习 ,首先我们需要清楚的是为什么我们需要嵌入式开 发工具: 在嵌入式系统开发中目标机与宿主机是分离 的,它们之间往往具有不同的组织结构,例如:我 们在研究过程中宿主机一般均为,而目标机为 不同的开发板,这些开发板和具有不同的体系 结构,而我们为了使在上运行的程序在目标机 上能够运行就需要将源程序编译成相应的目标代码 ,而这就是我们需要嵌入式开发工具的主要原因 嵌入式开发工具简介(一) 在众多嵌入式开发工具中GNU Tools(基于 Open Source的软件)是Linux环境下最重要的开发 工具集,为了有效的开发嵌入式系统,至少需要了解 和掌握如下几类工具: (1)编译开发工具:即能够把一个源程序编译生成 一个可执行的软件,如gcc等。 (2)调试工具:即能够对执行程序进行源码或汇编 级调试的软件,如gdb。 (3)软件工程工具:用于协助多人开发或大型软件 项目的管理的软件,如make,cvs。 嵌入式开发工具简介(二) 在GNU Tools中最基本的一些工具就包 括: ld(链接器), as(汇编器), gcc(C语言编译器), glibc(包含各种基本函数实现的软件库) 上述大部分软件均可以在 /gnu/上下载。 嵌入式开发工具简介(三) binutils是一组二进制工具程序集,它主要包 括链接器,汇编器和其它用于处理目标文件和档案 的工具。 其中链接器为ld,它的主要作用是把各种目 标文件(O文件和)和库文件链接在一起,并根 据定位数据和函数的地址,最终生成执行程序。 汇编器主要是AS: 是GNU编译器的汇编器 (Assembler),负责把.S或.s为后缀的汇编文件编译 成. 以.o为后缀的目标文件 处理目标文件和档案的主要工具是ar,它用于 建立,修改和提取归档文件。一个归档文件是包含 多个被包含文件的单个文件程序员可以从归档文件 中检索并得到原始的被包含文件的内容,模式,时 间戳,所有者和组等属性 嵌入式开发工具简介(四) glibc是GNU的C语言标准程序库,C语 言将部分函数留给操作系统来实现,当我们的 程序需要调用 时,就要通过操作系统提供的C 程序库来取得这些服务。 程序库与应用程序的链接方式可分为静 态与动态链接两种方式,当应用程序需要一 个动态链接库时就需要我们自己安装一个动 态库在Linux操作系统中。 嵌入式开发工具简介(五) Gcc编译工具:gcc是一个强大的工具 集合,它主要为GNU提供C编译器,现在 Gcc也开始支持多种工具语言,如JAVA, FORTRAN等。如果能较好的掌握它,我们 就能够通过它提供的足够多的参数来全面控 制代码的生成。 GNU Tools的安装(一) 在安装GNU Tools之前你需要注意的有 两个问题: (一)需要了解宿主机和目标机的体系结 构。这是因为不同的体系结构所需的开发工 具的版本是不同的。 (二)不同开发工具之间版本的控制。 GNU Tools的安装(二) 此图列出了到目前为止成功的版本配置 宿主机目标机OS内核 BinutilsGccGlibc I386i386 Linux 2.4.x 2.14.90.2 i386ppc Linux 2.4.x i386arm Linux 2.4.x 2.13.90.1 i386mips Linux 2.4.x 2.8.1 Egcs-1.1.2 2.0.6 sparcppc Linux 2.4.x ppcarm Linux 2.4.x i386 strongarmLinux 2.6.x .32.3.2 i386xscale Linux 2.6.x .32.3.2 GNU Tools的安装(三) 对于每个单独的工具软件包,它的配置/编译/ 安装过程一般包括如下几步: (1)下载并解压软件包; (2)配置软件包; (3)编译软件包; (4)安装软件包; 为了安装某些GNU Tools,可能还需要对 Linux内核的include文件进行配置,这主要是由于 glibc的安装是与Linux内核相关的。 Bootloader 概念(一) 在专用的的嵌入式板上运行linux已经获得了 越来越广泛的应用,一个嵌入式linux系统从软件的角 度看通常可以分为4个层次 (1)引导加载程序; (2)linux内核.特定于嵌入式板子的定制内核以及 内核的启动参数; (3)文件系统; (4)用户应用程序。 bootloader 软件正是属于引导加载程序的一部分 。 Bootloader 概念(二) 在一般的PC 中开机过程可分为BIOS和 BootManger两步: 1.BIOS(Baisc input output system),它存在于 主板的flashRom上,负责硬件初始化的程式 2.BootManager:它不象BIOS那样与硬件结合的如 此紧密.例如一套BootManager在X86系统上写好后, 就可在所有的X86机上使用.BootManager 的工作是 负责将Kernel载入,有时它还负责从多个硬盘分区 载入OS,例如在同一台PC上同时有linux和windows, 我们就靠着在MBR上的BootManager来选择要载入 windows或是linux,同时BootManager也要负责一系 列的初始化动作. Bootloader 概念(三) 在嵌入式系统中通常是没有BIOS那样的固件程序的因此整个系 统 加载启动任务就完全由Bootloader 来完成.虽然有很多种 Bootloader ,但大多Bootloader可以分为两个步骤来完成: Stage1 : (1)硬件设备初始化(如I/O口,存储器和时钟). (2)为加载Bootloader的stage2准备好RAM空间. (3)复制Bootloader的到RAM空间中. (4)设置好堆栈. (5)跳转到stage2的C入口点. Stage2: (1)初始化本阶段要使用的硬件设备. (2)检测系统的内存映射. (3)将kernel映像和根文件系统映像从Flash上读到RAM空间中. (4)从内核设置启动参数. (5)调用内核. Bootloader的安装步骤 根据我们以前介绍的知识我们在编译安 装一个bootloader到目标板时首先需要找到 一个适合目标板的bootloader软件,接着我 们就需要为编译安装这个软件到目标板准备 必要的工具软件,最后才是将编译好的 bootloader软件下载到目标板上。 bootloader 软件的选择 目前应用的比较广泛的bootloader软件 有ARMboot,Redboot,U-boot等,这些软件支 持的CPU和所需要的开发环境各不相同,其 中ARMBOOT支持基于ARM720T,ARM920T 等CPU的开发板。而U-boot是迄今为止功能 更为强大的开源bootloader软件,它支持多 种处理器平台,包括PPC,ARM,X86以及 MIPS等。 交叉编译工具的选择(一) 在安装交叉编译环境之前你首先需要 清楚你宿主机和目标机的体系结构,以一套宿 主机为安装有Linux-的以X86结构为 基础的PC机,宿主机是以在安装交叉编译环 境之前你首先需要清楚你宿主机和目标机的 体系结构,以一套宿主机为安装有Linux- 的以X86结构为基础的PC机,宿主机 是以ARM9内核为基础的Intei PXA255开发板 。 交叉编译工具的选择(二) 我们首先要找到交叉编译环境中几个 重要的部分: 针对目标系统的编译器GCC; 针对目标系统的二进制工具binutils; 目标系统的标准C库glibc。 交叉编译工具的选择(三) 通过查询资料可知最新的一套适合i386 arm体系的交叉编译工具集是: binutils-2.14.tar.gz gcc-3.3.2.tar.gz glibc-2.2.5.tar.gz glibc-linuxthreads-2.2.5.tar.gz 交叉编译工具的安装 将以上工具集下载到你指定的目录下后 ,就可解压缩并安装这些文件,需要注意的 是在安装完这些文件后,最好在/root/.bashrc 文件中指明交叉编译工具的路径,这样你在 运行arm-linux-gcc时就可以不考虑目录的路 径让shell自动的寻找路径。 Bootloader的移植(一) 在安装好交叉编译工具后你就可以编译 bootloader软件了,一般在bootloader软件的 Readme文档中都会有编译步骤,在有些文 档中还会有常见错误(common error)的解决 方法。 编译好bootloader 后,一般会生成一个 。Bin文件,这就是我们要移植到开发板中的 二进制文件。 Bootloader的移植(二) 在得到.bin 文件后我们就可以将它移植 到目标板上了,这时我们就需要移植工具来 帮助我们,当然针对不同的开发板有不同的 移植工具。我们以Intel PXA255开发板为例 ,此开发板是通过JTAG口来加载bootoader ,在连接好JTAG线之后,我们又需要一个 JFlash-linux软件,这个工具是一种直接写闪 存的软件,通过它我们就可以直接将.bin文件 烧写到开发板闪存的0x00000000位置。 Bootloader也就移植成功。 GCC命令格式 Gcc option filename Gcc o prog main.c sub1.c sub2.c sub3.c o prog :指定输出可执行文件名为prog,缺省时为a.out 或先单独编译,然后连接: Gcc c main.c Gcc c sub1.c Gcc c sub2.c Gcc c sub3.c Gcc o prog main.o sub1.o sub2.o sub3.o Make和Makefile 自动编译,自动确定软件包的哪部分需要 重新编译并用特定的命令去编译。 Makefile的规则: 目标属性 分隔符号依赖文件;命令列 命令列 Prog:main.o subfun.o Gcc o prog main.o sunfun.o Main.o:main.c main.h Gcc c I o main.o main.c Subfun.o:subfun.c Gcc c o subfun.o sunfun.c Clean: Rm f *.o GDB调试程序 gdb 的功能: 监视你程序中变量的值. 设置断点以使程序在指定的代码行上停止 执行. 单步执行代码. 为调试编译代码(Compiling Code for Debugging) 为了使 gdb 正常工作, 你必须使你的 程序在编译时包含调试信息. 调试信息包含你 程序里的每个变量的类型和在可执行文件里 的地址映射以及源代码的行号. gdb 利用这些 信息使源代码和机器码相关联. 在编译时用 - g 选项打开调试选项. gdb基本命令 命 令 描 述 file装入想要调试 的可执行文件 kill终止正在调试 的程序 list 列出产生执行文件的源代码的 一部分 nex t 执行一行源代码但不进入函数 内部 ste p 执行一行源代码而且进入函数 内部 run 执行当前被调试 的程序 qui t 终止 gdb wat ch 使你能监视 一个变量的值而不 管它何时被改变 bre ak 在代码里设置断点, 这将使程 序执行到这里时被挂起 ma ke 使你能不退出 gdb 就可以重新 产生可执行文件 she ll 使你能不离开 gdb 就执行 U

温馨提示

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

评论

0/150

提交评论