《《精编》嵌入式Linux的软件开发环境分析》由会员分享,可在线阅读,更多相关《《精编》嵌入式Linux的软件开发环境分析(75页珍藏版)》请在金锄头文库上搜索。
1、嵌入式Linux的软件开发环境 编译原理Linux环境下的GCC及ARM交叉编译器的概念和使用调试技术内核编译 裁减以及Linux的移植 什么是编译程序 从功能上看 一个编译程序就是一个语言翻译程序 它把一种语言 称作源语言 书写的程序翻译成另一种语言 称作目标语言 的等价的程序 功能 术语编译程序的源语言 源程序 编译程序的目标语言 目标程序 编译程序的实现语言 高级语言书写的程序 编译程序 低级语言程序 什么是编译程序 分类软件系统软件语言处理系统 分类 软件 计算机系统中的程序及其文档系统软件 居于计算机系统中最靠近硬件的一层 其他软件一般都通过系统软件发挥作用 他和具体的应用领域无关
2、如编译系统和操作系统等 语言处理系统 把软件语言书写的各种程序处理成可在计算机上执行的程序 软件语言 用于书写软件的语言 它主要包括需求定义语言 功能性语言 设计性语言 程序设计语言以及文档语言 预处理器 编译器 汇编器 装配连接编辑 骨架程序 源程序 目标汇编程序 可重定位机器代码 绝对机器码 可重定位目标文件库 语言处理过程 语言转 变 换系统 C 编译器 C C Java Bytecode Java编译器 术语 编译程序 compiler 编译程序的源语言 源程序 sourcelanguage sourceprogram 编译程序的目标语言 目标程序 objectortargetlang
3、uage objectortargetprogram 编译程序的实现语言 implementationlanguage 语言处理程序 languageprocessor 语言转 变 换 languagetransformation 编译过程和编译程序的结构 编译逻辑过程词法分析语法分析语义分析中间代码生成代码优化目标代码生成 词法分析 从左至右读字符流的源程序 识别 拼 单词例 position initial rate 60 词法分析 position initial rate 60 单词类型单词值标识符1 id1 position算符 赋值 标识符2 id2 initial算符 加 标识符
4、3 id3 rate算符 乘 整数60分号 又如一个C源程序片断 inta a a 2 词法分析后可能返回 单词类型单词值保留字int标识符 变量名 a界符 标识符 变量名 a算符 赋值 标识符 变量名 a算符 加 整数2界符 语法分析 功能 层次分析 依据源程序的语法规则把源程序的单词序列组成语法短语 表示成语法树 position initial rate 60 规则 赋值语句 标识符 表达式 表达式 表达式 表达式 标识符 整数 标识符 表达式 id1 id2 id3 N 语义分析 语义审查 静态语义 上下文相关性类型匹配类型转换例 Programp Varrate real proce
5、dureinitial position initial rate 60 error error warning 又如 intarr 2 abc abc arr 10 Programp Varrate real Varinitial real Varposition real position initial rate 60 语义分析 semanticanalysis 中间代码生成 intermediatecodegeneration 源程序的内部 中间 表示三元式 四元式 P Code C Code U Code bytecode id3t1t2 t2 id3 t1t2 id3 t1 中间代
6、码生成 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 id2t1id1 代码优化 codeoptimization t1 b ct1 b ct2 t1 0t2 t1 t1t3 b ca t2t4 t2 t3a t4 目标代码生成 id360 0t1 id2t1id1 movfid3 R2mulf 60 0 R2movfid2 R1addfR2 R1mov
7、fR1 id1 符号表管理 symboltable 记录源程序中使用的名字收集每个名字的各种属性信息类型 作用域 分配存储信息 Const1常量值 35Var1变量类型 实层次 2 出错处理 errorhandling 检查错误 报告出错信息 排错 恢复编译工作 编译程序结构 components 词法分析程序语法分析程序语义分析程序中间代码生成程序代码优化程序目标代码生成程序符号表管理程序出错处理程序 出错处理 表格管理 编译阶段的组合 分析 综合 synthesis 源程序的分析线性分析层次分析语义分析目标程序的综合编译的前端 frontend 编译的后端 backend 遍 趟 从头到尾
8、扫描源程序 各种形式 一遍 pass 高级语言解释系统 interpreter 功能让计算机执行高级语言 basic Matlab prolog 与编译程序的不同1 不生成目标代码2 能支持交互环境 同增量式编译系统 源程序初始数据 解释系统 直接对源程序中的语句进行分析 执行其隐含的操作 如 b 2 a b 2 编译程序writea 解释程序直接将4的值输出 显示 编译阶段和运行阶段存储结构 名字表 目标代码缓冲区 编译用源程序中间表示各种表格 目标代码区 数据区 源程序缓冲区 编译技术的发展和应用 功能 程序集成环境实现方式手工机器语言汇编系统程序设计语言自动构造工具lexyaccgcc
9、编译程序的发展 语言范型 paradigms 命令式 imperativelanguage 应用式 applicative 基于规则的 rule based 面向对象的 object oriented 编译程序执行环境批处理交互环境嵌入系统环境 研究领域 并行编译技术交叉编译技术硬件描述语言及其编译技术 并行化编译技术 目的 提高并行计算机体系结构的性能 超大规模计算的日益增长的需求高性能计算机并行软件 并行体系结构 单机速度 并行体系结构 途径1 途径2 并行体系结构编译技术支持串行程序并行化编译技术支持并行程序设计语言编译依赖于目标机的优化 低层 由于目标机指令系统与宿主机的指令系统不同
10、编译时将应用程序的源程序在宿主机上生成目标机代码 称为交叉编译 O A B 交叉编译器 硬件描述语言及其编译技术 电路设计依据验证结果如 VHDL 嵌入式开发工具基本概念 嵌入式系统和系统软件级的开发所需的计算机知识较多 而首当其冲的是嵌入式开发工具的学习 首先我们需要清楚的是为什么我们需要嵌入式开发工具 在嵌入式系统开发中目标机与宿主机是分离的 它们之间往往具有不同的组织结构 例如 我们在研究过程中宿主机一般均为 而目标机为不同的开发板 这些开发板和 具有不同的体系结构 而我们为了使在 上运行的程序在目标机上能够运行就需要将源程序编译成相应的目标代码 而这就是我们需要嵌入式开发工具的主要原因
11、 嵌入式开发工具简介 一 在众多嵌入式开发工具中GNUTools 基于OpenSource的软件 是Linux环境下最重要的开发工具集 为了有效的开发嵌入式系统 至少需要了解和掌握如下几类工具 1 编译开发工具 即能够把一个源程序编译生成一个可执行的软件 如gcc等 2 调试工具 即能够对执行程序进行源码或汇编级调试的软件 如gdb 3 软件工程工具 用于协助多人开发或大型软件项目的管理的软件 如make cvs 嵌入式开发工具简介 二 在GNUTools中最基本的一些工具就包括 ld 链接器 as 汇编器 gcc C语言编译器 glibc 包含各种基本函数实现的软件库 上述大部分软件均可以在
12、ftp ftp gnu org gnu 上下载 嵌入式开发工具简介 三 binutils是一组二进制工具程序集 它主要包括链接器 汇编器和其它用于处理目标文件和档案的工具 其中链接器为ld 它的主要作用是把各种目标文件 O文件和 和库文件链接在一起 并根据定位数据和函数的地址 最终生成执行程序 汇编器主要是AS 是GNU编译器的汇编器 Assembler 负责把 S或 s为后缀的汇编文件编译成 以 o为后缀的目标文件处理目标文件和档案的主要工具是ar 它用于建立 修改和提取归档文件 一个归档文件是包含多个被包含文件的单个文件程序员可以从归档文件中检索并得到原始的被包含文件的内容 模式 时间戳
13、所有者和组等属性 嵌入式开发工具简介 四 glibc是GNU的C语言标准程序库 C语言将部分函数留给操作系统来实现 当我们的程序需要调用时 就要通过操作系统提供的C程序库来取得这些服务 程序库与应用程序的链接方式可分为静态与动态链接两种方式 当应用程序需要一个动态链接库时就需要我们自己安装一个动态库在Linux操作系统中 嵌入式开发工具简介 五 Gcc编译工具 gcc是一个强大的工具集合 它主要为GNU提供C编译器 现在Gcc也开始支持多种工具语言 如JAVA FORTRAN等 如果能较好的掌握它 我们就能够通过它提供的足够多的参数来全面控制代码的生成 GNUTools的安装 一 在安装GNU
14、Tools之前你需要注意的有两个问题 一 需要了解宿主机和目标机的体系结构 这是因为不同的体系结构所需的开发工具的版本是不同的 二 不同开发工具之间版本的控制 GNUTools的安装 二 此图列出了到目前为止成功的版本配置 GNUTools的安装 三 对于每个单独的工具软件包 它的配置 编译 安装过程一般包括如下几步 1 下载并解压软件包 2 配置软件包 3 编译软件包 4 安装软件包 为了安装某些GNUTools 可能还需要对Linux内核的include文件进行配置 这主要是由于glibc的安装是与Linux内核相关的 Bootloader概念 一 在专用的的嵌入式板上运行linux已经获
15、得了越来越广泛的应用 一个嵌入式linux系统从软件的角度看通常可以分为4个层次 1 引导加载程序 2 linux内核 特定于嵌入式板子的定制内核以及内核的启动参数 3 文件系统 4 用户应用程序 bootloader软件正是属于引导加载程序的一部分 Bootloader概念 二 在一般的PC中开机过程可分为BIOS和BootManger两步 1 BIOS Baiscinputoutputsystem 它存在于主板的flashRom上 负责硬件初始化的程式2 BootManager 它不象BIOS那样与硬件结合的如此紧密 例如一套BootManager在X86系统上写好后 就可在所有的X86机
16、上使用 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的安装步骤 根据我们以前介绍的知识我们在编译安装一个bootloade