嵌入式系统的ppt课件.ppt
嵌入式系统设计与实例开发基于ARM微处理器与实时操作系统第二讲 基本概念及设计方法主讲教师:罗子波 副教授,本节提要,1,3,2,嵌入式系统硬件知识,嵌入式系统软件知识,嵌入式系统的选择原则和设计工具,嵌入式微处理器简介嵌入式微处理器体系结构嵌入式微处理器的分类,2.1 嵌入式系统硬件知识,嵌入式微处理器简介,嵌入式硬件系统组成: 嵌入式微处理器: 控制单元 ALU 寄存器 存储器 输入/输出单元,嵌入式处理器的基本结构(1),微处理器是整个系统的核心,通常由3大部分组成:控制单元、算术逻辑单元和寄存器。,嵌入式处理器的基本结构(2),控制单元:主要负责取指、译码和取操作数等基本动作,并发送主要的控制指令。控制单元中包括两个重要的寄存器:程序计数器(PC)和指令寄存器(IR)。程序计数器用于记录下一条程序指令在内存中的位置,以便控制单元能到正确的内存位置取指;指令寄存器负责存放被控制单元所取的指令,通过译码,产生必要的控制信号送到算术逻辑单元进行相关的数据处理工作。算术逻辑单元:算术逻辑单元分为两部分,一部分是算术运算单元,主要处理数值型的数据,进行数学运算,如加、减、乘、除或数值的比较;另一部分是逻辑运算单元,主要处理逻辑运算工作,如AND、OR、XOR或NOT等运算。寄存器:用于存储暂时性的数据。主要是从存储器中所得到的数据(这些数据被送到算术逻辑单元中进行处理)和算术逻辑单元中处理好的数据(再进行算术逻辑运行或存入到存储器中。,冯诺依曼体系结构和哈佛体系结构CISC与RISC信息存储的字节顺序IP 核流水线存储器系统,2.1.2 嵌入式微处理器体系结构,冯诺依曼体系结构模型,指令寄存器,控制器,数据通道,输入,输出,中央处理器,存储器,程序,指令0,指令1,指令2,指令3,指令4,数据,数据0,数据1,数据2,哈佛体系结构,指令寄存器,控制器,数据通道,输入,输出,中央处理器,程序存储器,指令0,指令1,指令2,数据存储器,数据0,数据1,数据2,地址,指令,地址,数据,CISC和RISC,CISC:复杂指令集(Complex Instruction Set Computer)具有大量的指令和寻址方式8/2原则:80%的程序只使用20%的指令大多数程序只使用少量的指令就能够运行。,RISC:精简指令集(Reduced Instruction Set Computer)在通道中只包含最有用的指令确保数据通道快速执行每一条指令使CPU硬件结构设计变得更为简单,CISC与RISC的数据通道,IF,ID,REG,ALU,MEM,开始,退出,IF,ID,ALU,MEM,REG,微操作通道,开始,退出,单通数据通道,CISC的背景和特点,背景:存储资源紧缺, 强调编译优化增强指令功能,设置一些功能复杂的指令,把一些原来由软件实现的、常用的功能改用硬件的(微程序)指令系统来实现为节省存储空间,强调高代码密度,指令格式不固定,指令可长可短,操作数可多可少寻址方式复杂多样,操作数可来自寄存器,也可来自存储器采用微程序控制,执行每条指令均需完成一个微指令序列(微程序)CPI ,指令越复杂,CPI越大。,CISC的主要缺点,指令使用频度不均衡。高频度使用的指令占据了绝大部分的执行时间,扩充的复杂指令往往是低频度指令。大量复杂指令的控制逻辑不规整,不适于VLSI工艺VLSI的出现,使单芯片处理机希望采用规整的硬联逻辑实现,而不希望用微程序,因为微程序的使用反而制约了速度提高。(微码的存控速度比CPU慢5-10倍)。软硬功能分配复杂指令增加硬件的复杂度,使指令执行周期大大加长,直接访存次数增多,降低了CPU性能。不利于先进指令级并行技术的采用流水线技术,RISC基本设计思想,减小CPI: CPUtime=Instr_Count * CPI * Clock_cycle精简指令集:保留最基本的,去掉复杂、使用频度不高的指令采用Load/Store结构,有助于减少指令格式,统一存储器访问方式采用硬接线控制代替微程序控制,典型的高性能RISC处理器,SUN公司的SPARC(1987)MIPS公司的SGI:MIPS(1986)HP公司的PA-RISC,IBM, Motorola公司的PowerPCDEC、Compac公司的Alpha AXPIBM的RS6000(1990)第一台Superscalar RISC机,CISC与RISC的对比,for (i = 0; i 10000; +i)/* 各种算术运算操作 */实验平台:桌面Intel Pentium4,带硬件浮点支持OperatorTimeOperatorTime+ (int)1+ (double)5* (int)5* (double)5/ (int)12/ (double)10(int)2sin48,小实验1,信息存储的字节顺序,大端模式字数据的高位字节存储在低地址中字数据的低字节则存放在高地址中小端模式低地址中存放字数据的低字节高地址中存放字数据的高字节,示例,A. 小端存储法(0 x01234567),B. 大端存储法,The ARM 可以用 little/big endian 格式存取数据.,r0 = 0 x11223344,STR r0, r1,LDRB r2, r1,r1 = 0 x100,Memory,3 2 1 0,0 1 2 3,Byte Lane,31,24,23,16,15,8,7,0,11,22,33,44,31,24,23,16,15,8,7,0,11,22,33,44,31,24,23,16,15,8,7,0,11,22,33,44,31,24,23,16,15,8,7,0,00,00,00,44,31,24,23,16,15,8,7,0,00,00,00,11,Little endian,Big endian,R2 = 0 x44,R2 = 0 x11,For more information, see: “Application Note 61: Big and Little Endian Byte Addressing”,字节顺序,2.1.3 嵌入式微处理器的分类,本节提要,1,3,2,嵌入式系统硬件知识,嵌入式系统软件知识,嵌入式系统的选择原则和设计工具,2.2.1 嵌入式软件概述,规模较小开发难度大实时性和可靠性要求高要求固化存储,2.2.1 嵌入式软件体系结构,无操作系统的情形在嵌入式系统的发展初期,由于硬件的配置比较低,对于是否有系统软件的支持,要求还不是很强烈。在那个阶段,嵌入式软件的设计主要是以应用为核心,应用软件直接建立在硬件上,没有专门的操作系统。有操作系统的情形,无操作系统的情形,循环轮询系统:(Polling Loop)最简单的软件结构,程序依次检查系统的每个输入条件,一旦条件成立就进行相应的处理。Initialize();while(1) if(condition_1) action_1(); if(condition_2) action_2(); if(condition_n) acition_n();,事件驱动系统:(Event-Driven system)事件驱动系统是能对外部事件直接响应的系统。它包括前后台、实时多任务、多处理器等,是嵌入式实时系统的主要形式。应用程序是一个无限循环,循环中调用相应的函数完成相应操作,这部分可以看成后台行为(background)。中断服务程序处理异步事件,这部分可看成前台行为(foreground)。后台也可以叫做任务级,前台也叫中断级。,例如,很多基于微处理器的产品采用前后台系统设计,如微波炉、电话机、玩具等。从省电的角度出发,平时微处理器处在停机状态,所有的事都靠中断服务来完成。,前后台系统(后台循环、前台中断),ISR,ISR,后台 前台,ISR,时间,提高了系统可靠性提高了系统的开发效率,降低了开发成本,缩短了开发周期有利于系统的扩展和移植,有操作系统的情形,2.2.3 嵌入式操作系统的分类,按系统的类型分:商用系统专用系统开源系统按响应时间分:实时硬实时系统软实时系统非实时,按软件结构分类,单体结构(Monolithic Structure)分层结构(Layered Structure)Out of date微内核结构(Microkernel Model),单体结构,最常用的组织结构;整个系统只有一个可执行文件,包含所有的操作系统组件;系统的结构就是无结构,由一组函数组成,相互之间可以随意地调用。,应用软件,文件I /O,存储管理,进程管理,I/O驱动,存储驱动,中断驱动,硬件,单体内核,分层结构,在分层结构(layered)中,一个操作系统被划分为若干个层次(0.N),各个层次之间的调用关系是单向的,即某一层次上的代码只能调用比它低层的代码。这种结构要求在每个层次上都要提供一组API接口函数,这就会带来额外的开销,微内核,设备驱动程序,微内核结构,操作系统内核只包含最少的功能,如存储管理和进程管理;其他的操作系统组件以中间件的形式存在于内核之外;设备驱动程序完全从内核中剥离,独立成为一层。,中间件、应用软件,存储管理,进程管理,I/O驱动,存储驱动,中断驱动,硬件,有操作系统的情形,硬件,板级初始化,设备驱动层,以太网驱动,串口驱动,LCD驱动,键盘驱动,操作系统层,中间件层,应用软件层,TCP/IP网络系统,文件系统,内核,嵌入式GUI,嵌入式CORBA,嵌入式JAVA,嵌入式DCOM,面向领域的中间件,WWW浏览器,MP3播放器,电子邮件,为什么要有设备驱动程序?嵌入式硬件设备本身无法工作,需要软件来驱动,如初始化、控制、数据读写等。什么是设备驱动程序?直接与硬件打交道、对硬件进行控制和管理的软件。在一个嵌入式系统中,设备驱动程序是必不可少的。,设备驱动程序,设备驱动程序的主要功能,硬件启动(Startup):在开机上电或重启的时候,对硬件进行初始化;硬件关闭(Shutdown):把硬件配置成关机状态;硬件停用(Disable):暂停使用硬件;硬件启用(Enable):重新启用硬件;硬件读操作(Read):从硬件中读取数据;硬件写操作(Write):往硬件中写数据;,嵌入式中间件,中间件(Middleware):在OS内核、设备驱动程序和应用软件之外的所有系统软件;中间件的基本思路:把原本属于应用软件层的一些通用的功能模块抽取出来,形成独立的一层软件,从而为运行在其上的各个应用软件提供一个灵活、安全、移植性好、相互通信、协同工作的平台;优点:实现软件的可重用,降低应用软件的复杂性,降低开发成本。,2.2.4 嵌入式操作系统的几个概念,占先式内核调度策略分析任务优先级分配时间的可确定性任务切换时间中断响应时间优先级反转任务执行时间的抖动任务划分,2.2.5 常见的嵌入式操作系统,实时嵌入式操作系统的种类繁多,大体上可分为两种,商用型和免费型。商用型的实操作系统功能稳定、可靠,有完善的技术支持和售后服务,但往往价格昂贵C/OS 。免费型的实时操作系统在价格方面具有优势,目前主要有Linux和,稳定性与服务性存在挑战。,VxWorks,VxWorks操作系统是美国WindRiver公司于1983年设计开发的一种嵌入式实时操作系统(RTOS),具有良好的持续发展能力、高性能的内核以及友好的用户开发环境,在嵌入式实时操作系统领域牢牢占据着一席之地。VxWorks所具有的显著特点是: 可靠性、实时性和可裁减性。 它支持多种处理器,如x86、i960、Sun Sparc、Motorola MC68xxx、MIPS 、POWER PC等等。 大多数的VxWorks API是专有的,火星机器人。,Windows Embedded,Windows CE 3.0:一种针对小容量、移动式、智能化、32位、连接设备的模块化实时嵌入式操作系统。针对掌上设备、无线设备的动态应用程序和服务提供了一种功能丰富的操作系统平台, WindowsCE嵌入但不够实时,属于软实时操作系统,由于其Windows背景,界面比较统一认可。操作系统的基本内核需要至少200K的ROM。,Palm OS,Palm OS是著名的网络设备制造商3COM旗下的Palm Computing掌上电脑公司的产品。3COM、CISCO竞争Palm OS在PDA市场上占有很大的市场份额, Palm OS的市场份额占到将近90%,最近下降70,目前主要与WIN CE进行激烈竞争。,QNX,加拿大QNX公司的产品。 QNX是在X86体系上面开发出来的,这和别的RTOS不一样,别的好多RTOS都是从68K的CPU上面开发成熟,然后再移植到X86体系上面来的。 QNX是一个实时的、可扩充的操作系统,它部分遵循POSIX相关标准,由于QNX具有强大的图形界面功能,因此很适合作为机顶盒、手持设备(手掌电脑、手机)、GPS设备的实时操作系统使用。,嵌入式Linux,嵌入式系统越来越追求数字化、网络化和智能化。因此原来在某些设备或领域中占主导地位的软件系统越来越难以为继,整个系统必须是开放的、提供标准的API,并且能够方便地与众多第三方的软硬件沟通。Linux是开放源码的,不存在黑箱技术,遍布全球的众多Linux爱好者又是Linux开发的强大技术后盾。Linux的内核小、功能强大、运行稳定、系统健壮、效率高,易于定制剪裁,在价格上极具竞争力。Linux不仅支持x86 CPU,还可以支持其他数十种CPU芯片。,嵌入式Linux(Embedded Linux)是指对Linux经过小型化裁剪后,能够固化在容量只有几百K字节或几兆字节的存储器芯片或单片机中,应用于特定嵌入式场合的专用Linux操作系统。嵌入式Linux的开发和研究是目前操作系统领域的一个热点。主要有RTLinux和CLinuxLinux在嵌入式领域异军突起不过是近两年的事情,过去的一年中有13%的用户已经开始使用嵌入式Linux系统进行开发工作;有52%的用户决定在未来24个月内开始使用Linux作为嵌入式操作系统的开发原型。,嵌入式Linux及应用,C/OS及C/OS-II,1、C/OSMicro Controller O S,微控制器操作系统2、 C/OS简介美国人Jean Labrosse 1992年完成应用面覆盖了诸多领域,如照相机、医疗器械、音响设备、发动机控制、高速公路电话系统、自动提款机等 1998年C/OS-II,目前的版本C/OS -II V2.61,2.722000年,得到美国航空管理局(FAA)的认证,可以用于飞行器中网站www.ucos-II.com(),嵌入式C程序设计,“which of the following programming languageshave you used for embedded systems in the last12 months”C81%Assembly70%C+39%Visual Basic16%Java7%Source: “ESP: A 10-year retrospective”, EmbeddedSystems Programming, November, 1998,嵌入式软件的目标,函数必须正确;源代码简洁、可读性好、可维护;实时性要求较高的代码能够运行得足够快;目标代码小且高效。总之,要优化对以下三种资源的使用:执行时间;存储空间;开发/维护时间。,数据类型与运算符,宏定义:用一个指定的标识符来代表一个字符串。#define 标识符 字符串如:#define PI 3.1415926,其作用是指定用标识符PI来代替“3.1415926”这个字符串,在编译预处理时,将程序中出现的所有PI都用“3.1415926”代替。,(1)宏定义,宏定义的基本思想是:一次定义,多次使用。其优点是:可以用简短的标识符来代替长的数据,减少需要输入的字符数;用易于理解的标识符来代替那些不太好记的具体的数据,便于程序的理解和维护;有利于程序的修改和升级,当这个数据需要修改时,只需改动宏定义之处即可。,不用此法,一次定义,多次使用,(2)const常量,常量数据:整数(12)、字符(a)、 字符串(“hello”)和实数(3.14)等; 以变量的形式来定义的一个量,并且通 过使用关键字const,来表明这个变量的 值不能被改变。如:const int x = 1。,(3)算术运算,整数的算术运算最快带有硬件支持的浮点运算较慢用软件来实现的浮点运算非常慢,快 sin, log, sqrt, etc慢,结论:尽量使用整数(char、short、int和long)的加法和减法;如果没有硬件支持,尽量避免使用乘法;尽量避免使用除法;如果没有硬件支持,尽量避免使用浮点数;数学库函数使用得越少越好。,(4)位运算,C语言有很多位操作运算符:&与操作;|或操作;异或操作;取反操作;右移操作;左移操作。,a |= 0 x4b &= 0 x4c &= (1 = 2,/ 把第2位设置为1,/ 把第2位设置为0,/ 把第3位设置为0,/ 把第5位反转,/ 把 e 除以4,int x, num = 99, count = 0;x = num;while(x) count +; x = x ,result: 4,分支语句,if (a = 1) ant();else if (a = 2) bar();else if (a = 3) cee();else if (a = 4) due();else if (a = 5) eat();else if (a = 6) foo();,switch (a) case 1: ant(); break; case 2: bar(); break; case 3: cee(); break; case 4: due(); break; case 5: eat(); break; case 6: foo(); break;,Any Differences?,if-then-else语句的汇编代码,$L1: cmp dword ptrebp-4, 1 #把a与常量1进行比较 jne $L2 #如果不相同,跳到$L2继续比较下一个值 call _ant #如果相同,调用ant()函数 jmp $END #跳转到这段代码的末尾$L2: cmp dword ptrebp-4, 2 #把a与常量2进行比较 jne $L3 #如果不相同,跳到$L3继续比较下一个值 call _bar #如果相同,调用bar()函数 jmp $END #跳转到这段代码的末尾$L3: .$END:,switch语句的汇编代码-1,JmpTable dword $L1,$L2,$L3,$L4,$L5,$L6 mov eax,dword ptr ebp-4 #取出变量a的值 mov dword ptr ebp-8,eax #保存在临时变量中 mov ecx,dword ptr ebp-8 #取出,放在ecx中 sub ecx,1 #减1 mov dword ptr ebp-8,ecx #保存回去 cmp dword ptr ebp-8,5 #与5进行比较 ja $END #若大于5,结束 mov edx,dword ptr ebp-8 #取出该值,放edx jmp dword ptr edx*4+JmpTable#跳转到相应的 #case标记,switch语句的汇编代码-2,$L1:# case 1 call _ant jmp $END$L2:# case 2 call _bar jmp $END.$L5:# case 5 call _eat jmp $END$L6:# case 6 call _foo$END:,结论:假设a的取值个数为n,对于if-then-else语句,时间复杂度为O(n),而对于switch语句,时间复杂度为O(1);如果n的值较小,两种语句均可;如果n的值较大,则switch语句更佳。,函数,函数原型main ( ) 函数调用 函数定义,函数的使用模式,声明该函数,定义一个函数,使用该函数,内存分布状况,全局变量区域,静态分配,栈,自动分配,堆,动态分配,主函数的执行过程,int z;void main( ) int x, y; x = 1; y = 2; z = x + y;,全局变量区域,栈帧(main),x = y =,程序,1,2,3,控制流与数据流,控制流:程序当前执行位置的流向;数据流:函数调用发生及结束时,数据在 函数之间流转的过程。,当一个函数被调用时:在内存的栈空间当中为其分配一个栈帧,用来存放该函数的形参和局部变量;把实参变量的值复制到相应的形参变量;控制转移到该函数的起始位置;该函数开始执行;控制流和返回值返回到函数调用点。,函数调用过程,控制流的变化,void main( ) double x, y, z; y = 6.0; x = Area( y / 3.0 ); . z = 3.4 * Area(7.88); .,/* 给定半径,计算一个圆的面积 */double Area(double r) return(3.14 * r * r);,一个简单的例子,int Times2(int value);main ( ) int number; printf(“请输入一个整数:”); scanf(“%d”, ,int Times2(int value);main ( ) int number; printf(“请输入一个整数:”); scanf(“%d”, ,main,number,3,Times2,value,Times2也得到一个栈帧,它的参数看成局部变量,int Times2(int value);main ( ) int number; printf(“请输入一个整数:”); scanf(“%d”, ,main,number,3,Times2,value,3,“值传递”, 把实参的值传给形参。,int Times2(int value);main ( ) int number; printf(“请输入一个整数:”); scanf(“%d”, ,main,3,把Times2的栈帧叠在主函数的栈帧之上,说明在执行Times2函数时,主函数中的变量是不可见的。,Times2,value,3,int Times2(int value);main ( ) int number; printf(“请输入一个整数:”); scanf(“%d”, ,6,Times2函数的返回值被放在函数的调用位置上,然后,分配给Times2函数的堆栈区域被释放。,变量的存储与作用域,/* 全局变量,固定地址,其他源文件可见 */int global_static;/* 静态全局变量,固定地址,但只在本文件中可见 */static int file_static;/* 函数参数:位于栈帧当中,动态创建,动态释放 */int foo(int auto_param) /*静态局部变量,固定地址,只在本函数中可见 */ static int func_static; /* 普通局部变量,位于栈帧当中,只在本函数可见 */ int auto_i, auto_a10; /* 动态申请的内存空间,位于堆当中 */ double *auto_d = malloc(sizeof(double)*5); return auto_i;,可重入函数-1,可以被一个以上的任务调用,而不必担心数据的破坏。可重入型函数任何时候都可以被中断,一段时间以后又可以运行,而相应数据不会丢失。可重入型函数只使用局部变量,即变量保存在CPU寄存器或栈中。一个不可重入型函数的例子int temp;void swap(int *x, int *y) temp = *x; *x = *y; *y = temp;,可重入函数-2,一个可重入型函数的例子void swap(int *x, int *y) int temp; temp = *x; *x = *y; *y = temp;,不可重入函数被中断破坏,本节提要,1,3,2,嵌入式系统硬件基础,嵌入式系统软件基础,嵌入式系统的选型选择原则和设计工具,2.3.1 嵌入式系统的选型原则,硬件平台的选择 内核的选择: 取决于应用的领域、用户的需求、成本、开发的难易程度等 外围设备的选择:,2.3.1 嵌入式系统的选型原则,2.操作系统的选型原则 操作系统的硬件支持 开发工具的支持程度 能否满足应用需求 自建操作系统,2.3.2 嵌入式系统的设计工具,嵌入式系统的设计方法,嵌入式系统的设计方法,系统需求分析,系统集成,系统测试,产品,硬件设计,软件设计,执行装置设计,体系结构设计,2.3.3 嵌入式系统开发模式,宿主机目标机宿主机与目标机的连接,嵌入式开发工具与开发环境,嵌入式软件开发流程,桌面应用程序的编译和加载过程,嵌入式应用程序的编译和加载过程,2.3.4 嵌入式软件开发工具,设计,生产,IDE,评估板,仿真器,逻辑分析仪,边界扫描测试仪,编程器,开发环境,什么是嵌入式开发环境:,源程序,目标文件,可重定位程序,可执行文件,编译器/汇编器/链接定位器调试器/仿真器主机(Host)及其工作平台实时操作系统(可选)目标评估系统(可选)测试工具(软件/硬件/协议等,可选)其他辅助设备(可选),典型的开发环境,ARM的编译器(1),ADS1.2ARM公司出品IDE环境,包括ARM/Thumb汇编器:armasmANSI C 编译器 - armcc 和 tccISO / Embedded C+ 编译器 - armcpp and tcpp链接器 armlinkWindows 集成开发环境 CodeWarrior格式转换器 fromelf库管理器 - armar调试器模拟调试器:ARMulatorJTAG调试:AXD(与Multi-ICE配合)支持所有ARM内核,最新版本:RealView2.0,ARM的编译器(2),EW-ARM瑞典IAR公司出品著名的嵌入式工具提供商,以提供编译器/协议栈/统一建模工具著称主要产品:Embeded Workbench(EW)、Make APP、Visual State等EW-ARM:针对ARM的集成开发环境:C/C+编译器C-SPY 模拟调试器ROM-Monitor多种级别代码优化方法,满足用户在速度、文件大小方面的要求内建ARM特性优化器支持多种断点模式支持Nucleus, VxWorks等RTOSGreenhillsGNU,嵌入式系统的调试(1),嵌入式系统的调试的几种基本方法: 直接测试法调试监控器法ROM 仿真器法在线仿真器法片上调试法模拟调试(Simulator),调试监控器法,主机和目标板通过某种接口(通常是串口)连接,主机上提供调试界面,待调试软件下载到目标板上运行。 这种方式的先决条件是要在Host和Target之间建立起通信联系(目标板上称为监控程序Monitor)优点:纯软件,价格较低,简单,软件调试能力较强缺点:需要事先烧制Monitor(往往需多次试验才能成功)且目标板工作正常,功能有限,特别是硬件调试能力较差。,PC,Target,Monitor,串口,片上调试法,BDM/JTAG调试 这种方式有一个硬件调试体。该硬件调试体与目标板通过BDM、JTAG等调试接口相连,与主机通过串口、并口、网口或USB口相连。待调试软件通过BDM/JTAG调试器下载到目标板上运行。优点:方便、简单,无须制作Monitor,软硬件均可调试缺点:需要目标板,且目标板工作基本正常(至少MCU工作正常),仅适用于有调试接口的芯片,Target,PC,接口,BDM/JTAG Debugger,在线仿真器法,全仿真调试(Emulator) 这种方式用仿真器完全取代目标板上的MCU,因而目标系统对开发者来说完全是透明的、可控的。仿真器与目标板通过仿真头连接,与主机有串口、并口、网口或USB口等连接方式。由于仿真器自成体系,调试时既可以连接目标板,也可以不连接目标板(Stand alone)。优点:功能非常强大,软硬件均可做到完全实时在线调试缺点:价格昂贵。,ARM的调试方式,模拟调试SDT2.52: ARMulatorADS1.2:ARMulatorTrace32:SimulatorEW-ARM:C-spy软件调试ADS1.2:Angel(串口)SDT2.52 Angel(串口)JTAG调试ARM:Multi-ICE,简易型仿真器Trace32-ICD for ARMHitex:Tanto for ARM全仿真调试Trace32-FIRE/ICE,ARM调试工具,Multi-ICEARM公司出品与ADS配套使用支持不同的ARM内核另有Multi-trace模块可选,谢 谢 各 位,