嵌入式软件开发实战指南

发表时间: 2024-06-18 10:10

目录 嵌入式软件开发环境 嵌入式软件开发流程 嵌入式软件开发流程 嵌入式系统调试 典型开发工具链 Intel Intel开发工具链 开发实例 开发实例 4.14.1 嵌入式软件开发环境 嵌入式软件开发环境 交叉开发 交叉开发 编程语言 编程语言 4.1.14.1.1 交叉开发 交叉开发 通用计算机的软件开发一般采用本机(Native)编译模式)编译方式进行,而嵌入式系统一般不支持本机环境开发,它们的软件开发一般采用交叉开发(CrossCompile)模式进行。 交叉开发环境建立在主机(HostHost)上,主机又叫开发机,一般是通用计算机,如PCPC等。 对应的嵌入式系统称为目标机。 对应的嵌入式系统称为目标机。 目标机是指各种嵌入式设备,如手机、PDA等; 或者目标机是指各种各样的嵌入式设备,比如手机,PDA等等;或者是嵌入式厂商提供的一套专用于开发的评估板(或者是嵌入式厂商提供的一套专用于开发的评估板(evaluationboard),所以也叫开发板);甚至是一个基于软件的模拟器。

),所以也叫开发板;甚至是软件化的仿真器。 开发时,利用宿主机上的交叉编译、汇编、链接工具,形成目标机上可执行的二进制代码,再将可执行文件下载到目标机上执行。 另外,嵌入式系统的调试也常常采用交叉运行的方式。 另外,嵌入式系统的调试也常常采用交叉运行的方式。 4.1.14.1.1 交叉开发 为什么需要交叉编译? 目标机往往无法进行有效的本地编译。 开发过程中,目标机硬件本身无法使用或者不够稳定。 目标机平台缺乏完整的本地编译工具与环境。 目标机平台缺乏完整的本地编译工具与环境。 目标机系统本身性能不够强,导致编译速度慢。 嵌入式系统的软件编译不同于Windows开发,不仅需要编译应用程序,还需要编译相应的依赖库、操作系统内核等,因此完整的编译非常耗时。 例如在奔腾44级别的PC上编译一个Linux内核可能需要十几分钟的时间,从硬件角度来说,决定编译速度的主要因素有CPU速度、内存速度、内存容量、文件系统I/O速度等。

速度。这些在嵌入式系统上往往比PC差很多,所以在目标系统上本地编译效率太低了。 4.1.1.1 交叉开发 宿主机和目标机的区别 宿主机和目标机的区别 宿主机和目标机通常是异构的,宿主机一般采用x86架构,但目标机的架构可能是非x86的,比如ARM、MIPS、PowerPC等。对于有些系统可能不是这样,比如Atom系统中,宿主机和目标机一般都是标准的x86系统,当然执行的指令集可能不一样,比如宿主机(DuoCoreDuo)可能支持SSE4,而Atom支持SSE3和SSSE3,所以编译时必须考虑目标机型号和指令集的选择。

处理能力不同。通常宿主机的处理速度和存储容量比目标机大得多。 使用操作系统不同。宿主机通常运行通用操作系统,而目标机通常运行各种嵌入式操作系统。 输入输出方式不同。与宿主机相比,目标机的输入输出功能可能相对简单。 交叉开发的主要工作包括交叉编译、交叉链接、交叉调试等。 4.1.24.1.2 编程语言 嵌入式系统常用的编程语言有ADAPython模块汇编、汇编、C/C++启动代码、硬件抽象层启动代码、硬件抽象层(HAL)(HAL)C/C++、汇编、汇编驱动层驱动层 C/C++、汇编、汇编操作系统层操作系统层、JavaJava、.NET.NET、脚本、PythonPython应用层 常用的编程语言级别 在较低级别,不得不使用汇编语言,尽管它的使用量不大。

复杂的嵌入式系统通常由多种语言混合编写而成。 4.1.2 编程语言通用计算机系统中使用的编程语言有很多,从低级的汇编语言,到FORTRAN、ADA、Module以及与平台无关的高级语言,再到Java、C#、.NET等等,不胜枚举。从面向过程的PASCALPASCAL,到面向对象,到ObjectOrientedProgrammingOOPOOPJavaJava,再到泛型编程(GenericProgrammingGPGP)。考察一种语言是否适用,需要从多个方面进行考虑。 4.1.24.1.2 编程语言选定一种高级语言之后,在项目中并不一定能用到它的所有功能。例如对于C++C++语言,很多时候在实际的嵌入式开发中并不会用到它的某些语言功能。

实际嵌入式开发中用到的功能并不多。例如模板对于泛型编程很重要,但如果编译器不能很好地实现它们,很容易增加最终代码的大小,这对于资源严重有限的嵌入式开发人员来说有时是难以容忍的。还有异常处理,在某些嵌入式操作系统中,C++的异常处理会引起处理器执行状态的切换,导致系统效率明显下降,不适合实时性要求高的系统。由于其具有易于低级编程等诸多优点,目前是大多数嵌入式系统开发的首选语言。4.2 嵌入式软件开发流程一般来说,嵌入式软件开发要经过编辑(代码编写)、编译、重定位(寻址和打包)、烧录、下载、调试、优化等步骤。在某些嵌入式系统中,可能还需要进行测试和验证。

步骤。从流程上看,大致可以分为编码阶段、构建阶段、部署阶段、调优等阶段。 加载器 典型的嵌入式软件开发流程图 典型的嵌入式软件开发流程图 4.2 嵌入式软件开发流程 4.2 嵌入式软件开发流程 编码阶段 编码阶段是软件开发的开始,它的任务是写出软件的源代码,所用的工具是各种编辑器。 构建阶段 构建阶段的任务是将代码转换成可以在嵌入式硬件上执行的可执行程序,这个阶段包括几个步骤,包括编译、链接、寻址和打包。 寻址和打包。 构建阶段的一般流程 构建阶段的一般流程 构建 步骤1 步骤2 步骤3 构建的第一步是编译,也就是将源代码文件翻译成目标文件。 编译是由编译器来完成的,编译器的任务是把用某种编程语言编写的源代码翻译成等同于特定处理器的一系列操作码。 与这些操作码相对应的文件称为目标文件。

构建的第二步是把所有的目标文件链接成一个目标文件,这个目标文件被称为可重定位程序(Re locatable Program)。链接工作是由链接器(linker)完成的,链接器的主要工作是扫描所有输入的目标文件,然后合并多个目标文件的段并解析它们之间的依赖关系(这个过程叫做符号解析(symbolresolution)),最后生成可执行文件。在很多开发工具中,会把编译器和链接器的功能结合起来,直接把源代码文件转换成可执行文件,这个过程通常叫做构建(Build)。可重定位和非可重定位的可执行文件。一般来说,嵌入式系统的可执行文件有可重定位(re-relocatable)和非可重定位(non-relocatable)两个版本。