1、第2章 嵌入式系统的设计方法 2.1 嵌入式系统的一般设计流程 一、单片机系统 图2.1 单片机系统的开发流程 单片机系统主要用于实现相对简单的控制,因此系统核心部件集成在一块芯片单片机上,再在单片机的外围加入一些接口电路即可。 单片机系统设计相对比较简单,软件部分不需要嵌入式操作系统的支持,只需采用汇编语言编写针对特定应用的程序即可。 二、嵌入式处理器系统图2.2 嵌入式处理器系统开发流程 嵌入式处理器系统往往包含CPU、内存和丰富的外部接口,其开发过程类似在PC机上开发应用程序。 开发流程的第一步是选择嵌入式处理器和硬件平台。软件部分一般包含操作系统,开发人员基于此编写相应的应用程序即可,
2、这可大大地简化开发过程,提高系统的稳定性。 二、嵌入式处理器系统开发方式开发方式嵌入式处理器系统的开发过程一般包括以下几个步骤: 源代码编写:编写源C/C+及汇编程序; 程序编译:通过专用编译器编译程序; 软件仿真调试:在SDK中仿真软件运行情况; 程序下载:通过JTAG/USB/UART等方式下载到目标机; 软硬件测试、调试:通过JTAG等方式联合调试程序; 下载固化:程序无误,下载到目标板。二、嵌入式处理器系统嵌入式处理器系统设计的关键问题嵌入式处理器系统设计的关键问题 (1)嵌入式)嵌入式处理器的选型处理器的选型 够用 适用 成本 功耗 软件开发工具 是否内置调试工具 是否提供评估板 处
3、理器的选型直接影响存储器、外设的选择。一般从以下几个因素考虑: (2)操作系统的选择操作系统的选择 操作系统的移植 操作系统的内存要求 操作系统的实时性 支持的开发工具 操作系统的可裁剪性 开发人员是否熟悉此操作系统及其提供的API 操作系统是否提供硬件的驱动程序,如网卡等 从八十年代起,国际上就有一些IT组织、公司,开始致力于嵌入式操作系统的研发,现已涌现了一批优秀的操作系统。如何从众多的嵌入式操作系统中选取合适的操作系统?可以考查以下几个方面: 人们在选择编程语言时往往具有很大的随意性。对价格、获取方便性等因素考虑较多,而对语言本身的技术因素考虑较少。在此就目前应用广泛几种高级语言:Ada
4、、C/C+、Modula-2和JAVA等进行简单的分析比较。 Ada语言定义严格,易读易懂,有较丰富的库程序支持,由于它和运行环境联系较少,因此其运行特性比较出色。 C语言具有广泛的库程序支持,现在是嵌入式系统设计中应用最广泛的语言。 C+是一种面向对象的编程语言,应用也很多,但与C语言相比,C+编写的程序目标代码往往比较庞大和复杂。Modula-2定义清楚,支持丰富,具备较好的模块化结构,在教学科研方面有较广泛的应用。Java语言相对年轻,但有很强的跨平台特性,现在发展势头较为强劲。(3)编程语言的选取)编程语言的选取 2.2 传统的嵌入式系统设计方法图2.4 传统的嵌入式系统设计方法 传统
5、设计方法存在的缺陷 传统的嵌入式系统设计方法虽然简单,但存在一些不可避免的缺陷:1)设计方法缺乏统一的软硬件协同表示方法,软硬件划分完全由设计者凭经验完成,无法从系统级验证划分的合理性,且不易发现软硬件之间存在的接口问题。2)在实际的设计过程中,通常采用“硬件优先的原则”,因此软件的测试必须在硬件全部完成之后才能进行,这样设计周期可能很长。3)由于硬件设计在粗略估计软件任务需求的情况下进行,缺乏对软件构架和实现机制的清晰了解,硬件设计工作带有一定的盲目性。4)整个系统的优化由于受设计空间的限制,只能改善硬件和软件各自的性能,不可能对系统做出较好的综合优化,难以适应现代复杂的、大规模的系统设计需
6、要。 图2.5 嵌入式系统的软硬件协同设计流程2.3 嵌入式系统的软硬件协同设计方法嵌入式系统软硬件协同设计流程 设计流程总体上可分为系统描述、软硬件划分、协同综合、协同仿真与验证、系统集成几个过程。 (1)系统描述 系统描述是采用一种或多种系统级描述语言对所需设计的嵌入式系统的功能和性能进行全面的描述,是建立系统软硬件模型的过程。 系统建模可以由设计者用非正式语言,甚至是自然语言手工完成,但手工完成容易导致系统描述不准确,而选用合适的建模语言将对设计起到事半功倍的效果。 UML(Unified Modeling Language)语言是一种功能强大的可视化建模语言。它将模型中的信息用标准图形
7、元素直观地显示,使具有不同技术背景的开发人员和设计师可以较好地交流。 (2)软硬件划分 软硬件功能划分就是要确定哪些系统功能由硬件实现,哪些功能由软件实现。 从理论上讲,每个应用系统都存在一个适合于该软硬件功能的最佳组合,但如何从系统需求出发,依据一定的指导原则和分配算法对硬件/软件功能进行合理划分,从而使系统的整体性能达到最佳,是软硬件划分的目标所在。(3)协同综合 软硬件协同综合是根据系统描述和软硬件划分的结果,在已有的设计规则和既定的设计目标前提下,决定系统中软件和硬件部分以及其接口的具体实现方法,并将其集成。 (4)协同仿真与验证 协同仿真验证是检验系统设计正确性的过程。它对设计结果的
8、正确性进行评估,以避免在系统实现过程中发现问题再进行反复修改。 由于系统仿真验证的过程中,模拟的工作环境与实际使用环境相差甚远,软硬件之间的相互作用方式及作用效果也就不同,这就难以保证系统在真实环境下工作的可靠性,因此系统仿真的有效性是有限的。 目前,软硬件协同设计领域的研究十分活跃,Berkeley, Princeton等著名大学有专门的研究小组进行相关研究,电子设计领域权威的学术会议DAC上每年都有相当篇幅的论文涉及软硬件协同设计,每年ACM还召开软硬件协同设计的专门会议CODES。主要EDA厂家(Cadence,Synopsys)目前己经推出部分支持软硬件协同设计的工具,并将软硬件协同设
9、计作为下一代的系统级EDA工具的关键技术。软硬件协同设计的特点 (1)软硬件协同设计采用统一的工具描述,可合理划分系统软硬件,分配系统功能,在性能、成本、功耗等方面进行权衡折衷,获取更优化的设计。 (2)软硬件协同设计方法采用并行设计和协同设计的思想,提高了设计效率,缩短了设计周期。(3)在系统级设计中,对软硬件部分使用统一描述语言和工具进行集成开发,具有跨越软硬件界限进行系统优化的能力。(4)支持多领域专家的协同开发。它的核心思想是沟通软件设计和硬件设计,避免系统中关系密切的两部分设计过早独立。同传统设计方法相比,软硬件协同设计提高了设计抽象的层次,拓展了设计的覆盖范围,采用软硬件协同设计技
10、术可以使嵌入式系统设计更好和更快。 2.4 嵌入式系统的测试技术 嵌入式系统测试也叫交叉测试(cross-test),它与PC机的软件测试有相似之处。目前,在嵌入式系统设计中软件正越来越多地取代硬件,以降低系统成本,获得更大的灵活性,这就需要使用更好的测试方法和工具进行嵌入式实时软件的测试。 一、嵌入式软件的测试方法 (1)白盒测试与黑盒测试 白盒测试检查程序的内部设计,它要求根据源代码的组织结构查找软件缺陷。 由于嵌入式系统高可靠性的要求,嵌入式软件测试与普通软件测试相比,通常要求有更高的代码覆盖率。 黑盒测试根据软件的用途和外部特征查找软件缺陷。 嵌入式软件的黑盒测试要把系统的预期用途作为
11、重要依据,根据需求中对负载、定时、性能的要求,判断软件是否满足这些需求规范。为了保证正确地测试,还须要检验软硬件之间的接口。 (2)目标环境测试和宿主环境测试 在嵌入式软件测试中,常常要在基于目标的测试和基于宿主的测试之间作出折衷。基于目标的测试消耗较多的经费和时间,而基于宿主的测试代价较小,目前的趋势是把更多的测试转移到宿主环境中进行。 在宿主环境中,可以进行逻辑或界面的测试、以及与硬件无关的测试。 在目标环境中,则进行与定时问题有关的白盒测试、中断测试、硬件接口测试。 二、嵌入式软件的测试工具 (1)内存分析工具 内存分析工具用来处理在动态内存分配中存在的缺陷。 目前有两类内存分析工具软件
12、和硬件的。基于软件的内存分析工具可能会对代码的性能造成很大影响,从而严重影响实时操作;基于硬件的内存分析工具价格昂贵,而且只能在工具所限定的运行环境中使用。 (2)性能分析工具 性能分析工具会提供有关的数据,说明执行时间是如何消耗的,是什么时候消耗的,以及每个例程所用的时间。 (3)GUI测试工具 GUI测试工具可以作为脚本工具在开发环境中运行测试用例,其功能包括对操作的记录和回放、抓取屏幕显示供以后分析和比较、设置和管理测试过程。 有些嵌入式设备没有GUI,但常常可以对该设备进行插装来运行GUI测试脚本,虽然这种方式可能要求对被测代码进行更改,但是节省了功能测试和回归测试的时间。 (4)覆盖分析工具 在进行白盒测试时,可以使用代码覆盖分析工具追踪哪些代码被执行过。 覆盖分析工具一般会提供有关功能覆盖、分支覆盖、条件覆盖的信息。 三、嵌入式系统的测试策略 嵌入式软件测试的各个阶段有着通用的策略:(1)单元测试 所有单元级测试都可以在主机环境上进行,除非特别指定单元测试直接在目标环境进行。 (2)集成测试 软件集成也可在主机环境上完成,在主机平台上模拟目标环境运行,当然在目标环境上重复测试是有必要的,在此级别上的确认测试将确定一些环境上的问题,比如内存定位和分配上的一些错误。(3)系统测试和确认测试 所有的系统测试和确认测试必须在目标环境下执行。