1.72k likes | 1.85k Views
第 4 章 基于 ARM 的硬件结构设计. 主讲 马洪连. 4.1 概述. ARM 公司将嵌入式微处理器内核作为知识产权 IP 推向了市场,因此基于 ARM 架构的微处理器在市场上占有众多份额,并被不同的具有 IP 的公司生产为不同型号和封装格式的嵌入式微处理器。如具有处理器内核形式的,也有处理器核形式的。 半导体厂商或片上系统 SoC 设计应用厂商采用 ARM 架构来生产相应的 MPU 或 SoC 芯片。 ARM 系统设计人员在 MPU 或 SoC 芯片的基础上根据实际需求再进行硬件系统一级的扩展和软件系统的裁剪和应用程序的编写。.
E N D
第4章 基于ARM的硬件结构设计 主讲 马洪连
4.1概述 ARM公司将嵌入式微处理器内核作为知识产权IP推向了市场,因此基于ARM架构的微处理器在市场上占有众多份额,并被不同的具有IP的公司生产为不同型号和封装格式的嵌入式微处理器。如具有处理器内核形式的,也有处理器核形式的。 半导体厂商或片上系统SoC设计应用厂商采用ARM架构来生产相应的MPU或SoC芯片。 ARM系统设计人员在MPU或SoC芯片的基础上根据实际需求再进行硬件系统一级的扩展和软件系统的裁剪和应用程序的编写。
4.1.1、嵌入式系统的设计原则和步骤 嵌入式系统设计的重要特点是技术多样化,即实现同一个嵌入式系统可以有许多不同的设计方案选择,而不同的设计方案就意味使用不同的设计和生产技术。 嵌入式系统设计一般步骤 1)需求分析 2)体系结构设计 3)硬件/软件设计 4)系统集成和系统测试 注意:各个阶段之间往往要求不断的反复和修改,直至完成最终设计目标。
1)需求分析阶段包括 • 分析用户的需求 • 确定硬件软件 • 检查需求分析的结果 • 确定项目的约束条件 • 概要设计
需求分析-罗列用户的需求 (1)系统用于什么任务? (2)系统接收什么输入和输出什么信号? (3)用户需要如何同系统打交道? (4)系统的重量和体积如何? (5)系统需要连接何种外设? (6)系统是否需要运行某些现存的软件? (7)系统处理哪种类型的数据? (8)系统是否要与别的系统通讯? (9)系统是单机还是网络系统?
需求分析-罗列用户的需求 (10)系统的响应时间是多少? (11)需要什么安全措施?在什么样的环境下运行? (12)外部存储媒介和内存需要多大? (13)系统可拆装性,可靠性,牢固性的期望值是什么? (14)如何给系统供电? (15)系统如何向用户通报故障? (16)是否需要任何手动或机械代用装置? (17)系统是否将具有远程诊断或更正问题的功能? (18)其他问题
2)体系结构设计 • 设计目的—描述系统的功能如何实现。 • 决定因素— ①系统是硬实时系统还是软实时系统; ②操作系统是否需要嵌入; ③物理系统的成本、尺寸和耗电量是否是产品成功的关键因素; ④选择处理器和相关硬件; ⑤其他。
3)硬件/软件设计 (1)设计目的 决定哪些用硬件实现,哪些用软件实现。例如: 浮点运算;网络通信控制器实现的功能;软调制解调器/硬调制解调器;软件压缩解压/硬件压缩解压图像。 (2)硬件设计 ①设计硬件子系统(top-down方法) 分成模块;设计框图。例如:CPU子系统、存储器子系统等 。 ②定义硬件接口 I/O端口;硬件寄存器;共享内存;硬件中断;存储器空间分配;处理器的运行速度。
3)硬件/软件设计 (3)软件设计 • 设计软件子系统:软件总体设计、模块设计。 • 定义软件接口:模块接口、函数接口。 (4)检查设计 • 小项目:自己审查设计文档 • 中等项目:拿给同事朋友并向他们解释你的设计 • 大型项目-审查会:设计者应作一个更正式的报告。由于这是一个设计审查会,召集一群人,主要由工程师组成,并尽可能包括一些对项目有不同看法角度的成员,如做市场的人员、最终用户。
4)系统集成与测试 • 系统集成 把系统的软件、硬件和执行装置集成在一起,进行调试,发现并改进设计过程中的错误。 • 系统测试 对设计好的系统进行测试,看其是否满足给定的要求。
4.1.2 嵌入式系统选型原则 1)嵌入式操作系统选型原则 当进行设计信息电器、数字医疗设备等嵌入式产品时,嵌入式操作系统的选择至关重要。一般而言,在选择嵌入式操作系统时,可以遵循以下原则:就是“做加法还是做减法”的问题。
(1)市场进入时间 制定产品时间表与选择操作系统有关系。目前Windows程序员是人力资源最丰富的。现成资源最多的也是WinCE,使用WinCE能够很快进入市场。因为应用WinCE+X86做产品实际上是在做减法,去掉你不要的功能,能很快出产品,但伴随的可能是成本高,核心竞争力差。而某些高效的操作系统可能由于编程人员缺乏,或由于这方面的技术积累不够,影响开发进度。
(2)可移植性 当进行嵌入式软件开发时,可移植性是要重点考虑的问题。良好的软件移植性应该比较好,可以在不同平台、系统上运行,跟操作系统无关。软件的通用性和软件的性能通常是矛盾的,通常以损失某些特性情况下的优化性能为代价。
(3)可利用资源 产品开发不同于学术课题研究,它是以快速、低成本、高质量的推出适合用户需求的产品为目的的。集中精力研发出产品的特色,其他功能尽量由操作系统附加或采用第三方产品,因此操作系统的可利用资源对于选型是一个重要参考条件。Linux和WinCE都有大量的资源可以利用,这是它们被看好的重要原因。
(4)系统定制能力 信息产品不同于传统PC机结构的单纯性,用户的需求是千差万别的,硬件平台也都不一样,所以对系统的定制能力提出了要求。要分析产品是否对系统底层有改动的需求,这种改动是否伴生着产品特色? Linux由于其源代码开放的天生魅力,在定制能力方面具有优势。随着WinCE 原码的开放,以及微软在嵌入式领域力度的加强,其定制能力会有所提升。
(5) 成本 成本是需要综合权衡以后进行考虑的---选择某一系统可能会对其它一系列的因素产生影响,如对硬件设备的选型、人员投入、以及公司管理和与其它合作伙伴的共同开发之间的沟通等许多方面的影响。
(6) 中文内核支持 国内产品需要对中文的支持。由于操作系统多数是采用西文方式,是否支持双字节编码方式,是否遵循GBK,GB18030等各种国家标准,是否支持中文输入与处理,是否提供第三方中文输入接口等等,这些是针对国内用户的嵌入式产品的必需考虑的重要因素。
2)嵌入式操作系统选择的原则 (1)操作系统的硬件支持,是否支持目标硬件平台、可移植性; (2)开发工具的支持程度 ; (3)能否满足应用要求,对操作系统性能的要求、中文内核支持、标准兼容性、技术支持、源代码还是目标代码、许可(一次性付费?) 如自建操作系统,一种是完全从内核开始,另一种是在免费的源代码公开的内核上写自己的RTOS。
4.1.3 嵌入式系统开发环境、方法和开发经验 1.概述 嵌入式系统通常是一个资源受限的系统,因此直接在嵌入式系统的硬件平台上编写软件比较困难。目前一般采用的解决办法是首先在通用计算机(宿主机)上编写程序,然后通过交叉编译生成目标机上可以运行的二进制代码格式,然后通过串口或者以太网接口将交叉编译生成的目标代码传输并装载到目标机上,并在监控程序或者操作系统的支持下利用交叉调试器、JTAG调试装置或ICE进行分析和调试,最后目标机脱离宿主机单独运行。
2. 嵌入式软件开发工具 “工欲善其事,必先利其器” 嵌入式软件开发工具的集成度和可用性将直接关系到嵌入式系统的开发效率。ARM的开发工具包括有编译器、汇编器、连接器、调试器、操作系统、函数库、评估板、JTAG调试器、在线仿真器等。目前世界上约有40多家公司提供不同类型的产品。 在Windows环境下,其代表产品是ARM公司的软件开发工具包ADS和新推出的RVDS。 在Linux环境中,主要使用GNU开发工具。
开发工具的分类 根据不同的阶段,嵌入式软件开发工具可以分为: • 需求分析工具(Requirement Analysis Tools) • 软件设计工具(Software Design Tools) • 编码、调试工具(Coding Tools) • 测试工具(Testing Tools) • 配置管理工具、维护工具等
开发工具的分类 嵌入式软件的开发可以分为以下几种 : • 编写简单的板级测试软件,主要是辅助硬件的调试 • 开发基本的驱动程序 • 开发特定嵌入式操作系统的驱动程序(板级支持包) • 开发嵌入式系统软件,如:嵌入式操作系统等 • 开发应用软件
3.嵌入式系统开发环境和开发过程 • 建立交叉开发环境是进行嵌入式软件开发的第一步,目前常用的交叉开发环境主要有开放和商业两种类型。开放的交叉开发环境的典型代表是GNU工具链、目前已经能够支持x86、ARM、MIPS、PowerPC等多种处理器。商业的交叉开发环境则主要有Metrowerks CodeWarrior、ARMSoftware Development Toolkit、Embedded Visual C++等。
1)嵌入式软件的交叉开发环境 • 交叉开发环境是指用于嵌入式软件开发的所有工具软件的集合,一般包括: • 文本编辑器 • 交叉编译器 • 交叉调试器 • 仿真器 • 下载器等 • 交叉开发环境由宿主机和目标机组成,宿主机与目标机之间在物理连接的基础上建立起逻辑连接。
开发平台 运行平台 Host Target 宿主机开发环境 目标机应用系统 —编辑 调 —应用软件 运 试 —编译 行 —应用中间件 代 —连接 库 OS —目标机 理 —调试 目标机硬件 宿主机 OS DownLoad 宿主机硬件 交叉开发环境
嵌入式软件的交叉开发环境 • 物理连接和逻辑连接 • 物理连接是指宿主机与目标机通过物理线路连接在一起,连接方式主要有三种: • 串行通信口 • 局部以太网口 • OCD(On Chip Debug)方式,如JTAG、BDM等 • 物理连接是逻辑连接的基础。 • 逻辑连接指宿主机与目标机间按某种通信协议建立起来的通信连接,目前逐步形成了一些通信协议的标准。
2)嵌入式软件实现阶段的开发过程 • 嵌入式软件的开发进入实现阶段,可分为三个步骤:生成、调试和固化运行。 • 软件的生成主要是在宿主机上进行,利用各种工具完成对应用程序的编辑、交叉编译和链接工作,生成可供调试或固化的目标程序。 • 调试是通过交叉调试器完成软件的调试工作。调试完成后还需进行必要的测试工作。 • 固化运行是先用一定的工具将应用程序固化到目标机上,然后启动目标机,在没有任何工具干预的情况下应用程序能自动地启动运行。
(1)嵌入式软件生成阶段 库文件 • 三个过程 • 源代码程序的编写 • 编译成各个目标模块 • 链接成可供下载调试或固化的目标程序 源程序 目标模块 可供调试/固化 编辑器 交叉编译器 交叉链接器
ARM映像文件格式 • 映像文件是计算机上的一个可执行文件,在执行之前被加载到计算机存储器中。 • ARM集成开发环境中的各种原文件(汇编、C以及C++程序)经过ARM编译器编译之后,生成ELF格式的目标文件。这些目标文件和相应的C/C++运行时库经过ARM连接器连接后,生成.axf映像文件。在开发板上调试运行后,使用fromelf工具将映像文件中的调试信息和注释过滤掉生成二进制的可加载文件.bin。可加载文件可写入嵌入式设备的ROM中,再加电启动过程执行。
嵌入式软件的生成 • 这一过程与普通计算机开发过程的本质区别是在于交叉编译器和交叉连接器。 • 其中交叉编译器的主要功能是把在宿主机上编写的高级语言程序编译成可以在目标机上运行的二进制代码。常见的ARM软件开发环境有两种: ①ARM公司开发的集成开发环境ADS 1.2,该开发环境使用了CodeWarrior公司的编译器,使用ADX进行本地和远程调试。ADS有一系列应用程序及相关文档、范例组成,主要包括命令行开发工具、GUI开发工具、实用工具和支持软件。使用它们就可以编写和调试自己的应用程序了。
②GNU交叉工具链 GNU开发工具包括C编译器GCC、C++编译器G++、汇编器AS、连接器LD、二进制转换工具、调试工具GDB和基于不同硬件平台的开发库。 其中,GCC几乎在各种常见的UNIX平台上都可以见到,即使是Windows32也有GCC的移植。 GDB支持远程调试模式,同时还包含一个ARM指令集,能够在PC机上通过软件方式仿真ARM程序的执行。以上这些工具顺序使用,必须保持前后一致,才能产生最终需要的二进制文件,所以称作为工具链。
(2)嵌入式软件的生成 • 以上两种开发环境的编译器都完全支持ARM指令集,但伪指令集不同,代码风格不同,此外生成的二进制代码的执行效率上也略有不同。 • 嵌入式软件的运行方式主要有两种:调试方式和固化方式。在不同方式下,程序代码或数据在目标机内存中的定位也有所不同。宿主机上提供一定的工具或者手段对目标程序的运行方式和内存定位进行选择和配置,链接器再根据这些配置信息将目标模块和库文件中的模块链接成目标程序,因此称这样的链接器为交叉链接器。
(3)嵌入式软件的调试 在嵌入式软件开发中,调试时采用的是在宿主机和目标机之间进行的远程调试,调试器仍然运行在宿主机的通用操作系统之上,但被调试的进程却是运行在基于特定硬件平台的嵌入式操作系统中,调试器和被调试进程通过串口或者网络进行通信。调试器可以控制、访问被调试的进程,读取被调试进程的当前状态,并能够改变被调试进程的运行状态。 远程调试(Remote Debug)允许调试器以某种方式控制目标机上被调试进程的运行方式,并具有查看和修改目标机上内存单元、寄存器以及被调试进程中的变量值等各种调试功能。
远程调试的特点 • 调试器和被调试程序运行在不同的机器上,调试器运行在宿主机上,而被调试程序则运行在各种专业调试板上(目标机)。 • 调试器通过某种通信方式与被调试进程建立联系,如串口、并口、网络、JTAG或者专用的通信方式。
2)交叉编译、交叉调试方法 • 交叉编译:把在宿主机上编写的高级语言程序编译成可以运行在目标机上的代码,即在宿主机上能够编译生成另一种CPU(嵌入式微处理器)上的二进制程序。 • 交叉调试器是指调试程序和被调试运行在不同机器上的调试器,能够通过某种方式控制目标机上被调试程序的运行方式,并且通过调试器能查看和修改目标机上的内存、寄存器以及被调试程序中的变量等。
交叉调试 非交叉调试 调试器和被调试程序运行在不同的计算机上 调试器和被调试程序运行在同一台计算机上 可独立运行,无需操作系统支持 需要操作系统的支持 被调试程序的装载由调试器完成 被调试程序的装载由专门的Loader程序完成 需要通过外部通信的方式来控制被调试程序 不需要通过外部通信的方式来控制被调试程序 可以直接调试不同指令集的程序 只能直接调试相同指令集的程序
嵌入式系统交叉调试的方式 交叉调试的方式执行即调试器控制被调试程序的运行常通过如下五种方式: 指令集模拟器、ROM Monitor方式、JTAG调试方式、实时在线仿真器ICE方式和基于Angel的调试方式。
①指令集模拟器 • 指令集模拟器是用来在一台计算机上模拟另一台计算机上目标程序运行过程的软件工具,也成为软仿真器。内部有一个反映目标处理器硬件的数据结构。它以时序状态机的方式工作,可以根据目标机指令集定义执行目标指令。 • 应用场合:没有目标机开发板或者成本太高;被调试的程序模块不需要在实际开发板上执行;对模块代码先调试,以加快调试速度。 • ARM体系结构计算机,目前经常使用的是ARMulator指令集模拟器,它作为一个插件集成在ADS1.2集成开发环境中。
② ROM Monitor (监控程序)方式 在这种调试方式下,调试环境由宿主机端的调试器、目标机端的监控程序(ROM Monitor)以及二者间的物理连接三部分构成。 ROM Monitor是运行在目标机上监控被调试程序运行的一段程序,与宿主机端的调试器一起完成对应用程序的调试。它要预先被固化到目标机的ROM中,在目标机复位后首先被执行来完成对目标机进行一些必要的初始化,然后等待宿主机的命令。
ROM Monitor • 在目标机上电或复位后首先执行的就是ROM Monitor,它对目标机进行一些必要的初始化 • 初始化要求的外围设备,如最基本的串口和用于内存刷新的系统计时器芯片; • 初始化用于下载映像的内存系统; • 初始化中断控制器和安装中断处理程序。 • 初始化自己的程序空间 • 等待宿主机端的命令
ROM Monitor • ROM Monitor能配合调试器完成: • 程序映像下载 • 对目标机系统内存的读写 • 对寄存器的读写 • 设置和清除不同类型的断点 • 单步执行指令 • 复位系统…等调试功能
ROM Monitor方式 ROM Monitor能配合调试器完成被调试程序的下载、目标机内存和寄存器的读/写、设置断点以及单步执行被调试程序等功能。 这种方式的最大优点是简单方便、成本低廉。它还可以支持许多高级的调试功能,可扩展性强,基本不需要专门的调试硬件支持,几乎所有的交叉调试器(ADS、GDB)都支持这种方式。 缺点: ROM Monitor要占用目标机一定的资源,如CPU、RAM和串口或网卡等通信资源;应用程序的最终运行环境和调试环境有一定的差异;不便于调试有时间特性的程序,实时性较差。
宿主机 目标机 调试器 Windows或其它桌面操作系统 PC机等硬件 被调试程序 监控程序(ROM Monitor) 逻辑上的连接 嵌入式 硬件 物理上的连接 ROM Monitor调试方式
③JTAG调试方式 嵌入式系统的开发中,通常使用JTAG的调试装置对处理器进行底层的调试。JTAG可以实现的功能有:读取/修改地址空间任意值;设置断点位置;通过内置于CPU内的ATP接口实现CPU寄存器读取/修改,控制CPU运行/停止;下载程序写入Flash芯片等。 主要优点:不占用目标机的资源,调试环境和最终的程序运行环境基本一致,支持硬件断点,跟踪、精确计量程序的执行时间,具有时序分析等。 主要缺点:调试的实时性不如ICE方式强,不支持非干扰调试查询,CPU必须支持JTAG功能。
JTAG调试方法 CPU的模式分为一般模式和调试模式 一般模式下: CPU从内存读取指令执行 调试模式下:CPU首先从调试端口读取指令,通过调试端口可以控制CPU进入和退出调试模式;Host端的调试器可以直接向目标机发送要执行的指令,读写目标机的内存和各种寄存器,控制目标程序的运行,完成各种复杂的调试功能。