软件架构之嵌入式系统设计
- 第 12 章:嵌入式系统设计
- 12.1 嵌入式系统概论
- 12.2 嵌入式系统的组成
- 12.2.1 硬件架构
- 12.2.2 软件架构
- 12.3 嵌入式开发平台与调试环境
- 12.3.1 嵌入式系统软件开发平台
- 12.3.2 嵌入式开发调试
第 12 章:嵌入式系统设计
随着计算机技术、微电子技术、通信技术以及集成电路技术的发展,嵌入式技术逐渐发展和成熟起来。嵌入式系统的应用日益广泛,并 在数量上远远超越了通用计算机系统,成为了计算机技术和计算机应用领域的一个重要组成部分。
本章主要讨论嵌入式系统的基本知识与嵌入式系统的开发设计两部分内容,主要包括嵌入式系统的概念、软/硬件组成与基本架构、嵌入式操作系统和嵌入式数据库系统、网络系统以及窗口系统等核心支撑软件系统的基本原理和技术,最后介绍嵌入式系统的开发设计。
12.1 嵌入式系统概论
嵌入式系统是一种以应用为中心,以计算机技术为基础,可以适应不同应用对功能、可靠性、成本、体积、功耗等方面的要求,集可配置,可裁减的软、硬件于一体的专用计算机系统。它具有很强的灵活性,主要由嵌入式硬件平台、相关支撑硬件、嵌入式操作系统、支撑软件以及应用软件组成。其中,“嵌入性”、“专用性”与“计算机系统”是嵌入式系统的三个基本的核心要素,具体来讲:
嵌入性:指计算机计算机嵌入到对象系统中,且满足对象系统的环境要求,如物理环境(小型)、电气/气氛环境(可靠)、成本(价廉)等要求。
- 专用性:指软、硬件的裁剪性,满足对象要求的最小软、硬件配置等。
- 计算机系统:指嵌入式系统必须是一个能满足对象系统控制要求的计算机系统。
归纳起来,典型的嵌入式系统具有以下特点:
(1)系统专用性强。嵌入式系统是针对具体应用的专门系统。它的个性化很强,软件和硬件结合紧密。一般要针对硬件进行软件的开发和移植,根据硬件的变化和增减对软件进行修改。由于嵌入式系统总是用来完成某一特定任务,整个系统与具体应用有机地结合在一起,升级换代也以更换整个产品的方式进行,因此,一个嵌入式产品一旦进入市场,一般具
有较长的生命周期。
(2)系统实时性强。嵌入式系统中有相当一部分系统要求对外来事件在限定的时间内及时做出响应,具有实时性。
(3)软、硬件依赖性强。嵌入式系统的专用性决定了其软、硬件之间具有很强的互相依赖性,两者必须协同设计,以达到共同实现预定功能的目的,并满足性能、成本和可靠性等方面的严格要求。
(4)处理器专用。嵌入式系统的处理器与通用计算机的处理器之间最大的不同之处在于,嵌入式系统的处理器一般是为某一特定目的和应用而专门设计的。通常具有功耗低、体积小、集成度高等优点,能够把许多在通用计算机上需要由板卡完成的任务和功能集成到芯片内部,从而有利于嵌入式系统的小型化和移动能力的增强。
(5)多种技术紧密结合。嵌入式系统通常是计算机技术、半导体技术、电力电子技术及机械技术与各行业的具体应用相结合的产物。通用计算机技术也离不开这些技术,但它们相互结合的紧密程度不及嵌入式系统。
(6)系统透明性。嵌入式系统在形态上与通用计算机系统差异甚大。它的输入设备往往不是常见的鼠标和键盘之类的设备,甚至没有输出装置,用户可能根本感觉不到它所使用的设备中有嵌入式计算机系统的存在,即使知道也不必关心这个嵌入式计算机系统的相关情况。
(7)系统资源受限。嵌入式系统为了达到结构紧凑、可靠性高及降低系统成本的目的,其存储容量、输入/输出设备的数量和处理器的处理能力都比较有限。
12.2 嵌入式系统的组成
嵌入式系统一般都由软件和硬件两个部分组成,其中嵌入式处理器、存储器和外部设备构成整个系统的硬件基础。嵌入式系统的软件部分可以分为 3 个层次:系统软件、应用支撑软件和应用软件。其中,系统软件和支撑软件是基础,应用软件则是最能体现整个嵌入式系统的特点和功能的部分。
12.2.1 硬件架构
图 12-1 是一个嵌入式系统的基本硬件架构。微处理器是整个嵌入式系统的核心,负责控制系统的执行。外部设备是嵌入式系统同外界交互的通道,常见的外部设备有 Flash 存储器、键盘、输入笔、触摸屏、液晶显示器等输入/输出设备,在很多嵌入式系统中还有与系统用途紧密相关的各种专用外设。嵌入式系统中经常使用的存储器有 3 种类型:RAM、ROM(Read-Only Memory,只读内存)和混合存储器。系统的存储器用于存放系统的程序代码、数据和系统运行的结果。
1.嵌入式处理器
嵌入式系统的核心部件是各种类型的嵌入式处理器。据不完全统计,目前世界上嵌入式处理器的种类已经超过了 1000 种,比较流行的也有 30 几个系列。根据目前的使用情况,嵌入式处理器可以分为如下几类:
(1)嵌入式微处理器。嵌入式微处理器(Embedded Micro Processing Unit,EMPU)是由通用计算机中的 CPU 演变而来。嵌入式微处理器在功能上跟普通的微处理器基本一致,但是它具有体积小、功耗低、质量轻、成本低及可靠性高的优点。通常,嵌入式微处理器和ROM、RAM、总线接口及外设接口等部件安装在一块电路板上,称为单板计算机。目前,主要的嵌入式微处理器有 AM186/88、386EX、SC-400、POWER PC、MIPS 及 ARM 等系列。
(2)嵌入式微控制器。嵌入式微控制器(Embedded Micro Controlling Unit,EMCU)又称为单片机,就是整个计算机系统都集成到一块芯片中。嵌入式微控制器一般以某一种微处理器内核为核心,芯片内部集成有 ROM/EPROM/E2PROM、RAM、总线、总线逻辑、定时器/计数器、WatchDog(监督定时器)、并口/串口、数模/模数转换器、闪存等必要外设。与嵌入式微处理器相比,嵌入式微控制器的最大特点是单片化,因而体积更小,功耗和成本更低,可靠性更高。
目前,嵌入式微控制器的品种和数量最多,约占嵌入式系统市场份额的 70%。比较有代表性的通用系列有:8051 系列、MCS-96/196/296、C166/167、MC68HC05/11/12/16 等。还有许多半通用系列,如支持 UBS 接口的 MCU 8XC930/931、C540、C541 以及用于支持 I2C、现场总线等各种微控制器。
(3 )嵌入式数字信号处理器。嵌入式数字信号处理器(Embedded Digital Signal Processor,EDSP)是一种专门用于信号处理的处理器,DSP 芯片内部采用程序和数据分开的哈佛结构,具有专门的硬件乘法器,广泛采用流水线操作,提供特殊的 DSP 指令,可以用来快速实现各种数字信号的处理算法。目前,数字信号处理器在嵌入式系统中使用非常广泛,如数字滤波、快速傅立叶变换及频谱分析等。同时,嵌入式系统的智能化也是推动嵌入式 DSP 发展的一个动力,如各种带有智能逻辑的消费类产品、生物信息识别终端、带有加密/解密算法的设备、实时语音压缩和解压系统以及虚拟现实显示装置等,这类系统上的智能化算法一般运算量都比较大,这恰好可以充分发挥数字信号处理器的长处。
(4)嵌入式片上系统。嵌入式片上系统(Embedded System On Chip)是一种在一块芯片上集成很多功能模块的复杂系统,如微处理器内核、RAM、USB、IEEE 1394、Bluetooth 等。以往这些单元按照各自的功能做成一个个独立的芯片,并通过电路板与其他单元组成一个系统。现在将这些本来在电路板上的单元都集成到一个芯片中,构成一个嵌入式片上系统,从
而大幅度缩小了系统的体积,降低了系统的复杂度,增强了系统的可靠性。在大量生产时,生产成本也远远低于单元部件组成的电路板系统。嵌入式片上系统可以分为通用片上系统和专用片上系统两类。通用类的主要产品有 Siemens 的 Trocore、Motorola 的 M-Core、某些ARM 系列的器件等。专用类的嵌入式片上系统一般是针对某一个或某些系统而设计的。具有代表性的产品有 Philips 的 Smart XA,它将 XA 单片机的内核和支持超过 2048 位复杂RSA 算法的 CCU 单元制作在一个芯片上,形成一个可加载 Java 或 C 的专用嵌入式片上系统,可用于网络安全等方面。
2.总线
总线是连接计算机系统内部各个部件的共享高速通路,自 20 世纪 70 年代以来,工业界相继出现了多种总线标准,很多总线技术在嵌入式系统领域得到了广泛的应用。嵌入式系统的总线一般分为片内总线和片外总线。片内总线是指嵌入式微处理器内的
CPU 与片内其他部件连接的总线;片外总线是指总线控制器集成在微处理器内部或外部芯片上的用于连接外部设备的总线。
(1)AMBA 总线。AMBA(Advanced Microcontroller Bus Archiecture,先进微控制器总线架构)是 ARM 公司研发的一种总线规范,该总线规范独立于处理器和制造工艺技术,增强了各种应用中外设和系统单元的可重用性,它提供将 RISC 处理器与 IP 核集成的机制。该规范定义了三种总线:
先进性能总线(Advanced High-performance Bus,AHB)。AHB 由主模块、从模块和基础结构三部分组成,整个 AHB 总线上的传输都由主模块发起,从模块响应。基础结构包括:仲裁器、主从模块多路选择器、译码器、名义主模块、名义从模块等。AHB 系统具有时钟边沿触发、无三态、分帧传输等特性。AHB 也支持复杂的事务处理,如突发传送、主单元重试、
流水线操作以及分批事务处理等。
先进系统总线(Advanced System Bus,ASB)。ASB 用于高性能模块的互连,支持突发数据传输模式,较老的总线格式,逐步由 AHB 总线所替代。
先进外设总线(Advanced Peripheral Bus,APB)。APB 主要用于连接低带宽外围设备,其总线结构只有唯一的主模块,即 APB 桥,它不需要仲裁器以及响应/确认信号,以最低功耗为原则进行设计,具有总是两周期传输、无等待周期和响应信号的特点。
(2)PCI 总线。外围构件互连总线(Peripheral Component Interconnect,PCI)规范先后经历了 1.0 版本、2.0 版本和 2.1 版本等一系列规范。PCI 总线是地址、数据复用的高性能 32 位与 64 位总线,是微处理器与外围设备互连的机构,它规定了互连协议、电气、机械以及配置空间的标准。PCI 是不依赖于具体处理器的局部总线,从结构上看,PCI 是在微处理器和原来的系统总线之间加入的一级总线,由一个桥接电路负责管理,实现上下接口和协调数据传送,管理器提供了信号缓冲,使多种外设能够在高时钟频率下保持高性能。PCI 总线支持主控技术,允许智能设备在需要时获得总线控制权,以加速数据传输。 为了将 PCI 总线规范应用到工业控制计算机中,1995 年,推出了 Compact PCI 规范,并相继推出了 PCI-PCI Bridge 规范、Computer TelephonyTDM 规范和用户定义 I/O 引脚分配规范等。CPCI 总线规范有机地结合了 PCI 总线电气规范的高性能和欧洲卡结构的高可靠。
目前,CPCI 总线已经在嵌入式系统、工业控制计算机等高端系统中得到了广泛的应用,并逐步替代了 VME 和 MultiBUS 总线。
(3)Avalon 总线。Avalon 总线是 Altera 公司设计的用于可编程片上系统(System on Programmable Chip,SOPC)中,连接片上处理器和其他 IP 模块的一种简单总线协议,规定了主部件和从部件之间进行连接的端口和通信时序。作为总结,表 12-1 对比了几种嵌入式总线技术的主要特点。
3.存储器
嵌入式系统的存储器主要包括主存和外存,图 12-2 所示为嵌入式系统的存储结构,嵌入式系统的存储器主要分为三种:高速缓存(Cache)、片内主存和片外主存以及外存。
(1)高速缓存。高速缓存是存放当前使用最多的程序代码和数据的,即主存中部分内容的副本,在嵌入式系统系统中,Cache 全部集成在嵌入式微处理器内部,可以分为:数据Cache、指令 Cache 和混合 Cache。
(2)主存。主存是处理器能够直接访问的存储器,用来存放系统和用户的程序和数据,系统上电后,主存中的代码直接运行,主存的主要特点是速度快,一般采用 ROM、EPROM、NOR flash、SRAM 和 DRAM 等存储器件。
(3)外存。外部存储器是不与运算器直接联系的后备存储器,用来存放不常用的或暂不使用的信息,外存一般以非易失性存储器构成,数据能够持久保存,即使掉电,也不消失。
Flash 存储器是在 EPROM 和 EEPROM 的基础上发展起来的非易失性存储器,具有结构简单、可靠性高、体积小、质量轻、功耗低、成本低等优点,是最常用的一种外存类型。
4.I/O 设备与接口
因其应用领域的不同,嵌入式系统的输入设备多种多样,比较常见的有键盘、鼠标、触摸屏、手柄、声控开关等。通常,根据输入设备实现机理的不同,嵌入式系统的设备可以分为:机械式、触控式以及声光式三类。
嵌入式系统的输出设备除了通用计算机常用的显示器、打印机、绘图仪等外,还包括 LED 指示灯、LCD 屏幕、扬声器等媒体。嵌入式系统与外部设备或其他的计算机系统进行通信时,需经接口适配电路,进行工作速度、数据格式、电平等匹配与转换,嵌入式系统应用的接口形式是多种多样的。嵌入式系统中接口电路的设计需要首先考虑的是电平匹配问题,嵌入式系统微处理器所提供与接收信号的电平,必须与所连接的设备的电平相匹配,否则将导致电路损坏或逻辑判定错误。其次,还要考虑驱动能力和干扰问题等因素。 当前,在嵌入式系统中广泛应用的接口主要有:RS232-串行接口、并行接口、USB 接口、IEEE-1394 接口以及 RJ-45 接口等,此外,以蓝牙为代表的无线接口在嵌入式系统中的应用也日趋广泛。
(1)RS-232 接口。RS-232 接口是美国电子工业协会推广的一种串行通信总线标准,是数据通信设备和数据终端设备间传输数据的接口总线,RS-232-C 标准规定其最高速率为20kbps,在低码元畸变的情况下,最大传输距离是 15 米,通过使用增强器,其传输距离已经延长到 1000 米左右。
(2)USB 接口。USB(Universal Serial Bus,通用串行总线)是 1995 年由康柏等几大厂商共同制定的一种支持即插即用的外设接口标准,它支持 USB 外部设备到主机外部总线的连接。在 USB 系统中,必须有一个 USB 主控制器,USB 设备通过四根电缆与 USB 主控制器直接或间接相连,USB 的规范由最初的 1.0 版本发展到了 1.1 版本,以至当前主流的高速 2.0 版本,最高速率可到 480Mbps。
(3)1394 接口。IEEE1394 即火线(FireWire)最初是由 Apple 公司研制的,1995 年IEEE 协会以 FireWire 为蓝本制定了这个串行接口标准,其电缆接口为 6 根电缆组成,包括一堆电源线和两对双绞信号线。IEEE1394 协议定义了三种传输速率:98.304Mbps、196.608Mbps 和 392.216Mbps,分别称之为 S100、S200 和 S400。为了保证数据传输率,线缆的长度一般不超过 4.5m。
IEEE1394 标准通过所有连接设备建立起一种对等网络,不需要主控节点来控制数据流,即跟 USB 技术相比,最大的区别是 IEEE1394 不需要主控制器,不同的外设之间可以直接传递信息,此外,采用该技术,两台计算机可以共享同一个外部设备。
IEEE1394 同时支持同步和异步传输两种模式。在异步传输模式下,信息的传递可以被中断,在同步模式下,数据将不受任何中断和干扰下实现连续传输。采用异步传输模式时,IEEE1394 会根据不同的设备实际需要分配相应的带宽。同时,IEEE1394 设备也支持热插拔和即插即用。
12.2.2 软件架构
随着嵌入式技术的发展,特别是在后 PC 时代,嵌入式软件系统得到了极大的丰富和发
展,形成了一个完整的软件体系,如图 12-3 所示。
这个体系自底向上由三部分组成:嵌入式操作系统、应用支撑软件和应用软件。
(1)操作系统。嵌入式操作系统由操作系统内核、应用程序接口、设备驱动程序接口等几部分组成。嵌入式操作一般采用微内核结构。操作系统只负责进程的调度、进程间的通信、内存分配及异常与中断管理最基本的任务,其他大部分的功能则由支撑软件完成。
(2)应用支撑软件。嵌入式系统中的应用支撑软件由窗口系统、网络系统、数据库管理系统及 Java 虚拟机等几部分组成。对于嵌入式系统来讲,软件的开发环境大部分在通用台式计算机和工作站上运行,但从逻辑上讲,它仍然被认为是嵌入式系统支撑软件的一部分。应用支撑软件一般用于一些浅度嵌入的系统中,如智能手机、个人数字助理等。
(3)应用软件。嵌入式系统中的应用软件是系统整体功能的集中体现。系统的能力总是通过应用软件表现出来的,一个嵌入式系统可以没有支撑软件,甚至可以没有操作系统,但不可以没有应用软件,否则它就不可能成为一个系统。从范围上讲,嵌入式系统的应用软件涉及工业控制、家电、商业、通信等诸多领域。从跟用户的交互方式上讲,有跟桌面系统类似的软件,也有嵌入程度很深、使用户感觉不到其存在的应用软件。从运行环境上讲,有在操作系统和支撑软件上运行的软件,也有直接在硬件上运行的应用软件。
12.3 嵌入式开发平台与调试环境
嵌入式系统的应用支撑软件近年来发展迅速。通常,应用支撑软件包括窗口系统、数据库管理系统及 Java 虚拟机等几个部分。应用支撑软件的出现大大改变了应用软件的开发条件,同时也使得应用系统的功能不断增强。本节主要介绍嵌入式开发环境与软件调试技术。
12.3.1 嵌入式系统软件开发平台
嵌入式系统的软件开发方法采用的不是通用的开发方法,而是交叉式开发方法。本小节主要介绍嵌入式系统软件开发的交叉编译环境的基本概念和特点,以及软件调试常用的几种方法。
1.交叉平台开发环境
嵌入式系统的软件开发采用交叉平台开发方法(Cross Platform Development,CPD),即软件在一个通用的平台上开发,而在另一个嵌入式目标平台上运行。这个用于开发嵌入式软件的通用平台通常叫作宿主机系统,被开发的嵌入式系统称为目标机系统。而当软件执行环境和开发环境一致时的开发过程则称为本地开发(Native Development,ND)。 图 12-4 是一个典型的交叉平台开发环境,通常包含三个高度集成的部分:
(1)运行在宿主机和目标机上的强有力的交叉开发工具和实用程序。
(2)运行在目标机上的高性能、可裁剪的实时操作系统。
(3)连接宿主机和目标机的多种通信方式,例如,以太网,串口线,ICE(In Circuit Emulator,在线仿真器)或 ROM 仿真器等。
2.交叉编译环境
宿主机提供的基本开发工具是交叉编译器、交叉链接器和源代码调试器。作为目标机的嵌入式系统则可能提供一个动态装载器、链接装载器、监视器和一个调试代理等。在目标机和宿主机之间有一组连接,通过这组连接程序代码映像从宿主机下载到目标机,这组连接同时也用来传输宿主机和目标机调试代理之间的信息。
嵌入式系统开发人员需要完全了解目标机系统如何在嵌入式系统上存储程序映像、可执行映像如何下载到内存及执行控制如何传给应用,以及运行期间如何和何时装载程序映像,如何交叉式地开发和调试应用系统。这些方面对代码如何开发、编译、链接等步骤都有影响。
图 12-5 是一个典型的交叉编译环境的示例,显示了如何使用开发工具处理各种输入文件,并产生最终目标文件的过程。其中,交叉编译器将用户编写的 C/C++/Java 源代码文件根据目标机的 CPU 类型生成包含二进制代码和程序数据的目标文件。在此过程中,交叉编译器会建立一个符号表,包含所产生的目标文件中指向映像地址的符号名,当建立重定位输出时,编译器为每个相关的符号产生地址。
通常,还可以使用归档工具将这些目标文件收集到一起形成一个库。最后,链接器将这些目标文件作为输入来产生一个可执行的映像。
一般,用户会先编辑一个链接脚本文件,用来指示链接器如何组合和重定位各个代码段以便生成最终文件。此外,链接器还可以将多个目标文件组合成一个更大的重定位目标文件或一个共享目标文件。
目前,嵌入式系统中常用的目标文件格式是 COFF(Common Object File Format,公共对象文件格式)和 ELF(Executable Linking Format,可执行链接格式)。另外,一些系统还需要有一些专门的工具将上述格式转换成二进制代码格式才可使用。
通常,一个目标文件包含:
(1)关于目标文件的通用信息,如文件尺寸、启动地址、代码段和数据段等。
(2)机器架构特定的二进制指令和数据。
(3)符号表和重定位表。
(4)调试信息。
12.3.2 嵌入式开发调试
通用系统与嵌入式系统的软件调试过程存在着明显的差异。对于通用系统,调试工具与被调试的程序位于同一台计算机上,调试工具通过操作系统的调试接口来控制被调试的程序。但是在嵌入式系统中,由于资源的限制,不能直接在其上开发应用程序,调试过程通常也以交叉方式进行的。在实际开发实践中,经常采用的调试方法有直接测试法、调试监控法、在线仿真法、片上调试法及模拟器法等。
1.直接调试法
直接调试法就是将目标代码下载到目标机上,让其执行,通过观察指示灯来判断程序的运行状态。在嵌入式系统发展的早期一般采用这种方式进行调试,其基本步骤是:
(1)在宿主机上编写程序。
(2)在宿主机上编译、链接生成目标机可执行程序代码。
(3)将可执行代码写入目标机的存储器中。
(4)在目标机运行程序代码。
(5)判断程序的运行情况,如有错误则纠正错误,重复以上步骤,直到正确为止。
(6)将可执行代码固化到目标机,开发完成。
这种方法是最原始的调试方法,程序运行时产生的问题,只有通过检查源代码来解决,因而开发效率很低。
2.调试监控法
调试监控法也叫插桩法。目标机和宿主机一般通过串行口、并行口或以太网相连接,采用这种方法还需要在宿主机的调试器内和目标机的操作系统上分别启动一个功能模块,然后通过这两个功能模块的相互通信来实现对应用程序的调试。在目标机上添加的模块叫作桩,也叫调试服务器或调试监控器,主要有两个作用:其一,监视和控制被调试的程序;其二,跟宿主机上调试程序通信,接收控制指令,返回结果等。
在进行调试的时候,宿主机上的调试器通过连接线路向调试监控器发送各种请求,实现目标机内存读/写和寄存器访问、程序下载、单步跟踪和设置断点等操作。来自宿主机的请求和目标机的响应都按照预定的通信协议进行交互。 使用插桩法作为调试手段时,开发应用程序的基本步骤是:
(1)在宿主机上编写程序的源代码。
(2)在宿主机编译、链接生成目标机可执行程序。
(3)将目标机可执行代码下载到目标机的存储器中。
(4)使用调试器进行调试。
(5)在调试器帮助下定位错误。
(6)在宿主机上修改源代码,纠正错误,重复上述步骤直到正确为止。
(7)将可执行代码固化到目标机上。
相对于直接测试法,插桩法明显地提高了开发效率,降低了调试的难度,缩短了产品的开发周期,有效降低了开发成本。但是插桩法仍有明显的缺点,主要体现在以下几个方面:
(1)调试监控器本身的开发是个技术难题。
(2)调试监控器在目标机中要占用一定的系统资源,如 CPU 时间、存储空间及串口
或网络接口等外设资源。
(3)调试时,不能响应外部中断,对有时间特性的程序不适用。
(4)在调试过程中,被调试的程序实际上在调试监控器所提供的环境中运行,这个环境可能会与实际目标程序最终的运行环境有一定的差异,这种差异有可能导致调试通过的程序最后仍不能运行。
为了克服插桩法的缺点,出现了一种改良的方法,即 ROM 仿真器法。ROM 仿真器可以被认为是一种用于替代目标机上 ROM 芯片的硬件设备,ROM 仿真器一端跟宿主机相连,一端通过 ROM 芯片的引脚插座与目标机相连。对于嵌入式处理器来
说,ROM 仿真器像是一个只读存储器,而对于宿主机来说,像一个调试监控器。ROM 仿真器的地址可以实时映射到目标机的 ROM 地址空间里,所以它可以仿真目标机的 ROM。ROM 仿真器在目标机和宿主机之间建立了一条高速信息通道,其典型的应用就是跟插桩法相结合,形成一种功能更强的调试方法。该方法具有如下优点:
(1)不必再开发调试监控器。
(2)由于是通过 ROM 仿真器上的串行口、并行口或网络接口与宿主机连接,所以不
必占用目标机上的系统资源。
(3)ROM 仿真器代替了目标机上原来的 ROM,所以不必占用目标机上的存储空间来
保存调试监控器。
(4)另外,即使目标机本身没有 ROM,调试依然可以进行,并且不需要使用专门工
具向 ROM 写入程序和数据。
3.在线仿真法
ICE 是一种用于替代目标机上 CPU 的设备。对目标机来说,在线仿真器就相当于它的CPU,在线仿真器本身就是一个嵌入式系统,有自己的 CPU、内存和软件。在线仿真器的 CPU 可以执行目标机的所有指令,但比一般的 CPU 有更多的引脚,能够将内部信号输出到被控制的目标机上,在线仿真器的存储器也被映射到用户的程序空间,因此,即使没有目标机,仅用在线仿真器也可以进行程序的调试。
在线仿真器和宿主机一般通过串行口、并行口或以太网相连接。在连接在线仿真器和目标系统时,用在线仿真器的 CPU 引出端口替代目标机的 CPU。在用在线仿真器调试程序时,在宿主机运行一个调试器界面程序,该程序根据用户的操作指令控制目标机上的程序运行。 在线仿真器能实时地检查运行程序的处理器的状态,设置硬件断点和进行实时跟踪,所以提供了更强的调试功能。在线仿真器,支持多种事件的触发断点,这些事件包括内存读写、I/O 读写及中断等。在线仿真器的一个重要特性就是实时跟踪,在线仿真器上有大容量的存储器用来保存每个指令周期的信息,这个功能使用户可以知道事件发生的精确时序,特别适于调试实时应用、设备驱动程序和对硬件进行功能测试。但是,在线仿真器的价格一般都比较昂贵。
4.片上调试法
片上调试(In Circuit Debugger,ICD)是 CPU 芯片内部的一种用于支持调试的功能模块。按照实现的技术,片上调试可以分为仿调试监控器、后台调试模式(Background Debugging Mode,BDM)、连接测试存取组(Joint Test Access Group,JTAG)和片上仿真(On Chip Emulation,OnCE)等几类。仿调试监控器类的 ICD 芯片产品有 Motorola 的 CPU16、 CPU32 和ColdFire 等系列,BDM 类的主要有 Motorola 的 MPC5xx 和 MPC8xx 系列等, OnCE 类的主要有 Motorola 的 DSP 芯片系列,JTAG 类的主要有 PPC6xxx、PPC4xx、 ARM7TDMI、ARM9TDMI 及 Intel1960 等。
目前,使用较多的是采用 BDM 技术的 CPU 芯片。这种芯片的外面有跟调试相关的引脚,这些引脚在调试的时候被引出,形成一个与外部相连的调试接口,这种 CPU 具有调试模式和执行模式两种不同的运行模式。当满足了特定的触发条件时,CPU 进入调试模式,在调试模式下,CPU 不再从内存中读取指令,而是通过其调试端口读取指令,通过调试端口还可以控制 CPU 进入和退出调试模式。这样在宿主机上的调试器就可以通过调试端口直接向目标机发送要执行的指令,使调试器可以读/写目标机的内存和寄存器,控制目标程序的运行及完成各种复杂的调试功能。
- 该方法的主要优点是:不占用目标机的通信端口等资源;调试环境和最终的程序运行环境基本一致;无须在目标机上增加任何功能模块即可进行;支持软、硬断点;支持跟踪功能,可以精确计量程序的执行时间;支持时序逻辑分析等功能。
- 该方法的缺点是:实时性不如在线仿真器法强;使用范围受限,如果目标机不支持片上调试功能,则该方法不适用;实现技术多样,标准不完全统一,工具软件的开发和使用均不方便。
5.模拟器法
模拟器是运行于宿主机上的一个纯软件工具,它通过模拟目标机的指令系统或目标机操作系统的系统调用来达到在宿主机上运行和调试嵌入式应用程序的目的。
模拟器适合于调试非实时的应用程序,这类程序一般不与外部设备交互,实时性不强,程序的执行过程是时间封闭的,开发者可以直接在宿主机上验证程序的逻辑正确性。当确认无误后,将程序写入目标机上就可正确运行。模拟器有两种主要类型:一类是指令级模拟器,在宿主机模拟目标机的指令系统;另一类是系统调用级模拟器,在宿主机上模拟目标操作系统的系统调用。指令级的模拟器相当于宿主机上的一台虚拟目标机,该目标机的处理器种类可以与宿主机不同,如宿主机是英特尔的 x86 系列机,而虚拟机可以是 ARM、PowerPC、MIPS 等。比较高级的指令级模拟器还可以模拟目标机的外部设备,如键盘、串口、网络接口等。系统调用级的模拟器相当于在宿主机上安装了目标机的操作系统,使得基于目标机的操作系统的应用程序可以在宿主机上运行。被模拟的目标机操作系统的类型可以跟宿主机的不同。两种类型的模拟器相比较,指令级模拟器所提供的运行环境与实际目标机更为接近。
使用模拟器的最大好处是在实际的目标机不存在的条件下就可以为其开发应用程序,并且在调试时利用宿主机的资源提供更详细的错误诊断信息,但模拟器有许多不足之处:
(1)模拟器环境和实际运行环境差别很大,无法保证在模拟条件下通过的应用程序也能在真实环境中正确运行。
(2)模拟器不能模拟所有的外部设备,嵌入式系统通常包含诸多外设,但模拟器只能模拟少数部分。
(3)模拟器的实时性差,对于实时类应用程序的调试结果可能不可靠。
(4)运行模拟器需要较高的宿主机配置。尽管模拟器有很多的不足之处,但在项目开发的早期阶段,其价值是不可估量的,尤其对那些实时性不强的应用,模拟器调试不需要特殊的硬件资源,是一种非常经济的方法。