第四章 嵌入式软件开发基础.ppt_第1页
第四章 嵌入式软件开发基础.ppt_第2页
第四章 嵌入式软件开发基础.ppt_第3页
第四章 嵌入式软件开发基础.ppt_第4页
第四章 嵌入式软件开发基础.ppt_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

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

文档简介

第4章嵌入式软件开发基础 嵌入式程序的学习嵌入式程序的调试C语言可执行程序的结构和加载方式 第4章嵌入式软件开发基础 4 1嵌入式软件开发语言4 2嵌入式软件开发流程4 3调试工具和方法4 4C语言程序的结构4 5仿真环境 4 1嵌入式软件开发语言 汇编 与体系结构相关 效率高C语言 最常用语言 C 语言 面向对象 C语言的扩展 JAVA 面向对象 编译结果不是目标机的机器代码 而是通用字节码 可移植性强 需要虚拟机脚本语言 不需要编译 解释运行 由于资源闲置 不能使用于大规模程序 在嵌入式系统中的软件开发中 目前普遍使用C语言为主 汇编语言为辅的手段 C语言与硬件相关的特性 可以完成各种基本系统硬件的操作 同时C语言具有广泛使用和结构化的特点 相比汇编语言 开发效率高 在嵌入式开发中 汇编语言不可缺少 其一 有一些硬件相关的操作 尤其是与处理体系相关的操作 C语言可能无法完成 其二 对于一些与性能密切相关的程序与算法 汇编语言可以提高性能 4 2嵌入式软件开发流程 嵌入式软件开发流程 嵌入式应用的生成特点 C语言程序的生成分成编译 汇编 链接等几个步骤 最终的目标的文件的主要部分是处理器可执行的机器代码组合 根据系统的不同 目标文件可能除了可执行的二进制代码部分外 还包括一定的头 例如 对于Linux操作系统 目标执行文件是ELF ExectutableandLinkingFormat 格式 对于uClinux系统 目标执行文件是Flat格式 对于需要在系统直接运行的程序 目标执行文件应该是纯粹的二进制代码 载入系统后 直接转到代码区地址执行 嵌入式应用的生成特点 ADS ArmDeveloperSuite 主要需要使用以下工具 编译器 armcc exe 编译成ARM指令汇编 和tcc exe 编译成Thumb指令汇编 汇编器 armasm exe链接器 armlink exeARM LinuxGCC交叉编译系统 则主要使用以下工具 编译器 arm lixux gcc 可以统一编译 汇编过程 汇编器 arm linux as链接器 arm linux ld 嵌入式应用的生成特点 ARM的编译系统 注意 使用ADS和linuxGCC编译器的各自工具不同 编译 Compile 编译 Compile 是指从高级语言转换成汇编语言的过程 从本质上编译是一个文本转换的过程 从文本文件到文本文件 编译包含了C语言的语法解析和生成汇编语言两个步骤 不同体系结构的处理器上会被编译成不同的汇编代码 不同编译器生成的汇编代码可能具有不同的效率 汇编 Assemble 汇编 Assemble 是指从汇编语言程序生成目标系统的二进制代码 机器代码 的过程 相对于编译过程的语法解析 汇编的过程相对简单 这是因为对于一款特定的处理器 其汇编语言和二进制的机器代码是一一对应的 在很多情况下 将编译和汇编的两个过程统称为编译 严格讲 编译是指从高级语言到汇编代码的过程 例如 在LinuxGCC的编译系统中 使用gcc c直接从C语言生成二进制代码 使用gcc s将从C语言生成汇编语言代码 链接 Link 链接 Link 过程将汇编成的多个机器代码组合成一个可执行程序 一般来说 通过编译和汇编过程 每一个源文件将生成一个目标文件 链接器的作用就是将这些目标文件组合 组合的过程包括了代码段 数据段等部分的合并 以及添加相应的文件头 文件头的格式与可执行程序需要在何种系统运行有关 可执行文件的主体部分是数据 data 和代码 code 数据是程序中使用的信息组合 代码是目标机的机器代码 注意 在嵌入式系统的交叉开发中 生成的可执行程序一般是不能在主机上运行的 例 arm linux gcc编译后的文件 不能运行在x86体系的主机上运行 加载程序 嵌入式系统的开发初期 生成的二进制代码需要烧写到系统的只读存储器中 然后跳转到代码所在的地址才能运行 系统构建完成后 还可以使用其他的手段 例如 对于Linux系统 最初是将BootLoader的代码烧写到嵌入式系统中 然后使用BootLoader将Linux内核和文件系统烧入 实质上BootLoader和Linux内核都是处理器可执行的代码 BootLoader是首先烧入系统的纯二进制代码 Linux内核需要通过BootLoader运行 当系统构建完毕后 Linux操作系统有了基本的功能 这是可以将ELF格式的目标即可执行程序加入系统的文件系统 通过Linux加载运行 4 3调试工具和方法 嵌入式调试的特点打印调试信息JTAG调试远程gdb调试 嵌入式调试的特点 通用计算机中 软件调试一般只需要在本机运行程序 然后根据需要对程序进行调整 在嵌入式系统中 调试的概念相对复杂 对于其调试过程 程序主体运行在目标机上 主机所起的作用是获得程序运行中的信息 并通过人工或者程序的方式分析这些信息 因此嵌入式调试的基础是需要一条从主机到目标机的通讯通道 1打印调试信息 打印调试信息是基本的调试方式 printf 标准输出 在嵌入式系统中 这种输出的通讯通道可能是串口或者网络协议 在某些系统中 没有实现标准输出 这就需要开发者自己开发调试手段 例 通过目标机的串口输出函数 在主机段使用minicom或者超级终端接收调试信息 该调试方式中 只能被动获取目标机发出的调试信息 不能控制目标及运行的程序 2JTAG调试 嵌入式系统中一种常用的硬件调试方法 JTAG是JointTestActionGroup的简称 JTAG使用边界扫描 Boundary Scan 的方式调试 在正常的运行状态下 这些边界扫描寄存器对于芯片是透明的 在调试的运行状态下 通过这些边界扫描寄存器单元 可以实现对芯片输入输出信号的观察和控制 3远程GDB调试 在远程GDB调试中 调试器是运行在主机 host 桌面电脑 的应用程序 被调试的程序是运行在目标 target 上 它通过插桩 stub 的方式实现 即在目标操作系统和调试器内分别加入某些功能模块 二者互通信息来进行调试 调试器与被调程序的通信 Gdb和调试stub通过GDB串行协议进行通信 在远程GDB调试中 目标机运行GDB服务器 GDB服务器通过通信协议将被调试程序的运行信息发送至主机 主机对调试信息进行分析并控制程序的运行 4 4C语言程序的结构 C语言目标文件中的段执行程序内部细节目标文件各段的链接C语言程序的执行 C语言目标文件中的段 C语言在编译过程中 编译系统会将每一个C语言源文件经过编译和汇编 生成一个目标文件 一般以 o为扩展名 对于每一个C语言目标文件的构成 其主体部分是由C语言各种语法生成的各段和其他一些有代码生成工具生成的符号信息 如图所示 C语言目标文件中的段 C语言目标文件中的段 C语言目标文件中的段 C语言的目标文件一般包含三个主体段 代码段 Code 又称Text 由代码部分组成 只读段只读数据段 ROData 由数据部分组成 只读段读写数据段 RWData 由数据部分组成 读写段 执行程序内部细节 代码段由程序中的各个函数产生 函数的每一个语句经过编译和汇编后生成二进制机器代码 包括顺序代码 选择代码 循环代码 函数调用和函数出入栈等 执行程序内部细节 只读数据段由程序中使用的数据产生 该部分数据在运行中不需要改变 只读全局变量 只读局部变量 常量 执行程序内部细节 读写数据段目标文件中可读可写的数据区 亦称为初始化数据段 已初始化的全局静态变量 已初始化的局部静态变量注意 读写数据区的特点是必须在程序中进行初始化 如果只有定义 没有初始化 不会产生读写数据区 定位为未初始化数据区 执行程序内部细节 未初始化数据段 BSS 未初始化数据段与读写数据段类似 也属于静态数据区 但是没有初始化 因此只会在目标文件中被标识 而不会真正成为目标文件的一个段 该段将在运行时产生 它的大小不会影响目标文件的大小 一般来说 直接定义的全局变量在未初始化数据区 如果该变量有初始化则是在已初始化数据区 RWData 加上const修饰符将放置在只读区域 ROData 示例1 constcharro thisisreadonlydata 只读数据段 staticcharrw1 thisisglobalreadwritedata 已初始化读写数据段 charbss 1 100 未初始化数据段 constchar ptrconst constantdata constantdata 放在只读数据段 intmain shortb b放置在栈上 占用2个字节 chara 100 需要在栈上开辟100个字节 a的值是其首地址 chars abcde s在栈上 占用4个字节 abcde 本身放置在只读数据存储区 占6字节 char p1 p1在栈上 占用4个字节 char p2 123456 123456 放置在只读数据存储区 占7字节 p2在栈上 p2指向的内容不能更改 staticcharrw2 thisislocalreadwritedata 局部已初始化读写数据段 staticcharbss 2 100 局部未初始化数据段 staticintc 0 全局 静态 初始化区 p1 char malloc 10 sizeof char 分配的内存区域在堆区 执行程序内部细节 示例21 include2 include34constcharro data 1024 Thisisreadonlydata 5charrw data 1 1024 Thisisglobalreadwritedata 6staticcharrw data 2 1024 Thisisinternalreadwritedata 7staticcharzero data 1 1024 8 执行程序内部细节 9intmain intargc char argv 10 11staticcharzero data 2 1024 12inti 13charstack data 1 100 14charstack data 2 InitstackData 15char memptr 16memptr char malloc 1024 17if NULL memptr 18 19printf mallocerror n 20return 1 21 22else23 24printf mallocsuccessfully n 25 26for i 0 i 1024 i 27 28zero data 1 i a 29 执行程序内部细节 30strcpy stack data 1 stackdata1 31strcpy memptr datainheap 3233printf ro data s n ro data 34printf rw data 1 s n rw data 1 35printf rw data 2 s n rw data 2 36printf stack data 1 s n stack data 1 37printf stack data 2 s n stack data 2 38printf memptr s n memptr 3940free memptr 41return0 42 目标文件各段的链接 可执行文件其主体部分依然是代码段 Code 只读数据段 ROData 读写数据段 RWData 三个段 这三个段由各个目标文件 o 经过 组合 而成 链接器将根据连接顺序将各个文件中的代码段提出 组成可执行文件的代码段 只读数据段和读写数据段 C语言程序的执行 运行方式1 全部加载到内存中 C语言程序的执行 运行方式2 本地运行PIC 一般在NorFlash中 4 5仿真环境 源代码编译成主机程序主机运行目标机代码 源代码编译成主机程序 主机运行目标机代码 Simulator 交叉开发方式存在如下缺点 硬件支持必须有目标机或评估板易使用性普通编程人员不熟悉廉价性成本高可移植性 可扩展性不高团队开发较难开发周期较长 软件仿真器 软件仿真器 在宿主机上创建一个虚拟的目标机环境

温馨提示

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

评论

0/150

提交评论