嵌入式系统开发设计---嵌入式系统开发设计

     嵌入式系统设计的主要任务是定义系统的功能、决定系统的架构,并将功能映射到系统实现架构上。这里,系统架构既包括软件系统架构也包括硬件系统架构。一种架构能够映射到各类不一样的物理实现,每种实现表示不一样的取舍,同时还要知足某些设计指标,并使其余的设计指标也同时达到最佳化。前端

    嵌入式系统的设计方法跟通常的硬件设计、软件开发的方法不一样,是采用硬件和软件协同设计的方法,开发过程不只涉及软件领域的知识,还涉及硬件领域的综合知识,甚至还涉及机械等方面的知识。要求设计者必须熟悉并能自如地运用这些领域的各类技术,才能使所设计的系统达到最优。linux

    虽然嵌入式系统应用软件的设计方案随应用领域的不一样而不一样,可是嵌入式系统的分析与设计方法也遵循软件工程的通常原则,许多成 熟的分析和设计方法均可以在嵌入式领域获得应用。嵌入式系统的开发过程一样也包括需求分析、系统设计、实现和测试几个基本阶段,而且每一个阶段都有其独有的特征和重点。数据库

    本节主要介绍嵌入式系统开发设计的技术与方法,并从嵌入式系统应用和计算模型的角度分析应用软件设计的方法及设计过程当中面临的主要问题。最后,讨论嵌入式领域软件移植的相关问题。编程

 

1 嵌入式系统设计概述windows

    进行嵌入式系统设计前,应明确嵌入式系统设计自己的特色及衡量嵌入式系统设计的一些主要的技术指标。后端

    1.嵌入式系统设计的特色安全

    与一般的系统设计相比,嵌入式系统设计具备如下特色:网络

  • 软、硬件协同并行开发;数据结构

  • 微处理器的类型多种多样;架构

  • 实时嵌入式操做系统具备多样性;

  • 与通用系统开发相比,可利用系统资源不多;

  • 应用支持少;

  • 要求特殊的开发工具;

  • 软、硬件都要很健壮;

  • 调试很困难。 

    2.嵌入式系统的技术指标

    嵌入式系统设计的经常使用指标有:

    (1)NRE 成本(非重复性工程成本):设计系统所须要支付的一次性货币成本,即一旦设计完毕,不须要支付额外的设计费用,就能够制造任意数目的产品。

    (2)单位成本:生产单个产品所须要支付的货币成本,不包含 NRE 成本。

    (3)大小:指系统所占的空间,对软件而言,通常用字节数来衡量;对硬件而言,则用逻辑门或晶体管的数目来衡量。

    (4)性能:系统完成规定任务所须要的时间,是设计时最经常使用的设计指标,主要有两种衡量方式,一是响应时间,即开始执行到任务结束之间的时间。二是完成量,即单位时间内所完成的任务量。

    (5)功率:系统所消耗的功率,它决定了电池的寿命或电路的散热需求。

    (6)灵活性:在不增长 NRE 成本的前提下,改变系统功能的能力。

    (7)样机创建时间:创建系统可运行版本所需的时间,系统样机可能比最终产品更大更昂贵,但能够验证系统的用途和正确性,改进系统的功能。

    (8)上市时间:从系统开发到能够上市卖给消费者的时间,最主要的影响因素包括设计时间、制造时间和检测时间。

    (9)可维护性:系统推出或上市后进行修改的难易程度,特别是针对非原始开发人员进行的修改。

    (10)正确性:正确实现了系统的功能,能够在整个设计过程当中检查系统的功能,也能够插入测试电路检验是否正确。

    (11)安全性:系统不会形成伤害的几率。各个设计指标之间通常是互相竞争的,改良了某个指标经常会致使其余指标的恶化,

    为了最好地知足设计最佳化,设计者必须了解各类软、硬件的实现技术,而且可以从一种技术转移到另外一种技术,以便找到特定约束下的最佳方案。

    3.嵌入式系统的设计挑战

    嵌入式系统设计所面临的挑战有如下几个方面。

    (1)须要多少硬件:设计者对用于解决问题的计算能力有较强的控制能力,不只能够选择使用何种处理器,并且能够选择存储器的数量、所使用的外设等,由于设计不只要知足性能的需求,还要受到制造费用的约束,硬件的选择十分重要,硬件太少,将达不到功能和性能的要求,硬件过多又会使产品过于昂贵。

    (2)如何知足时限:使用提升处理器速度的方法使程序运行速度加快来解决时间约束的方法是不可取的,由于这样会使系统的价格上升。同时,提升了处理器的时钟频率,有时并不能提升执行速度,由于程序的速度有可能受存储系统的限制。

    (3)如何减小系统的功耗:对采用电池供电的系统,功耗是一个十分敏感的问题。对于非电池供电的系统,高功率意味着高散热。下降系统功耗的一种方法是下降它的运算速度,可是单纯地下降运算速度显然会致使性能不能知足,所以,必须认真设计在下降功耗的同时知足性能的约束。

    (4)如何保证系统的可升级性:系统的硬件平台可能使用几代,或者使用同一代的不一样级别的产品,这些仅须要一些简单的改变,设计者必须经过改变软件来改变系统的特性,设计一种机器使它可以提供如今仍未开发的软件的性能。

    (5)如何保证系统的可靠性:可靠性是产品销售时一项重要的指标,产品可以很好地工做是消费者的合理要求,可靠性在一些系统中尤其重要,如安全控制系统。

    (6)测试的复杂性:测试一个嵌入式系统比仅仅输入一些数据困可贵多,因此不得不运行整台机器以产生正确的数据,数据产生的时间是十分重要的,即不能离开嵌入式系统工做的整个环境来测试嵌入式系统。

    (7)可视性和可控制性有限:嵌入式系统一般没有显示设备和键盘,这将致使开发者很难了解系统内部发生了什么,也不能响应系统的动做,有时候不得不经过观察微处理器的信号来了解。在实时系统中,通常没法为了观察而让系统停机。

    (8)开发环境受限:嵌入式系统的开发环境,如开发软件、硬件工具一般比通用计算机或工做站上的可用环境更为有限,故只能采用交叉式开发,给开发进度带来很大影响。

 

2   开发模型与设计流程

    与通用系统的开发相似,嵌入式系统的开发也能够采用软件工程中常见的开发模型,主要包括瀑布模型、螺旋模型、逐步求精模型及层次模型。

    1.经常使用开发模型

    设计流程是系统设计期间应遵循的一系列步骤,其中一些步骤能够由自动化工具完成,而另一些只可用手工完成。在嵌入式系统领域,有以下几种经常使用开发过程模型。

    (1)瀑布模型。瀑布模型由五个主要阶段构成:需求分析阶段肯定目标系统的基本特色;系统结构设计阶段将系统的功能分解为主要的构架;编码阶段主要进行程序的编写和调试;测试阶段检测错误;最后一个是维护阶段,主要负责修改代码以适应环境的变化,并改正错误、升级。各个阶段的工做和信息老是由高级的抽象到较详细的设计步骤单向流动,是一个理想的自顶向下的设计模型。

    (2)螺旋模型。螺旋模型假定要创建系统的多个版本,早期的版本是一个简单的试验模型,用于帮助设计者创建对系统的直觉和积累开发此系统的经验,随着设计的进展,会建立更加复杂的系统。在每一层设计中,设计者都会通过需求分析、结构设计、测试三个阶段。在后期,当构成更复杂的系统版本时,每个阶段都会有更多的工做,并须要扩大设计的螺旋,这种逐步求精的方法使设计者能够经过一系列的设计循环加深对所开发的系统的理解。螺旋的顶部第一个循环是很小很短的,而螺旋底部的最后的循环加入了对螺旋模型的早期循环的细节补充,螺旋模型比瀑布模型更加符合实际。

    (3)逐步求精模型。逐步求精模型是一个系统被创建屡次,第一个系统被做为原型,其后逐个将系统进一步求精。当设计者对正在建造的系统的应用领域不是很熟悉时,这个方法颇有意义。经过建造几个愈来愈复杂的系统,从而精炼系统,使设计者能检验架构和设计技术。此外,各类迭代技术也可仅被局部完成,直到系统最终完成。

    (4)层次模型。许多嵌入式系统自己是由更多的小设计组成的,完整的系统可能须要各类软件构件、硬件构件。这些部件可能由尚需设计的更小部件组成,所以从最初的完整系统设计到为个别部件的设计,设计的流程随着系统的抽象层次的变化而变化,从最高抽象层次的总体设计到中间抽象层次的详细设计,再到每一个具体模块的设计,都是逐层展开的,其中每一个流程可能由单个设计人员或设计小组来承担,每一个小组依靠其余小组的结果,各个小组从上级小组得到要求,同时上级小组依赖于各个分组设计的质量和性能。并且,流程的每一个实现阶段都是一个从规格说明到测试的完整流程。

    2.嵌入式系统的设计方法

    一个良好的嵌入式系统设计方法是十分重要的,这是由于:

    (1)良好的设计方法可使设计者清楚地了解他们所作工做的进度,这样能够确保不遗漏其中的任何一项工做。

    (2)容许使用计算机辅助工具帮助设计者进行工做,将整个过程分红几个可控的步骤进行。

    (3)良好的设计方法方便设计团队的成员之间相互交流,经过定义全面的设计过程,使团队里的每一个成员能够很好地理解他们所要作的工做及完成分配给他们的任务时所达到的目标。

    嵌入式系统软件的开发过程能够分为项目计划、可行性分析、需求分析、概要设计、详细设计、程序创建、下载、调试、固化、测试及运行等几个阶段。

    项目计划、可行性分析、需求分析、概要设计及详细设计等几个阶段,与通用软件的开发过程基本一致,均可按照软件工程方法进行,如采用原型化方法、结构化方法等。

    因为嵌入式软件的运行和开发环境不一样,开发工做是交叉进行的,因此每一步都要考虑到这一点。

程序创建阶段的工做是根据详细设计阶段产生的文档进行的。这一阶段的工做主要是源代码编写、编译、连接等几个子过程,这些工做都是在宿主机进行的,不须要用到目标机。

    产生应用程序的可执行文件后,就要用到交叉开发环境进行调试,根据实际状况能够选用可用的几种调试方法之一或它们的有效组合来进行。

    嵌入式系统设计不一样于传统的软件设计,如图 12-11 所示。常常包含硬件设计和软件设计,其中前端活动,如规格说明和系统架构,须要同时考虑硬件和软件两个方面。

    相似的,后端设计,如系统集成和测试要考虑整个系统。在中间阶段中,软件和硬件构件的开发彼此相互独立,而且大多数的硬件和软件的工做可以相对独立地进行。最后,要将经调试后正确无误的可执行程序固化到目标机上。根据嵌入式系统硬件上配置的不一样,固化有几种方式,能够固化在 EPROM 和 FLASH 等存储器中,也可固化在 DOC 和 DOM 等电子盘中。一般还要借助一些专用编程器进行。

    因为嵌入式系统对安全性和可靠性的要求比通用计算机系统要高,因此在对嵌入式系统进行白盒测试时,要求有更高的代码覆盖率。

    在系统开发流程的各个阶段,分别要进行系统的确认和性能评估、安全性评估及风险性评价,并对系统的实现进行测试验证。

 

3 嵌入式系统设计的核心技术

    嵌入式系统的开发是软、硬件综合开发,与通用系统的开发存在巨大差别,一方面是由于每一个嵌入式系统都是一个软硬件的结合体;另外一方面,嵌入式系统一旦研制完成,软件便随着硬件固化到产品中,具备很强的专用性。在这些特色的影响下,必然要有一种不一样于通用软件开发过程的工程方法学来支持嵌入式系统的开发过程,同时,这些特色也决定了嵌入式系统开发所采用的独特的核心技术。

    整体来看,在嵌入式开发领域,主要有三种核心技术:处理器技术、IC 技术、设计/ 验证技术。

    1.处理器技术

    处理器技术与实现系统功能的计算引擎结构有关,不少不可编程的数字系统也能够视为处理器,这些处理器的差异在于其面向特定功能的专用化程度,致使其设计指标与其余处理器不一样。

    (1)通用处理器。这类处理器可用于不一样类型的应用,一个重要的特征就是存储程序,因为设计者不知道处理器将会运行何种运算,因此没法用数字电路创建程序。另外一个特征就是通用的数据路径,为了处理各种不一样的计算,数据路径是通用的,其数据路径通常有大量的寄存器及一个或多个通用的算术逻辑单元。设计者只须要对处理器的存储器编程来执行所需的功能,即设计相关的软件。

    在嵌入式系统中使用通用处理器具备设计指标上的一些优点。上市时间和 NRE 成本较低,由于设计者只需编写程序,而不需作任何数字设计,灵活性高,功能的改变经过修改程序进行便可。与自行设计处理器相比,数量少时单位成本较低。

    固然,这种方式也有一些设计指标上的缺陷,数量大时单位成本相对较高,由于数量大时,自行设计的 NRE 成本分摊下来,可下降单位成本。同时,对于某些应用,性能可能不好。因为包含了非必要的处理器硬件,系统的体积和功耗可能变大。

    (2)单用途处理器。单用途处理器是设计用于执行特定程序的数字电路,也指协处理器、加速器、外设等。如 JPEG 编码解码器执行单一程序,压缩或解压视频信息。嵌入式系统设计者可经过设计特定的数字电路来创建单用途的处理器。设计者也能够采用预先设计好的商品化的单用途处理器。

    在嵌入式系统中使用单用途处理器,在指标上有一些优缺点。这些优缺点与通用处理器基本相反,性能可能更好,体积与功率可能较小,数量大时单位成本可能较低,而设计时间与 NRE 成本可能较高,灵活性较差,数量小时单位成本较高,对于某些应用,性能不如通用处理器。

    (3)专用处理器。专用指令集处理器是一个可编程处理器,针对某一特定类型的应用进行最优化。这类特定应用具备相同的特征,如嵌入式控制、数字信号处理等。在嵌入式系统中使用专用处理器能够在保证良好的性能、功率和大小的状况下,提供更大的灵活性,但这类处理器仍须要昂贵的成本创建处理器自己和编译器。单片机和数字信号处理器是两类应用普遍的专用处理器,数字信号处理器是一种针对数字信号进行常见运算的微处理器,而单片机是一种针对嵌入式控制应用进行最佳化的微处理器。

    2.IC 技术 

    从系统的集成电路设计描述获得实际芯片的物理映射过程的实现技术即是 IC(Integrated Circuits,集成电路)技术,当前在半导体领域的三类实现技术,即全定制、半定制和可编程技术都可应用于嵌入式系统的硬件设计。

    (1)全定制/VLSI(Very Large Scale Integrated Circuites,超大规模集成电路)。在全定制 IC 技术中,须要根据特定的嵌入式系统的数字实现来优化各层设计人员从晶体管的版图尺寸、位置、连线开始设计以达到芯片面积利用率高、速度快、功耗低的最优化性能。利用掩膜在制造厂生产实际芯片,全定制的 IC 设计也常称为 VLSI,具备很高的 NRE 成本、很长的制造时间,适用于大量或对性能要求严格的应用。

    (2)半定制/ASIC(Application Specific Integrated Circuit,专用集成电路)。半定制ASIC是一种约束型设计方法,包括门阵列设计法和标准单元设计法。它是在芯片制做好一些具备通用性的单元元件和元件组的半成品硬件,设计者仅须要考虑电路的逻辑功能和各功能模块之间的合理链接便可。这种设计方法灵活方便、性价比高,缩短了设计周期,提升了

成品率。

    (3)可编程/ASIC。可编程器件中全部各层都已经存在,设计完成后,在实验室里便可烧制出设计的芯片,不须要 IC 厂家参与,开发周期显著缩短。可编程 ASIC 具备较低的 NRE 成本,单位成本较高,功耗较大,速度较慢。

    3.设计/验证技术

    嵌入式系统的设计技术主要包括硬件设计技术和软件设计技术两大类。其中,硬件设计领域的技术主要包括芯片级设计技术和电路板级设计技术两个方面。

    芯片级设计技术的核心是编译/综合、库/IP(Intellectual  Property,知识产权)、测试/ 验证。编译/综合技术使设计者用抽象的方式描述所需的功能,并自动分析和插入实现细节。库/IP 技术将预先设计好的低抽象级实现用于高级抽象。测试/验证技术确保每级功能正确,减小各级之间反复设计的成本。

    软件设计技术的核心是软件语言。软件语言经历了从低级语言(机器语言、汇编语言)到高级语言(例如,结构化设计语言、面向对象设计语言)的发展历程,推进其发展的是汇编技术、分析技术、编译/解释技术等诸多相关技术。软件语言的级别也从实现级、设计级、功能级逐渐向需求级语言发展过渡。

    早期,随着通用处理器概念的逐渐造成,软件技术迅速发展,软件的复杂度也开始增长,软件设计和硬件设计的技术和领域彻底分开。设计技术和工具在这两个领域同步获得发展,也使得行为描述能够在愈来愈抽象的级别上进行,以适应设计复杂度不断增加的须要。这种同步发展现在又使得这两个领域都使用一样的时序模型来描述行为,于是这两个领域即将可能再度统一为一个领域。

    鉴于大多数嵌入式系统都是实时的反应式系统,反应式系统具备多任务并发、时间约束严格与可靠性高的特色,针对反应式系统的设计和描述,人们相继提出了多种描述语言和验证方法学。例如,采用时序逻辑用来刻画反应式系统的性质及推理反应式系统的行为,采用模型检验技术验证反应式系统设计的正确性等,这些技术已逐步在嵌入式开发过程当中发挥着重要的做用。

 

4 嵌入式开发设计环境

    嵌入式系统的开发环境种类不少,大致能够把它们分为以下几类:

    (1)与嵌入式操做系统配套的开发环境,属于这一类的开发环境较多,如 PalmOS、THOS、VxWorks、Windows CE 等商业嵌入式操做系统都有与其配套的功能齐全的开发环境。

    (2)与处理器芯片配套的开发环境。这类开发环境通常由处理器厂商提供,如EPSON公司推出的一个专门为基于 S1C33 系列微控制器芯片的嵌入式系统开发的工具包即是这一类型的开发环境。

    (3)与具体应用平台配套的开发环境。这类开发环境针对性较强,如高通公司的 Brew SDK 等。

    (4)其余类的开发环境。这类开发环境主要指一些嵌入式系统供应商在 GNU 开源工具的基础上开发或定制的较为通用的开发环境。这类工具能够免费得到,并且支持的处理器类型繁多,功能齐全,但在技术支持方面比专业化商业工具略逊一些。

 

5 嵌入式软件设计模型

    随着嵌入式系统的功能日益复杂,要描述这些功能复杂的系统的行为也愈来愈困难,实践证实经过采用计算模型的方法来对系统进行描述和分析是一种具备工程价值的方法。

    本节介绍几种嵌入式领域经常使用的计算模型,并从计算模型的角度分析和阐述嵌入式应用设计和开发的相关问题。计算模型提供一组用简单对象来组合复杂行为的方法,能够帮助设计者理解和描述系统行为。嵌入式系统经常使用的计算模型有以下几种:时序计算模型、通讯进程模型、状态机模型、数据流模型、面向对象模型、并发进程模型。

    这些模型分别在不一样的应用领域使用,如状态机模型特别适合描述以控制为主的系统,数据流模型能够很好地描述数据处理和转换问题。目前使用最普遍的是并发进程模型。

    1.状态机模型

    有限状态机(Finite-State Machine,FSM)是一个基本的状态模型,能够用一组可能的状态来描述系统的行为,系统在任什么时候刻只能处于其中一个状态,也能够描述由输入肯定的状态转移,最后能够描述在某个状态下或状态转移期间可能发生的操做。

   有限状态机 FSM 是一个六元组 F<S,I,O,F,H,S0>,其中 S 是一个状态集合{s0, s1,…,sl},I 是输入集合{I0,I1,…,Im},O 是输出集合{o0,o1,…,on},F 是次态函数或转移函数,将状态和输入映射到状态(S×I→S),H 是输出函数,将状态映射到输出 (S→O),S0 是初始状态。

   图 12-12 是电梯的控制单元的状态机描述。在初始“空闲”态,将 up 和 down 设置为 0,open 设置为 1。在所请求的楼层不一样于当前楼层以前,状态机一直停留在“空闲”状态。若是所请求的楼层大于当前楼层,则状态机转移到“上升”状态,并将 up 设置为 1。若是所请求的楼层小于当前楼层,则状态机转移到“降低”状态,并将 down 设置为 1。在当前楼层等于所请求的楼层以前,状态机一直留在“降低”或“上升”状态,而后状态转移到“开门”状态,并将 open 设置为1。一般,系统有一个计时器 timer,所以,当状态机转移到“开门”状态时,还要将计时器启动,状态机停留在“开门”态,直到计时器超时,最后转移到“空闲”态。

 

    当 FSM 被用于嵌入式系统设计时,其输入和输出的数据类型都是布尔类型,而函数表示含有布尔运算的布尔函数,这种模型对于没有数据输入或输出的不少纯控制系统而言已经足够。若是要处理数据,则将 FSM 扩展为带有数据路径的状态机(FSM with Datapath, FSMD)。另外,对状态机模型能够进一步扩展以支持分级和并发,这种模型称为分级/并发FSM(Hierarchical/Concurrent FSM,HCFSM)模型。

    2.数据流模型

    数据流模型是并发多任务模型派生出的一种模型,该模型将系统的行为描述为一组结点和边,其中结点表示变换,边表示从一个结点到另外一个结点的数据流向。每一个结点使用来自其输入边的数据,执行变换并在其输出边上产生数据。

    每条边可能有或没有数据,出如今边上的数据称为令牌,当某个结点的全部输入边都至少有一个令牌时,该结点可触发。结点触发后,将使用来自每条输入边的一个令牌,对全部使用的令牌进行数据变换,并在输出边上产生一个令牌,结点的触发仅决定于令牌出现的状况。

    图 12-13 所示是计算 z=(a+b)×(c-d)的数据流模型。

    目前,已有若干商业化的工具支持用图形化语言表达数据流模型,这些工具能够自动将数据流模型转换为并发多任务模型,以便在微处理器上实现。其转换方法为将每一个结点转换为一个任务,每条边转换为一个通道,其中并发多任务模型的实现方法是使用实时操做系统对并发任务进行映射。

    图 12-14 是一个同步数据流模型,这个模型中,在结点的每条输入边和输出边上分别标注每次触发所使用和产生的令牌数。该模型的优势是,在实现时不须要将其转换为并发多任务模型,而是用静态方式调度结点,产生时序程序模型。该模型可使用时序程序语言(如 C 语言)来表达,不须要实时操做系统就能够执行,所以其执行效率更高。

 

    3.并发进程模型

   并发进程模型是由一组进程构成,每一个进程是一个顺序执行的过程,各进程间能够并发执行。并发进程模型提供建立、终止、暂停、恢复和链接进程的操做。进程在执行中能够相互通讯,交换数据。进程间通讯能够采用两种方式:共享变量和消息传递。信号量、临界区、管程和路径表达式等用来对并发进程的操做进行同步。

    一般,实时系统能够当作是由许多并发执行的进程构成的系统,其中每一个进程都有时间要求。这样,不少嵌入式系统更容易用一组并发执行的任务来描述,由于这些系统自己就是多任务系统,并发进程模型便天然地能够由实时操做系统的多任务来实现。

    4.面向对象模型

    传统的并发进程模型是围绕进程的概念进行设计的,进程是一个实现级的概念,它是对客观世界活动的一种间接模拟,所以,采用进程模型来解决客观世界中的并发问题就显得极不天然,而且也使得并发程序难以设计和理解。

    面向对象模型以一种更加直接的方式刻画客观世界中的活动,模型中存在着潜在的并发执行能力。一个对象向另外一个对象发送消息后,若不须要或不当即须要消息的处理结果,前者没必要等待后者处理消息,消息发送者和消息接受者能够并发执行。对象不都是处于被动的提供服务状态,它们中的一些除了能经过接收消息向外提供服务外,还能够有本身的事务处理。一个对象每每能够同时处理多个消息。

   对象是数据和操做的封装体,数据存放在对象的局部变量中,对象的状态由对象全部的局部变量在某一时刻的取值来表示。在并发环境中,还要考虑对象并发状态的描述问题,由于对象的并发控制是根据对象的并发状态来进行的。

   把并发与面向对象相结合,归结起来可分为两条途径:

    (1)在面向对象模型中引进并发机制,充分利用面向对象技术刻画客观世界的良好模型能力和面向对象的各个重要特性,同时把其潜在的并发能力描述出来,使其适合于描述并发计算。

    (2)在传统并发模型中引进面向对象思想。

    面向对象的并发模型能够分为两种类型:隐式并发模型和显式并发模型。

    (1)隐式并发模型。这种模型的特色是推迟并发设计,将对象建模做为建模基础。在进入运行阶段以前,将对象当作自主单元,各类对象的活动当作理想并发方式完成的特定工做。就像每一个对象拥有一个本身的处理器,这个处理器能够为对象提供一个执行线程。进入系统的外部事件被当作一个处理请求,以广播方式传给一些对象,这些对象接着向其余对象进一步提出处理请求。理论上,对应一个请求,能够有任意多个对象执行相应的处理。在实现时,由调度程序最终决定其对象的操做顺序,如图 12-15 所示。

   (2)显式并发模型。这种模型的特色是首先考虑并发,应先把并发概念和对象概念分开。在创建对象之后,用实时操做系统支持的进程概念来表示并发,造成对象和进程两个抽象层次,即先将系统分解为准并发进程做为开始,而在每一个进程的内部采用面向对象的技术。对象间交互表示成嵌套的函数调用,经过加入锁、监视器、信号量等显式同步机制,来保证对象的完整。该模型将进程置于对象之上,对象中没必要考虑并发、对象串行化,如图 12-16 所示。

 

 

    早期,实时系统的设计方法主要是结构化设计方法,采用结构化方法的系统在复用性、可修改性等方面有很大的局限性。面向对象的实时系统设计方法显然在这些问题上具备明显的优点。较实用的面向对象的设计方法是诺基亚公司的 OCTOPUS 方法,该方法以 OMT 和融合方法(Fusion Method)为基础,提出了对实时系统响应时间、时间域及并发的处理方法,并具体提出了对并发、同步、通讯、中断处理、ASIC、硬件界面、端对端响应时间等方面的处理。OCTOPUS 方法将软件开发的主要阶段很好地合并起来,从规格说明到运行模型之间的过渡紧密天然,还支持渐进式开发。OCTOPUS 方法是当前面向对象技术和实时系统相结合的一个典型的设计方法。另外,形式化的面向对象的开发技术和建模语言也逐渐在实时系统建模的初始阶段获得应用。

6 需求分析 

    在设计以前,设计者必须知道要设计什么。一般人们用需求和规格说明来描述设计过程的这两个相关而不一样的步骤。需求是用户所想要的非形式化的描述,而规格说明是能够用来建立系统架构的更详尽、更精确、更一致的描述。固然,需求和规格说明都是指导系统的外部表示,而非内部表示。需求有两种类型:功能性需求和非功能性需求,功能性需求说明这个系统必须作什么,而非功能性需求说明系统的其余属性,如物理尺寸、价格、功耗、设计时间、可靠性等。

    对一个大系统进行需求分析是一项复杂而费时的工做,可是,获取少许格式清晰、简单明了的信息是理解系统需求的一个良好开端。表 12-5 是在某项工程开始时填写的需求表 格,在考虑系统的基本特征时可将该表格做为检查表。

    这份需求表格内容是以 GPS(Global Position System,移动地图系统)为例编写的。移动地图系统是一种手持设备,针对在高速公路开车的用户或相似的用户而设计,该设备可从 GPS 上获得位置信息,为用户显示当前所在的位置及周围的地形图,地图的内容随着用户及设备所在位置的改变而改变。

    需求分析阶段最重要的文档输出就是系统的规格说明。

    规格说明是精确反映客户需求而且做为设计时必须遵循的要求的一种技术文档。在软件开发的过程当中,规格说明很是重要。系统分析人员接受用户需求产生目标软件系统的规格说明,设计与编码人员根据规格说明,进行模块设计并最终产生程序代码,测试和验收人员验证最终软件是否符合规格说明。规格说明应该是清晰的、无歧义的,不然由该规格说明建造系统可能不符合实际要求。

   目前,业界较为流行的方法是采用 UML 进行规格说明的描述。UML 是一个通用的标准建模语言,能够对任何具备静态结构和动态行为的系统进行建模。UML 适用于系统开发过程当中从需求规格描述到系统完成后测试的不一样阶段。

    图 12-17 是一个显示操做的状态机规格说明示例,开始和结束是特殊的状态,状态机中的状态表明了不一样的概念性操做。

    在需求分析阶段,经过用例来捕获用户需求。经过用例建模,描述对系统感兴趣的外部角色及其对系统(用例)的功能要求。分析阶段主要关心问题域中的主要概念(如抽象、类和对象等)和机制,须要识别这些类及它们相互间的关系,并用 UML 类图来描述。在分析阶段,只对问题域的对象(现实世界的概念)建模,而不考虑定义软件系统中技术细节的类(如处理用户接口、数据库、通讯和并行性等问题的类)。

7 系统设计

    目前,嵌入式系统的设计工具能够分为两类:协同合成工具和协同模拟工具。

    (1)协同合成工具。当前,用于嵌入式开发的主要的协同合成工具备 POLIS、COSYMA和Chinook 等。

  • POLIS:POLIS 是 UC-Berkeley 开发的交互式嵌入式系统的软、硬件协同设计框架,它适用于小型控制系统的设计,系统描述支持基于 FSM(Finite State Machine)的语言。因为软、硬件都可透明地从同一 CFSM 描述中取得,设计空间的灵活性也相应增长,支持使用 PTOLEMY 的协同模拟,在描述及实现层均支持正式的验证,架构的支持受限,即硬件 CFSMs 所包围的只有一个处理器,并且不支持共享内存。

  • COSYMA:COSYMA 是由德国 IDA 公司开发的一种探索硬件与软件协同设计合成进程的平台,它面向软件系统的描述较简单,支持自动分割和协同处理器合成,在合成时期能够对设计空间进行探索,系统合成取决于硬件限制,不支持并发模块,即一次只能有一个线程执行,架构一样受限,不支持正式验证,设计的成功与否取决于分割及开销估计技术。

  • Chinook:Chinook 是为控制系统而设计的,整个系统的描述做为一个输入提供给 Chinook,它的内部模式基于相似等级状态的模式,它不对代码进行分割,它为整个设计提供单一的模拟环境,Chinook 支持多种系统架构,尤为是多处理器结构。一样支持定时限制的描述,它能合成多种接口,包括系统之间的软、硬件接口,能直接从定时图表中合成设备驱动器,能够控制处理器之间的通讯。

    (2)协同模拟工具。协同模拟是嵌入式系统设计中相当重要的一个方面,在整个系统设计完成后,在统一框架下模拟不一样种类的成分是必要的,协同模拟不只提供检验,并且为用户提供各系统的性能信息,这有助于在系统的早期提出变动方案,不至于形成重大损失。目前,主要的协同模拟工具备以下两种。

  • PTOLEMY:PTOLEMY 的关键思想是混合使用面向对象内核的计算模型,可用于模拟多种的系统,在各类应用中被普遍地使用,但不适合于系统合成,硬件模拟也是它的一项功能。

  • TSS:TSS(Tool for System Simulation)是模拟复杂硬件的工具,采用 C 语言编写,单个模块的提取可由用户控制,能够方便地进行添加与删除模块。但不支持分级模块,没有用于同步各处理器存取共享数据结构的机制,模块间的通讯经过端口和总线进行。而且,TSS 支持多核系统的模拟。

    1.系统架构设计

    描述系统如何实现规格说明中定义的功能是系统架构设计的主要目的。可是在设计嵌入式系统的系统结构时,很难将软件和硬件彻底分开。一般的处理是先考虑系统的软件架构,而后再考虑其硬件实现。系统结构的描述必须符合功能上和非功能上的需求。不只所要求的功能要体现,并且成本、速度、功耗等非功能约束也要知足。从系统原始框图中的功能元素开始逐个考虑和细化,把原始框图转化为软件和硬件系统结构的同时考虑非功能约束,是一个切实可行的方法。下面以 GPS 移动地图系统的架构设计为例进行说明。

    (1)原始框图。如图 12-18 所示,这个原始框图是移动地图系统的主要操做和数据流。

 

 

    (2)软件系统架构。如图 12-19 所示,软件系统主要由用户界面、数据库搜索引擎和数据转换器组成。

    (3)硬件系统架构。如图 12-20 所示,硬件系统采用通用微处理器、存储器和 I/O 设备组成。本系统选用两种存储器:通用数据、程序存储器和针对像素显示的帧缓冲存储器。

    2.硬件子系统设计

    嵌入式系统的开发环境由 4 部分组成:目标硬件平台、嵌入式操做系统、编程语言和开发工具,其中处理器和操做系统的选择应当考虑更多的因素,避免错误的决策影响项目的进度。

    (1)选择处理器技术。嵌入式系统设计的主要挑战是如何使互相竞争的设计指标同时达到最佳化。设计者必须对各类处理器技术和 IC 技术的优缺点加以取舍。通常而言,处理器技术与 IC 技术无关,也就是说,任何处理器技术均可以使用任何 IC 技术来实现,可是最终器件的性能、NRE 成本、功耗、大小等指标会有很大的差别,如图 12-21 所示。

    更通用的可编程技术提供了较大的灵活性,下降了 NRE 成本,创建产品样机与上市的时间较快。定制的技术可以提供较低的功耗、较好的性能、更小的体积和大批量生产时的低成本。

    一般,一个公司要推出一种产品,如机顶盒、家庭路由器或通用处理器等,能够先推出半定制产品,以尽快占领市场,而后再推出全定制的产品。也可先用较可靠的老技术实现处理器,再用新制程的技术实现下一代。一样,嵌入式系统的设计者可使用可编程的器件来创建样机,以加速上市时间,批量时再采用定制器件。

    根据这些原则,设计者即可以对采用的处理器技术和处理器作出合理选择。通常,全定制商品化的“通用处理器软件”是大多数状况下都适用的一个选择。

    (2)通用嵌入式处理器的选择。根据用户的需求和项目的须要选择合适的通用嵌入式处理器,选择时须要考虑以下指标。

  • 处理器的速度。一个处理器的性能取决于多个方面的因素:时钟频率,内部寄存器的大小,指令是否对等处理全部的寄存器等。对于许多需用处理器的嵌入式系统设计来讲,目标不是在于挑选速度最快的处理器,而是在于选取可以完成做业的处理器和 I/O 子系统。处理器的性能知足系统的需求,并有必定的余量,但也没必要选得过高。

  • 技术指标。当前,许多嵌入式处理器都集成了外围设备的功能,从而减小了芯片的数量,进而下降了整个系统的开发费用。开发人员首先考虑的是,系统所要求的一些硬件可否无须过多的组合逻辑就能够链接处处理器上。其次是考虑该处理器的一些支持芯片,如 DMA 控制器、内存管理器、中断控制器、串行设备、时钟等的配套。

  • 开发人员对处理器的熟悉程度,即项目的开发人员须要在处理器自己的成本和开发成本之间作一个权衡。

  • 处理器的 I/O 功能是否知足系统的需求,即许多处理器提供内置的外部设备,以减小芯片数量、下降成本,应尽可能考虑这种方案。

  • 处理器的相关软件支持工具,即该款处理器是否具备完善的嵌入式操做系统、编程语言和开发工具的支持等。

  • 处理器的调试,即处理器是否集成了调试功能,如是否支持 JTAG、BDM 等调试方式。

  • 处理器制造商的支持可信度。在产品的生命周期里选择某种处理器时,设计者必须确认它有足够的供货量、技术支持等处理器的低功耗。

    嵌入式微处理器最大而且增加最快的市场是手持设备、电子记事本、PDA、手机、GPS 导航器、智能家电等消费类电子产品,这些产品中选购的微处理器的典型特色是要求高性能、低功耗。许多 CPU 生产厂家已经进入了这个领域。

    (3)硬件设计的注意事项。首先,将硬件划分为部件或模块,并绘制部件或模块链接框图。其次,对每一个模块进行细化,把系统分红更多个可管理的小块,能够被单独实现。一般,系统的某些功能既可用软件实现也可用硬件实现,没有一个统一的方法指导设计者决定功能的软硬件分配,可是能够根据约束清单,在性能和成本之间进行权衡。

    设计软、硬件之间的接口时,须要硬件设计者和软件设计者协同工做才能完成,良好的接口设计能够保证硬件简洁、易于编程。

   设计时须要注意如下几点。

  • I/O 端口:列出硬件的全部端口、端口地址、端口属性、使用的命令和序列的意义、端口的状态及意义。

  • 硬件寄存器:对每一个寄存器设计寄存器的地址、寄存器的位地址和每一个位表示的意义,以及对寄存器读写的说明、使用该寄存器的要求和时序说明。

  • 内存映射:共享内存和内存映射 I/O 的地址,对每一个内存映射,说明每一个 I/O 操做的读/写序列、地址分配。

  • 硬件中断:如何使用硬件中断,列出所使用的硬件中断号和分配的硬件事件。

  • 存储器空间分配:列出系统中程序和数据占用的空间大小、位置,以及存储器类型和访问方式等。

    总之,硬件设计者应该给软件设计者更多、更详细的信息,以便于进行软件设计和开发。

    3.软件子系统设计

    根据需求分析阶段的规格说明文档,肯定系统计算模型,对软件部分进行合理的设计便可。

    (1)操做系统的选择。在选择嵌入式操做系统时,须要作多方面的考虑:

  • 操做系统的功能。根据项目须要的操做系统功能来选择操做系统产品,要考虑系统是否支持操做系统的所有功能或部分功能,是否支持文件系统、人机界面,是实时系统仍是分时系统及系统是否可裁减等因素。

  • 配套开发工具的选择。有些实时操做系统(rtos)只支持该系统供应商的开发工具。也就是说,还必须向操做系统供应商获取编译器、调试器等。有些操做系统使用普遍且有第三方工具可用,所以,选择的余地比较大。

  • 操做系统的移植难易程度。操做系统到硬件的移植是一个重要的问题。它是关系到整个系统可否定期完工的一个关键因素,所以要选择那些可移植性程度高的操做系统,从而避免操做系统难以向硬件移植而带来的种种困难,加速系统的开发进度。

  • 操做系统的内存需求如何。均衡考虑是否须要额外 ram 或 eeprom 来迎合操做系统对内存的较大要求。有些操做系统对内存的要求是与目标相关的。如 tornado/vxworks,开发人员能按照应用需求分配所需的资源,而不是为操做系统分配资源。从须要几 k 字节存储区的嵌入设计到需求更多的操做系统功能的复杂的高端实时应用,开发人员可任意选择多达 80 种不一样的配置。

  • 操做系统附加软件包。是否包含所需的软件部件,如网络协议栈、文件系统、各类经常使用外设的驱动等。

  • 操做系统的实时性如何。实时性分为软实时和硬实时。有些嵌入式操做系统只能提供软实时性能,如 microsoft windows ce 2.0 是 32 位,windows 兼容,微内核,可伸缩实时操做系统,能够知足大部分嵌入式和非嵌入式应用的须要。但实时性不够强,属于软实时嵌入式操做系统。

  • 操做系统的灵活性如何。操做系统是否具备可剪裁性,即可否根据实际须要进行系统功能的剪裁。有些操做系统具备较强的可剪裁性,如嵌入式 linux 、 tornado/vxworks 等。

    (2)编程语言的选择。在选择编程语言时,也须要作多方面的考虑:

  • 通用性。随着微处理器技术的不断发展,其功能愈来愈专用,种类愈来愈多,但不一样种类的微处理器都有本身专用的汇编语言。这就为系统开发者设置了一个巨大的障碍,使得系统编程更加困难,软件重用没法实现,而高级语言通常和具体机器的硬件结构联系较少,比较流行的高级语言对多数微处理器都有良好的支持,通用性较好。

  • 可移植性。因为汇编语言和具体的微处理器密切相关,为某个微处理器设计的程序不能直接移植到另外一个不一样种类的微处理器上使用,所以,移植性差。高级语言对全部微处理器都是通用的,所以,程序能够在不一样的微处理器上运行,可移植性较好。这是实现软件重用的基础。

  • 执行效率。通常来讲,越是高级的语言,其编译器和开销就越大,应用程序也就越大、越慢。但单纯依靠低级语言,如汇编语言来进行应用程序的开发,带来的问题是编程复杂、开发周期长。所以,存在一个开发时间和运行性能之间的权衡。

  • 可维护性。低级语言如汇编语言,可维护性不高。高级语言程序每每是模块化设计,各个模块之间的接口是固定的。所以,当系统出现问题时,能够很快地将问题定位到某个模块内,并尽快获得解决。另外,模块化设计也便于系统功能的扩充和升级。

  • 基本性能。在嵌入式系统开发过程当中使用的语言种类不少,比较普遍应用的高级语言有 Ada、C/C++、Modula-2 和 Java 等。Ada 语言定义严格,易读易懂,有较丰富的库程序支持,目前,在国防、航空、航天等相关领域应用比较普遍,将来仍将在这些领域占有重要地位。C 语言具备普遍的库程序支持,是嵌入式系统中应用最普遍的编程语言,在未来很长一段时间内仍将在嵌入式系统应用领域中占重要地位。 C++是一种面向对象的编程语言,在嵌入式系统设计中也获得了普遍的应用,如 GNU C++。Visual C++是一种集成开发环境,支持可视化编程,普遍应用于 GUI 程序开发。但 C 与 C++相比,C++的目标代码每每比较庞大和复杂,在嵌入式系统应用中应充分考虑这一因素。

    (3)软件开发过程。嵌入式软件的开发过程不一样于通常通用软件的开发过程,主要有以下步骤:

  • 选择开发语言,创建交叉开发环境;

  • 根据详细设计说明编写源代码,进行交叉编译、连接;

  • 目标代码的重定位和下载;

  • 在宿主机或目标机调试、验证软件功能;

  • 进行代码的优化。

    (4)软件开发文档。在嵌入式产品的开发设计过程当中,开发阶段完成系统产品的实现,这一阶段同时须要完成一系列的文档,这些文档对完成产品设计、维护至关重要,这些文档分别为技术文件目录、技术任务书、技术方案报告、产品规格、技术条件、设计说明书、试验报告、总结报告等。

 

8 系统集成与测试

    一般嵌入式系统测试主要包括软件测试、硬件测试、单元测试三个部分。

    通常系统的硬件测试包括可靠性测试和电磁兼容性测试,关于电磁兼容性目前已经有了强制性国内和国际标准。

    嵌入式系统软件测试方法和原理跟通用软件的测试基本一致,软件测试时,通常须要测试实例或测试序列,序列有两种来源:一种是须要用户进行设计,另外一种是标准的测试序列。不管哪一种测试实例,都要求实例可以高几率发现更多的错误,但在测试的内容上有些差异:

    (1)嵌入式软件必须长时间稳定运行。

    (2)嵌入式软件通常不会频繁地版本升级。

    (3)嵌入式软件一般使用在关键性的应用中。

    (4)嵌入式软件必须和嵌入式硬件一块儿对产品的故障和可靠性负责。

    (5)现实世界的条件是异步和不可预测的,使得模拟测试很是困难。

    因为这些差异,使得嵌入式系统软件测试主要集中在如下 4 个不一样的方面:

    (1)由于实时性和同时性很难同时知足,因此大多数测试集中于实时测试。

    (2)大多数实时系统都有资源约束,所以须要更多的性能和可用性测试。

    (3)可使用专用实时跟踪工具对代码覆盖率进行测试。

    (4)对可靠性的测试级别比通用软件要高得多。

    另外,性能测试也是设计嵌入式系统中须要完成的最主要的测试活动之一,对嵌入式系统有决定性的影响。

    因为嵌入式系统的专用性特色,系统的硬件平台和软件平台多种多样,每种都针对不一样的应用而专门设计,所以,应用软件在各个平台之间不多具备通用性,而且嵌入式系统的更新换代速度相对较快。为了保护已有的投资、充分利用现有的软件资源和加快产品研制速度,软件的移植在嵌入式领域变得很是频繁。