《嵌入式 Linux C 语言应用程序设计(修订版)》——1.5 嵌入式系统开发概述

1.5 嵌入式系统开发概述

嵌入式 Linux C 语言应用程序设计(修订版)

1.5.1 嵌入式系统开发流程

嵌入式系统的开发流程与通用系统的开发流程有较大的区别,其设计流程如图1.15所示。

下面对系统各个模块进行简要说明。

系统需求分析:根据需求,确定设计任务和设计目标,制定设计说明书。
体系结构设计:描述系统如何实现所述的功能需求,包括对硬件、软件和执行装置的功能划分以及系统的软件、硬件选型等。
硬件/软件协同设计:基于体系结构的设计结果,对系统的硬件、软件进行详细设计。一般情况下嵌入式系统设计的工作大部分都集中在软件设计上,现代软件工程经常采用的方法是面向对象技术、软件组件技术和模块化设计。
系统集成:把系统的硬件、软件和执行装置集成在一起进行调试,发现并改进设计过程中的不足之处。
系统测试:对设计好的系统进行测试,检验系统是否满足实际需求。

1.5.2 嵌入式软件开发流程

按照软件工程的原理,嵌入式软件开发的一般流程为需求分析、软件概要设计、软件详细设计、软件实现和软件测试。与一般的软件开发区别主要在于软件实现的编译和调试两部分,下面分别对这两部分进行讲解。

1.交叉编译
由于宿主机和目标机的体系结构不同,在宿主机X86平台上可以运行的程序在目标机ARM平台上无法运行,因此嵌入式软件开发采用交叉编译方式在一个平台上生成可以在另一个平台上执行的代码。编译的最主要的工作就是将程序转化成运行该程序的CPU所能识别的机器代码,嵌入式系统交叉编译环境如图1.16所示。

进行交叉编译的主机称为宿主机,也就是普通的通用计算机,宿主机系统资源丰富,使用方便地集成开发环境和调试工具等。

程序实际的运行环境称为目标机,也就是嵌入式系统环境。嵌入式系统的系统资源非常紧缺,存储空间、处理器运行速度等都很有限,并且没有相关的编译工具,因此,嵌入式系统的开发需要借助宿主机(通用计算机)来编译出目标机的可执行代码。

由于编译的过程包括编译、链接等几个阶段,因此,嵌入式的交叉编译也包括交叉编译和交叉链接等过程,通常,ARM的交叉编译器为arm-elf-gcc,交叉链接器为arm-elf-ld,图1.17显示了交叉编译的这几个过程。

一般而言,可执行文件是ELF格式文件。

2.交叉调试
嵌入式软件编译和链接完成后即进入调试阶段。调试器与被调试的程序一般运行在同一台计算机上,调试器是一个单独运行着的进程,它通过操作系统提供的调试接口来控制被调试的进程。

在嵌入式软件开发中的调试方式采用的是交叉调试,调试器运行在宿主机的通用操作系统之上,被调试的进程运行在基于特定硬件平台的嵌入式操作系统中。

宿主机与目标机通过串口或者网络进行通信。调试器可以控制、访问被调试进程,读取被调试进程的当前状态,并能够改变被调试进程的运行状态。

嵌入式系统的交叉调试方法主要有硬件和软件两种,它们的共同特点如下。

调试器运行在宿主机上,而被调试的进程则运行在目标机上。
调试器通过串口、并口、网络、JTAG等控制被调试进程。
在目标机上一般会具备某种形式的调试代理与调试器共同配合对目标机上的进程进行调试。这种调试代理可能是某些支持调试功能的硬件设备,也可能是某些专门的调试软件(如gdbserver)。
目标机可能是某种形式的系统仿真器,通过在宿主机上运行目标机的仿真软件,整个调试过程可以在一台计算机上运行。此时物理上虽然只有一台计算机,但逻辑上仍然存在着宿主机和目标机的区别。
下面详细讲解硬件片上调试和软件调试桩方式。

(1)硬件片上调试

硬件调试器有强大的调试功能和优秀的调试性能。硬件调试器的基本原理是通过仿真硬件的执行过程,让开发者在调试时可以随时了解系统的当前执行情况。

目前嵌入式系统开发中最常用到的硬件调试器是ROMMonitor、ROMEmulator、In-Circuit- Emulator和In-CircuitDebugger,其详细介绍如下。

① ROMMonitor方式

采用ROMMonitor方式进行交叉调试需要在宿主机上运行调试器,在目标机上运行ROM监视器(ROMMonitor)和被调试程序,宿主机通过调试器与目标机上的ROM监视器遵循远程调试协议建立通信连接。

ROM监视器可以是一段运行在目标机ROM上的可执行程序,也可以是一个专门的硬件调试设备,它负责监控目标机上被调试程序的运行情况,能够与宿主机端的调试器一同完成对应用程序的调试。

在使用这种调试方式时,被调试程序首先通过ROM监视器下载到目标机,然后在ROM监视器的监控下完成调试。

优点:ROM监视器功能强大,,能够完成设置断点、单步执行、查看寄存器、修改内存空间等各项调试功能。

缺点:使用ROM监视器目标机和宿主机必须建立通信连接。

其原理如图1.18所示。

② ROMEmulator方式

采用ROMEmulator方式进行交叉调试时需要使用ROM仿真器,它通常被插入到目标机上的ROM插槽中,专门用于仿真目标机上的ROM芯片。

在使用这种调试方式时,被调试程序首先下载到ROM仿真器中,因此等效于下载到目标机的ROM芯片上,然后在ROM仿真器中完成对目标程序的调试。

优点:避免了每次修改程序后都必须重新烧写到目标机的ROM中。

缺点:ROM仿真器本身比较昂贵,功能相对来讲又比较单一,只适应于某些特定场合。

其原理图如图1.19所示。

③ In-CircuitEmulator(ICE)方式

采用In-CircuitEmulator(ICE)方式进行交叉调试时需要使用在线仿真器,它是目前最为有效的嵌入式系统的调试手段。它是仿照目标机上的CPU而专门设计的硬件,可以完全仿真处理器芯片的行为。

仿真器与目标板可以通过仿真头连接,与宿主机可以通过串口、并口、网线或USB口等连接方式。由于仿真器自成体系,调试时既可以连接目标板,也可以不连接目标板。

在线仿真器提供了非常丰富的调试功能。在使用在线仿真器进行调试的过程中,可以按顺序单步执行,也可以倒退执行,还可以实时查看所有需要的数据,从而给调试过程带来了很多的便利。

嵌入式系统应用的一个显著特点是与现实世界中的硬件直接相关,存在各种异变和事先未知的变化,从而给微处理器的指令执行带来各种不确定因素,这种不确定性在目前情况下只有通过在线仿真器才有可能发现。

优点:功能强大,软硬件都可做到完全实时在线调试。

确定:价格昂贵。

其原理图如图1.20所示。

④ In-CircuitDebugger(ICD)方式

采用In-CircuitDebugger(ICD)方式进行交叉调试时需要使用在线调试器。

由于ICE的价格非常昂贵,并且每种CPU都需要一种与之对应的ICE,使得开发成本非常高,一个比较好的解决办法是让CPU直接在其内部实现调试功能,并通过在开发板上引出的调试端口发送调试命令和接收调试信息,完成调试过程。如在采用非常广泛的ARM处理器的JTAG端口技术就是由此而诞生的。

JTAG是1985年指定的检测PCB和IC芯片的一个标准。1990年被修改成为IEEE的一个标准,即IEEE1149.1。

JTAG标准所采用的主要技术为边界扫描技术,它的基本思想就是在靠近芯片的输入输出管脚上增加一个移位寄存器单元。因为这些移位寄存器单元都分布在芯片的边界上(周围),所以被称为边界扫描寄存器(Boundary-Scan Register Cell)。

当芯片处于调试状态时候,这些边界扫描寄存器可以将芯片和外围的输入输出隔离开来。通过这些边界扫描寄存器单元,可以实现对芯片输入输出信号的观察和控制。

对于芯片的输入脚,可通过与之相连的边界扫描寄存器单元把信号(数据)加载到该管脚中去;对于芯片的输出管脚,可以通过与之相连的边界扫描寄存器单元“捕获”(CAPTURE)该管脚的输出信号。这样,边界扫描寄存器提供了一个便捷的方式用于观测和控制所需要调试的芯片。

现在较为高档的微处理器都带有JTAG接口,包括ARM7、ARM9、StrongARM、DSP等,通过JTAG接口可以方便地对目标系统进行测试,同时,还可以实现Flash的编程,是非常受人欢迎的调试方式。

优点:连接简单,成本低。

缺点:特性受制于芯片厂商。

其原理图如图1.21所示。

(2)软件方式

软件方式调试主要是通过插入调试桩的方式来进行的。调试桩方式进行调试是通过目标操作系统和调试器内分别加入某些功能模块,二者互通信息来进行调试。该方式的典型调试器有Gdb调试器。

Gdb的交叉调试器分为GdbServer和GdbClient,其中的GdbServer就作为调试桩在安装在目标板上,GdbClient就是驻于本地的Gdb调试器。

它们的调试原理图如图1.22所示。

Gdb调试桩的工作流程如下。

首先,建立调试器(本地Gdb)与目标操作系统的通信连接,可通过串口、网卡、并口等多种方式。
接着,在目标机上开启Gdbserver进程,并监听对应端口。
在宿主机上运行调试器Gdb,这时,Gdb就会自动寻找远端的通信进程,也就是Gdbserver的所在进程。
在宿主机上的Gdb通过Gdbserver请求对目标机上的程序发出控制命令。这时,Gdbserver将请求转化为程序的地址空间或目标平台的某些寄存器的访问,这对于没有虚拟存储器的简单的嵌入式操作系统而言,是非常十分容易。
Gdbserver把目标操作系统的所有异常处理转向通信模块,告知宿主机上Gdb当前异常号。
宿主机上的Gdb向用户显示被调试程序产生了哪一类异常。
这样就完成了调试的整个过程。这个方案的实质是用软件接管目标机的全部异常处理及部分中断处理,在其中插入调试端口通信模块,与主机的调试器进行交互。

它只能在目标机系统初始化完毕、调试通信端口初始化完成后才能起作用,因此,一般只能用于调试运行于目标操作系统之上的应用程序,而不宜用来调试目标操作系统的内核代码及启动代码。而且,它必须改变目标操作系统,因此,也就多了一个不用于正式发布的调试版。

时间: 2024-08-04 15:13:36

《嵌入式 Linux C 语言应用程序设计(修订版)》——1.5 嵌入式系统开发概述的相关文章

《嵌入式 Linux C 语言应用程序设计(修订版)》一1.5 嵌入式系统开发概述

1.5 嵌入式系统开发概述 嵌入式 Linux C 语言应用程序设计(修订版) 1.5.1 嵌入式系统开发流程 嵌入式系统的开发流程与通用系统的开发流程有较大的区别,其设计流程如图1.15所示. 图1.15 嵌入式系统的开发流程 下面对系统各个模块进行简要说明. 系统需求分析:根据需求,确定设计任务和设计目标,制定设计说明书. 体系结构设计:描述系统如何实现所述的功能需求,包括对硬件.软件和执行装置的功能划分以及系统的软件.硬件选型等. 硬件/软件协同设计:基于体系结构的设计结果,对系统的硬件.

《嵌入式 Linux C 语言应用程序设计(修订版)》一1.2 嵌入式系统的组成

1.2 嵌入式系统的组成 嵌入式 Linux C 语言应用程序设计(修订版) 嵌入式系统主要由嵌入式微处理器.外围硬件设备.嵌入式操作系统以及用户应用软件等部分组成,其体系结构如图1.2所示. 图1.2 嵌入式系统体系结构图 从该图中可以清楚地看到嵌入式系统体系结构上下层之间的关系. 其中,硬件平台包括嵌入式处理器和外围设备,它们位于嵌入式系统结构中的最底层:嵌入式操作系统与通用操作系统的功能类似,为用户屏蔽硬件底层的具体细节,提供一个透明的操作空间:而应用软件则是位于嵌入式操作系统之上的,当然

《嵌入式 Linux C 语言应用程序设计(修订版)》——2.1 嵌入式Linux下C语言概述

2.1 嵌入式Linux下C语言概述 嵌入式 Linux C 语言应用程序设计(修订版) 读者在第一章中已经了解了嵌入式开发的基本流程,在嵌入式系统中应用程序的主体是在宿主机中开发完成的,就嵌入式Linux而言,此过程则一般是在安装有Linux的宿主机中完成. 在本章中介绍的实际是嵌入式Linux下C语言的开发工具,用户在开发时往往是在Linux宿主机中对程序进行调试,然后再进行交叉编译的. 2.1.1 C语言简史 C语言于20世纪70年代诞生于美国的贝尔实验室.在此之前,人们编写系统软件主要是

《嵌入式 Linux C 语言应用程序设计(修订版)》一本章小结

本章小结 嵌入式 Linux C 语言应用程序设计(修订版)本 章 小 结 熟练使用开发工具是进行嵌入式Linux C语言开发的第一步.本章详细介绍了嵌入式Linux C语言开发常见的编辑器vi.编译器GCC.调试器GDB.工程管理器make和综合编辑器Emacs. 对于这些工具的使用方法,读者一定要通过实际动手操作来熟练掌握.本章在每个工具的讲解中都有一个完整的实例,希望读者能够完整操作这些实例. 动 手 练 练 1.在vi中编辑如下代码(命名为test.c),并自行编写Makefile运行该

《嵌入式 Linux C 语言应用程序设计(修订版)》一1.3 ARM处理器平台介绍

1.3 ARM处理器平台介绍 嵌入式 Linux C 语言应用程序设计(修订版)1.3.1 ARM处理器简介ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是一类微处理器的通称,还可以认为是一种技术的名字. 1991年ARM公司成立于英国剑桥(公司原貌如图1.5所示),主要出售芯片设计技术的授权.目前,采用ARM技术知识产权(IP)核的微处理器,即人们通常所说的ARM微处理器,已经遍及工业控制.消费类电子产品.通信系统.网络系统.无线系统等各类产品市

《嵌入式 Linux C 语言应用程序设计(修订版)》一2.3 嵌入式Linux编译器GCC的使用

2.3 嵌入式Linux编译器GCC的使用 嵌入式 Linux C 语言应用程序设计(修订版) 2.3.1 GCC概述 作为自由软件的旗舰项目,Richard Stallman在十多年前刚开始写作GCC的时候,还只是仅仅把它当作一个C程序语言的编译器,GCC的意思也只是GNU C Compiler而已. 经过了这么多年的发展,GCC已经不仅仅能支持C语言,它现在还支持Ada语言.C++语言.Java语言.Objective C语言.PASCAL语言.COBOL语言,并支持函数式编程和逻辑编程的M

《嵌入式 Linux C 语言应用程序设计(修订版)》——1.1 嵌入式系统概述

1.1 嵌入式系统概述 嵌入式 Linux C 语言应用程序设计(修订版)正如尼葛洛庞帝在2001年预言的一样,如今,嵌入式系统已成为最为热门的领域之一.从市场观点来看,PC已经从高速增长时期进入平稳发展时期,其年增长率由20世纪90年代中期的35%逐年下降,单纯由PC机带领电子产业蒸蒸日上的时代已经成为历史.为此,美国Business Week杂志提出了"后PC时代"概念,即嵌入式系统所带领的时代. 进入21世纪以来,嵌入式系统已经广泛地渗透到科学研究.工程设计.军事技术.各类产业以

《嵌入式 Linux C 语言应用程序设计(修订版)》一2.4 嵌入式Linux调试器GDB的使用

2.4 嵌入式Linux调试器GDB的使用 嵌入式 Linux C 语言应用程序设计(修订版)在程序编译通过生成可执行文件之后,就进入了程序的调试环节.调试一直来是程序开发中的重中之重,如何使程序员能够迅速找到错误的原因是一款调试器的目标. GDB是GNU开源组织发布的一个强大的Linux下的程序调试工具,它是一种强大的命令行调试工具. 一个出色的调试器需要有以下几项功能. 能够运行程序,设置所有能影响程序运行的参数.能够让程序让指定的条件下停止.能够在程序停止时检查所有参数的情况.能够根据指定

《嵌入式 Linux C 语言应用程序设计(修订版)》一第1章 嵌入式系统基础知识1.1 嵌入式系统概述

第 1 章 嵌入式系统基础知识 嵌入式 Linux C 语言应用程序设计(修订版)本章目标 嵌入式系统产业作为朝阳产业正在蓬勃发展,优秀的操作系统Linux也凭借其高效.开放等优势在嵌入式领域占据了一席之地. 本章首先带领读者走近嵌入式系统,从整体上把握什么是嵌入式系统以及如何开发嵌入式系统的应用程序.通过本章的学习,读者将会掌握如下内容: anniu嵌入式系统的基本概念 anniu嵌入式系统的特点以及与PC的区别 anniu嵌入式系统的现状与发展前景 anniu嵌入式系统的硬件架构 anniu