精华内容
下载资源
问答
  • 嵌入式系统开发

    千次阅读 2015-05-12 15:45:21
    转自:...  ********************************LoongEmbedded******************************** 作者:LoongEmbedded(kandi) 时间:2011.9.27 类别:嵌入式系统开发 ****

    转自:http://blog.csdn.net/loongembedded/article/details/6830148

     ********************************LoongEmbedded********************************

    作者:LoongEmbedded(kandi)

    时间:2011.9.27

    类别:嵌入式系统开发

    ********************************LoongEmbedded********************************

     

    1. 嵌入式系统开发流程

    1.1  嵌入式系统的概念

    嵌入式系统的定义有很多种,其中国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。

     

    我们尝试着进一步理解这个定义:

    1) 以应用为中心

    表示嵌入式系统应该根据不同的应用场合来设计,比如,如果我们要开发智能手机,那么此嵌入式系统的操作系统就应该选择专用的操作系统,比如android操作系统;PowerPC架构的嵌入式处理器一般用于高端服务器,而ARM架构的嵌入式处理器一般用于个人消费电子、汽车电子等。

     

    2) 以计算机技术为基础

    计算机技术包括:运算方法的基本原理与运算器设计、指令系统、中央处理器(CPU)设计、流水线原理及其在CPU设计中的应用、存储体系、总线与输入输出,而嵌入式处理器也就是嵌入式系统的CPU,也有自己的指令系统、流水线原理等,嵌入式系统中的操作系统和应用软件,这是需要编程语言、软件工程等计数机技术作为基础的,但嵌入式系统和微处理器技术、电子技术、通信技术的关系一样很紧密,所以可以知道嵌入式系统是多学科综合的结合体。

     

    3) 软硬件可裁剪

    嵌入式系统由软硬件组成,而且根据不同的应用场合,我们可以根据需要来裁剪软硬件。

     

    4) 适应应用系统对功能、可靠性、成本、体积、功耗等严格要求

    对功能要求的满足肯定是必须的,可靠性要求系统在一定时间内、在一定条件下无故障地执行指定功能的能力或可能性,比如某款GPS产品在室温下连续播放视频不会出现花屏或者死机,可靠性一般分为耐久性、可维修性和设计可靠性,其中设计可靠性是产品质量的关键。

     

    1.2 嵌入式系统的组成

    从功能的角度来分看,嵌入式系统由硬件层、中间层、操作系统层和应用软件层组成。

    图1嵌入式系统结构图

    1.2.1 硬件层

    嵌入式系统硬件层的核心是嵌入式处理器。

    1)   嵌入式处理器

    嵌入式处理器分为嵌入式微控制器(Micro Control Unit,MCU)、嵌入式DSP处理器(Digital Signal Processor,DSP)、嵌入式微处理器(Micro Processor Unit,EMPU)和嵌入式片上系统(System On Chip,SOC)。

     

    ⑴嵌入式微控制器

    嵌入式微控制器的典型代表是单片机,单片机把具有数据处理能力的中央处理器(CPU)、随即存储器RAM、只读存储器ROM、多种I/O和中断系统、定时器/计时器、看门狗、A/D转换等功能及外设集成在一块芯片中。微控制器的最大特点是单片化,体积大大减少,从而使功耗和成本下降、可靠性提高。如INTEL公司的MCS8051就是微控制器。

     

    ⑵嵌入式DSP处理器

    DSP处理器一种独特的微处理器,是以数字信号来处理大量信息的器件。其工作原理是接收模拟信号,转换为0或1的数字信号。再对数字信号进行修改、删除、强化,并在其他系统芯片中把数字数据解译回模拟数据或实际环境格式。它不仅具有可编程性,而且其实时运行速度可达每秒数以千万条复杂指令程序,远远超过通用微处理器,是数字化电子世界中日益重要的电脑芯片。它的强大数据处理能力和高运行速度,是最值得称道的两大特色。如TI的TMS320C62X就是一款DSP处理器。

     

    DSP处理器有一个很重要的应用趋势就是和微处理器的融合,比如TI的OMAP3530就是把一个ARM的cortex A8内核和一个DSP内核,也意味着控制和数字信号的结合。

    ⑶嵌入式微处理器

    嵌入式微处理器(Microprocessor Unit,MPU)由通用计算机中的CPU演变而来。与通用计算机中的CPU不同的是,在嵌入式应用中,将微处理器装配在专门设计的电路板上,只保留和嵌入式应用紧密相关的功能硬件,去除其他的冗余功能部分,这样就以最低的功耗和资源实现嵌入式应用的特殊要求。此外,为了满足嵌入式应用的特殊要求,嵌入式微处理器在工作温度、抗电磁干扰、可靠性等方面相对通过通用计算机中的CPU都做了各种增强,这也是我们选择微处理器需要考虑的一些很重要的因素。比如三星的S3C6410就是一款嵌入式微处理器。

     

    嵌入式微处理器的体系结构可以采用冯·诺依曼体系或哈佛体系结构,其中冯·诺依曼体系定义了单一的存储器空间用于存放指令和数据,而哈佛体系结构定义了单独的存储器空间,分别用于存放指令和数据,这样可以增加了单位时间内能够处理的数据量;指令系统可以选用精简指令系统(Reduced Instruction Set Computer,RISC)和复杂指令系统CISC(Complex Instruction Set Computer,CISC)。RISC计算机在通道中只包含最有用的指令,确保数据通道快速执行每一条指令,从而提高了执行效率并使CPU硬件结构设计变得更为简单。  

     

     

    那么微控制器和微处理器的主要差别在于下面几个方面:

    ①硬件架构方面

    微处理器是一个单芯片CPU,而微控制器则在一块集成电路芯片中集成了CPU和其他电路,构成了一个完整的微型计算机系统。

     

    ②应用领域

    微处理器通常作为微型计算机系统中的CPU使用。其设计正是针对这样的应用,这也是微处理器的优势所在。然而,微控制器通常用于面向控制的应用。其系统设计追求小型化,尽可能减少元器件数量。在过去,这些应用通常需要用数十个甚至数百个数字集成电路来实现。使用微控制器可以减少元器件的使用数量,只需一个微控制器、少量的外部元件和存储在ROM中的控制程序就能够实现同样的功能。微控制器适用于那些以极少的元件实现对输入/输出设备进行控制的场合,而微处理器适用于计算机系统中进行信息处理。

     

    ③指令集特征

    由于应用场合不同,微控制器和微处理器的指令集也有所不同。微处理器的指令集增强了处理功能,使其拥有强大的寻址模式和适于操作大规模数据的指令。微处理器的指令可以对半字节、字节、字,甚至双字进行操作。通过使用地址指针和地址偏移,微处理器提供了可以访问大批数据的寻址模式。自增和自减模式使得以字节、字或双字为单位访问数据变得非常容易。

     

    ⑷嵌入式片上系统

    嵌入式SOC是指在嵌入式系统中广泛应用的,有专门应用范围的SOC芯片,指的是在单个芯片上集成一个完整的系统,对所有或部分必要的电子电路进行包分组的技术。所谓完整的系统一般包括中央处理器、存储器、以及外围电路等。SoC是与其它技术并行发展的,如绝缘硅(SOI),它可以提供增强的时钟频率,从而降低微芯片的功耗。如TI的TMS320TCI6616就是一款嵌入式SOC芯片。

     

    2)   存储器

    嵌入式系统需要存储器来存放和执行代码。嵌入式系统的存储器包含Cache、主存和辅助存储器。

     

    ⑴    Cache

    Cache是一种容量小、速度快的存储器阵列它位于主存和嵌入式微处理器内核之间,存放的是最近一段时间微处理器使用最多的程序代码和数据。在需要进行数据读取操作时,微处理器尽可能的从Cache中读取数据,而不是从主存中读取,这样就大大改善了系统的性能,提高了微处理器和主存之间的数据传输速率。Cache的主要目标就是:减小存储器(如主存和辅助存储器)给微处理器内核造成的存储器访问瓶颈,使处理速度更快,实时性更强。

      

    在嵌入式系统中Cache全部集成在嵌入式微处理器内,可分为数据Cache、指令Cache或混合Cache,Cache的大小依不同处理器而定。一般中高档的嵌入式微处理器才会把Cache集成进去,cache实际就是SRAM。

     

    ⑵主存

    主存是嵌入式微处理器能直接访问的寄存器,用来存放系统和用户的程序及数据。它可以位于微处理器的内部或外部,其容量为256KB~1GB,根据具体的应用而定,一般片内存储器容量小,速度快,片外存储器容量大。  

     

    常用作主存的存储器有:  

    ROM类 NOR Flash、EPROM和PROM等。  

    RAM类 SRAM、DRAM和SDRAM等。  

    其中NOR Flash 凭借其可擦写次数多、存储速度快、存储容量大、价格便宜等优点,在嵌入式领域内得到了广泛应用。

     

    ⑶辅助存储器

    辅助存储器用来存放大数据量的程序代码或信息,它的容量大、但读取速度与主存相比就慢的很多,用来长期保存用户的信息。  嵌入式系统中常用的外存有:硬盘、NAND Flash、CF卡、MMC和SD卡等。

     

    3)   通用设备接口和I/O接口

    目前嵌入式系统中常用的通用设备接口有A/D(模/数转换接口)、D/A(数/模转换接口),I/O接口有RS-232接口(串行通信接口)、Ethernet(以太网接口)、USB(通用串行总线接口)、音频接口、VGA视频输出接口、I2C(现场总线)、SPI(串行外围设备接口)和IrDA(红外线接口)等。

     

    1.2.2中间层

    硬件层与软件层之间为中间层,也称为硬件抽象层(Hardware Abstract Layer,HAL)或板级支持包(Board Support Package,BSP),它将系统上层软件与底层硬件分离开来,使系统的底层驱动程序与硬件无关,上层软件开发人员无需关心底层硬件的具体情况,根据BSP 层提供的接口即可进行开发。该层一般包含相关底层硬件的初始化、数据的输入/输出操作和硬件设备的配置功能。

     

    BSP具有以下两个特点。  

    1)   硬件相关性

    因为嵌入式实时系统的硬件环境具有应用相关性,而作为上层软件与硬件平台之间的接口,BSP需要为操作系统提供操作和控制具体硬件的方法。

     

    2)   操作系统相关性

    不同的操作系统具有各自的软件层次结构,因此,不同的操作系统具有特定的硬件接口形式。 

     

    实际上,BSP是一个介于操作系统和底层硬件之间的软件层次,包括了系统中大部分与硬件联系紧密的软件模块。设计一个完整的BSP需要完成两部分工作:嵌入式系统的硬件初始化以及BSP功能,设计硬件相关的设备驱动。  

    1)   嵌入式系统硬件初始化 

     

    初始化过程可以分为3个主要环节,按照自底向上、从硬件到软件的次序依次为:片级初始化、板级初始化和系统级初始化。  

     

    ⑴片级初始化  

    完成嵌入式微处理器的初始化,包括设置嵌入式微处理器的核心寄存器和控制寄存器、嵌入式微处理器核心工作模式和嵌入式微处理器的局部总线模式等。片级初始化把嵌入式微处理器从上电时的默认状态逐步设置成系统所要求的工作状态。这是一个纯硬件的初始化过程。  

     

    ⑵板级初始化  

    完成嵌入式微处理器以外的其他硬件设备的初始化。另外,还需设置某些软件的数据结构和参数,为随后的系统级初始化和应用程序的运行建立硬件和软件环境。这是一个同时包含软硬件两部分在内的初始化过程。 

     

    ⑶系统初始化  

    该初始化过程以软件初始化为主,主要进行操作系统的初始化。BSP将对嵌入式微处理器的控制权转交给嵌入式操作系统,由操作系统完成余下的初始化操作,包含加载和初始化与硬件无关的设备驱动程序,建立系统内存区,加载并初始化其他系统软件模块,如网络系统、文件系统等。最后,操作系统创建应用程序环境,并将控制权交给应用程序的入口。

     

    2)   硬件相关的设备驱动程序  

    BSP的另一个主要功能是硬件相关的设备驱动。硬件相关的设备驱动程序的初始化通常是一个从高到低的过程。尽管BSP中包含硬件相关的设备驱动程序,但是这些设备驱动程序通常不直接由BSP使用,而是在系统初始化过程中由BSP将他们与操作系统中通用的设备驱动程序关联起来,并在随后的应用中由通用的设备驱动程序调用,实现对硬件设备的操作。与硬件相关的驱动程序是BSP设计与开发中另一个非常关键的环节。

     

    1.2.3操作系统层

    嵌入式操作系统在系统实时高效性、硬件的相关依赖性、软件固化以及应用的专用性等方面具有较为突出的特点,是相对于一般操作系统而言的,它除具有了一般操作系统最基本的功能,如任务调度、同步机制、中断处理、文件处理等外,还有以下

     

    1)    可裁剪性,支持开放性和可伸缩性的体系结构。

     

    2)强实时性,EOS实时性一般较强,可用于各种设备控制中。

     

    3)统一的接口,提供设备统一的驱动接口。

     

    4)操作方便、简单、提供友好的图形GUI和图形界面,追求易学易用。

    提供强大的网络功能,支持TCP/IP协议及其他协议,提供TCP/UDP/IP/PPP协议支持及统一的MAC访问层接口,为各种移动计算设备预留接口。

     

    5)强稳定性,弱交互性。嵌入式系统一旦开始运行就不需要用户过多的干预、这就要负责系统管理的EOS具有较强的稳定性。嵌入式操作系统的用户接口一般不提供操作命令,它通过系统的调用命令向用户程序提供服务。

     

    6)固化代码,在嵌入式系统中,嵌入式操作系统和应用软件被固化在嵌入式系统计算机的ROM中。

     

    7)更好的硬件适应性,也就是良好的移植性。

     

    目前应用比较广泛的嵌入式操作系统有VxWorks、WINCE、LINUX、android等,

     

    1.2.4应用软件层

    应用软件层主要是通过操作系统提供的提供的API接口来调用驱动来控制外围设备,这就是所谓的系统调用。因为是基于操作系统来开发应用,所以需要熟悉操作系统和驱动的一些架构。

     

    1.3 嵌入式系统开发流程

    图2 嵌入式系统开发流程图

     

    嵌入式系统开发的流程可分为下面几部分:

    1)    需求分析

    确定设计任务和目标,并制定说明规格文档,作为下一步设计的指导和验收标准。需求分析往往要与用户反复交流,以明确系统功能需求,性能需求,环境、可靠性、成本、功耗、资源等需求。

     

    2)    体系结构设计

    体系结构设计是嵌入式系统的总体设计,它需要确定嵌入式系统的总体构架,从功能上对软硬件进行划分。在此基础上,确定嵌入式系统的硬件选型(主要是处理器选型),操作系统的选择和开发环境的选择。

     

    3)    硬件/软件协同设计

    在这一阶段要确定硬件部分的各功能模块及模块之间的关联,并在此基础上完成元器件的选择、原理图绘制、印刷电路板(PCB)设计、硬件的装配与测试、目标硬件最终的确定和测试。

     

    4)    系统集成和调试

    将测试完成的软件系统装入制作好的硬件系统中,进行系统综合测试,验证系统功能是否能够正确无误地实现,最后将正确的软件固化在目标硬件中。本阶段的工作是整个开发过程中最复杂、最费时的,特别需要相应的辅助工具支持。

     

    5)    系统测试

    测试最终完成的系统性能是否满足设计任务书的各项性能指标和要求。若满足,则可将正确无误的软件固化在目标硬件中;若不能满足,在最坏的情况下,则需要回到设计的初始阶段重新进行设计方案的制定。

     

    2.  需求分析

    需求分析是在项目开始时最先开始的工作,主要是分析、确认用户的需求。

     

    2.1 分析和确认用户的需求

    2.1.1 分析用户对产品的需求

    通过与客户进行交流来了解客户需要开发什么样的产品,包括产品的功能、性能、价格、开发时间等一系列的问题。描述产品需求的文档通常是由嵌入式系统的总设计者从用户的视角来写的,由一系列的用户需要。

     

    客户对嵌入式系统的理解是建立在想象的基础之上的,对系统的要求可能有一些不切实际的期望,或者是使用他们自己的语言而不是专业术语来表达其需求。由于客户关于所需要系统的描述与设计师所需要的信息之间存在一些差异,所以我们需要用他们的语言来描述用户的需求,而不要用工程型的术语。

     

    客户对产品的需要一般分为功能部分和非功能部分,功能部分描述产品的用途和完成的功能,非功能部分包含以下几点:

    1)   性能

    主要是指系统的处理速度。

    2)   价格

    这是决定我们所选择的开发方案的一个主要的因素。

    3)   产品的尺寸和重量

    4)   功耗

    功耗问题在需求阶段可以以电池供电时系统的工作时间(比如正常工作5个小时)提出来,也可以以系统的总功耗提出来,比如要整个系统的功耗控制800mAh之内。

     

    2.1.2 罗列并确认用户的需求

    对于客户的需求,嵌入式系统设计师要罗列出来并且形成文档来和客户进一步沟通和确认,只有确认这些需求是满足客户要求的滞后才能开始体系结构设计。在罗列并和客户确认的过程中,一定要把客户的需求描述清楚,而且要把客户潜在的需求考虑进来。我们在开发过程中很有可能遇到客户提出新的需求,这是我们不愿意看到的,因为这会给我们的设计带来很大的麻烦,不仅添加研发和生产成本,也会延迟我们的开发时间,所以如果能在需求分析阶段能够把客户潜在的需要提出来,这是最好的。

     

    要建立一个能满足客户预期要求的产品,必须从各个方面来考虑项目,并且要问很多问题,这也是能让设计者的思维细致化的问题,比如下面的问题是设计者要求提出和确认的。

    1)    产品的用途是什么?系统的功能是什么?

    2)    用户想要如何同系统打交道?

    3)    系统的重量和体积有哪些要求?

    4)    系统需要连接哪些外设?

    5)    系统处理哪些类型的数据?

    6)    系统在什么样的环境下运行?

    7)    所要求的内存和辅助存储器多大?

    8)    用户是否需要自己更新操作系统和应用程序?

     

    如果我们没有尽量分析分析出客户潜在的需求并且得到客户的确认,而客户在研发过程当中再提出来,这就会影响了我们的项目开发的进度,下面是我在上家公司研发GPS产品的时候遇到的问题:

    1)   客户要求在产品中添加camera功能。

    2)   客户要求可以自己更新操作系统

    初步研发好样机之后,寄给美国、以色列和俄罗斯客户,它们测试之后发现了一些问题,然后我们修正了这些bug之后,需要更新上的系统,可是没有多余的样机了,而且目前产品只能通过USB来更新,而客户那边都没有这些更新的工具。在时间和成本上也不允许客户把样机寄回来更新之后再寄回去,只能把开发工具和操作系统的镜像寄给客户,而且还要写一份详细更新文档。这样客户才能更新,后来改为从SD卡来更新操作系统才解决了这个问题。

     

    2.2确定项目的约束条件

    约束条件属于项目开发过程中的不利因素,指的是项目开发过程中限制项目能否按时完成的内部和外部原因,在项目进行实际开发之前,要把约束条件找出来并且要提出解决的办法,否则很有可能会给项目带来在有效的时间内无法解决的问题。一般的约束条件有下面一些:

     

    1)  是否要满足项目的阶段性或者完工的工期限制?

    2)  项目的预算是否限制在一个固定的预算内?

    3)  分派到该项目的最大人数是多少?

    4)  员工的技术知识和经验是否足够?

    5)  该项目是否依赖于某些供应商?

    用户需求分析 User Requirement Analysis   

    在系统设计之前和设计、开发过程中对用户需求所作的调查与分析,是系统设计、系统完善和系统维护的依据.

     

    3.  体系结构设计

    此阶段是通过需求分析的结果来设计出满足用户需求的嵌入式系统产品,描述系统的功能如何实现是体系结构设计的目的,体系结构是系统整个结构的一个计划,而后用于设计并搭建整个体系结构的构件,其中系统的体系结构取决于下面的因素:

     

    1)   系统是硬实时系统还是软实时系统

    在硬实时系统的情况下,对实时的要求非常严格(如某些工业实时控制),因此,需要详细和严格地进行实时性分析。在软实时系统的情况下(如PDA等),对实时性的要求没那么严格,偶尔超时不会对系统性能造成不利的影响。

     

    2)   是否需要操作系统

    如果产品只需要非常简单的I/O操作,仅有一项或很少的事务需要处理,那么操作系统可能就不是必需的,而可以通过在裸机上编写或采用一个很小的内核来创建必要的服务。否则,最好是使用一个嵌入式操作系统来加快开发的进度。

     

    3)   产品的成本、尺寸和功耗的要求

    这些要求决定了我们需要下硬件/软件协同设计的过程中,需要确定哪些功能用硬件实现或是用软件实现,哪种方式是更好的选择。一般的原则是,如果嵌入式系统中使用的算法和计算很可能改变,软件实现是理想的选择。用硬件实现需要更多的空间、更高的成本和更大的耗电量,通常硬件的成本一般高于用软件实现的成本。但是,软件实现会降低执行速度,并且要求更高容量的存储器和更高速度的处理器,这样成本也可能更高。对于那些需要在严格时间限制内完成的密集执行的任务,必须用硬件来实现;可编程的算法可以用软件来实现,特别是需要灵活性和将来改进的算法。所以需要硬件和软件人员一起来讨论如何采用哪种方式来解决这些问题。

     

    4)   选择处理器

    如果是小型的应用,选择微控制器就可以了;否则就需要选择微处理器;但如果需要那个进行信号处理,就需要选择DSP,当然对于多功能系统中,一个嵌入式系统可以包含一个微控制器、微处理器和一个DSP,以满足不同的功能需求。

     

     

    比如对于A项目来说,根据客户的需求,我们需要选择微处理器来进行处理和控制,同时此系统并没有要求硬实时系统,但因为需要良好的人机界面,所以需要选择操作系统,这样就可以设计出下面的体系结构。

    图3 嵌入式系统体系结构体

    4. 硬件/软件协同设计

    嵌入式系统的核心处理器,所以嵌入式系统开发一般是先根据客户对产品的功能需求先来选出处理器。在选择元器件的时候都需要考虑下面一些因素:

     

    1)   成本

    包括元器件本身成本和外围电路的成本。比如对于LCD显示屏来说,有些LCD显示屏的驱动电路是设计中LCD显示屏的连接线上的,而有些就没有。

     

    2)   工作和存储温度

    这个需要根据客户的要求来选择了,对于工作温度,一般情况是民用温度范围是0°C~70°C,工业级用的温度范围是-45°C~85°C,军用级的温度范围是-55°

    C~125°C。

     

    3)   功耗

    元器件的都有对功耗指标的描述,特别要考虑的是RAM存储器、LCD显示屏和处理器的功耗,尤其是前两者,当然了,如果系统中可能还有有其他功耗很多的元器件,这和系统的应用场合有关。

     

    4)    采购周期

    这个要看要开发的产品对采购周期的依赖程度,而且采购民用级和工业级的周期也不一样,另外还要考虑生产厂家对元器件的持续生产情况。

     

    5)    电磁兼容性指标

    电磁兼容性(EMC)是指设备或系统在其电磁环境中符合要求运行并不对其环境中任何设备产生无法忍受的电磁干扰的能力。因此,EMC包括两个方面的要求:一方面是指设备在正常运行过程中对所在环境产生的电磁干扰不能超过一定的限值;另一方面是指器具对所在环境中存在的电磁干扰具有一定程度的抗扰度,即电磁敏感性。

     

    4.1 选择开发平台

    4.1.1选择处理器

    对于大多数嵌入式系统的开发者来说,往往更愿意选择自己熟悉的处理器,以节省熟悉新的处理器的时间,但是这并不一定是一种好的方案,理想的方案应该是根据用户的需求和项目的要求来选择处理器,在选择处理器是要重点考虑下面几个方面:

     

    1)   功能

    比如处理器是否集成了所需要的功能,比如,我们开发游戏机,那么就要选择集成了3D图形加速器的处理器,这样不仅可以简化了软件的开发难度,也可以充分利用3D图形硬件加速器的来处理3D图像的显示;如果我们的产品需要多个UART来同时和外围设备通信,这就要考虑所选择的处理器是否集成了足够的UART。

     

    2)   处理速度

    处理速度和CPU的内部时钟有很大的关系,这个时钟就是外部时钟(一般是晶体振荡器)经过PLL倍频后产生的,

    图4 S3C6410产生系统时钟框图

    我们知道处理器执行一条指令一般经过取指、译码和执行这三个步骤,而这个过程是需要CPU的内部时钟来同步的,所以处理器的处理速度就取决于CPU的内部时钟和指令的复杂程度。这里要注意的一个问题就是并非主频越高的处理器的处理速度就越快,这还要看它采用的是RISC(Reduced Instruction Set Computer,精简指令集计算)还是CISC(复杂指令集计算)指令集有关,只能说同一系列的处理器,主频越高,处理速度越快。

     

    我们先来了解CPI的概念:CPI(Cycles Per Instruction,每天指令周期数),也即执行一条指令所需要的周期数。在RISC芯片中,应尽量减少CPI的值来提高处理器的运算速度。

     

    一个程序总的CPI=∑(每条指令的CPI×指令的使用频率)

     

    在此假设这个程序用到A、B、C和D这几条指令,而A指令执行了2次,B指令执行了3次,C指令执行了4次,D指令执行了一次,其中执行A、B、C和D这几条指令所需要的是总能周期数分别为2、1、1和2个时钟周期,那么这个程序中的CPI=(2×2/10)+ (1×3/10)+ (1×4/10)+ (2×1/10)=1.7个时钟周期,那么可以利用下面的公式:

    CPU执行时间=此程序中的指令数量×此程序用的指令数总的CPI×时钟周期

    可以算出CPU执行这个程序的时间=4×1.7×时钟周期,这里的4是指A、B、C和D这四条指令,时钟周期是CPU内部时钟。

     

    MIPS(Million Instruction Per Second),每秒百万次指令,它=CPU执行时间的倒数。

     

    4.1.2选择外围设备

    这里主要描述主要元器件的选型,其中存储器的选择均需要考虑下面的一些指标:

    ⑴速度

    存储器的速度是用存储器访问时间来衡量的,访问时间是指存储器接收到稳定的地址输入到完成操作的时间,例如,在读出的时候,存储器往往数据总线上输出数据就是操作结束的标志。访问时间的长短主要与制造器件的工艺有关。

    图5 NAND FLASH读数据的时序图

     

    4.1.2.1    RAM存储器选择

    RAM存储器分为SRAM和DRAM,其中SRAM只要是芯片有电就会保留其中的内容,但如果切断了电源或者暂时断电了,其中的内容就会永久性丢失;而DRAM只有极短的数据寿命,通常不超过0.25s,即使是在连续供电的情况下也是如此,所以为了不让保存在DRAM中的数据丢失,就需要DRAM控制器对DRAM进行周期性刷新。

     

    SRAM和DRAM的特点比较如下:

    ⑴SRAM比DRAM速度快,因为DRAM需要周期性的刷新。

    ⑵DRAM的存储密度大于SRAM,因为SRAM的电路基本单元时晶体管,而DRAM的电路基本单元时电容。

    ⑶DRAM需要周期性刷新,所以需要专用的DRAM控制器。

     

    选择RAM时需要考虑下面一些因素:

    1)    如果系统的随机存储器的容量不是很大,一般采用SRAM;反之,选择DRAM存储器。

    2)    如果选择微处理器,而微处理器集成了DRAM控制器,这时选择DRAM比较好。

    3)    如果嵌入式系统对功耗要求比较严格,可使用SRAM,因为DRAM需要周期刷新,所以功耗更大。

    4)    位宽,也即每个传输周期传送的数据量(比如16bit)。

     

    图6 DDR SDRAM的技术参数

    4.1.2.2    FLASH存储器选择

    FLASH存储器一般分为NOR FLASH和NAND FLASH,NOR FLASH的特点是可以随机读取任意单元的内容,适合程序代码的并行读写存储;NAND FLASH可以按顺序存储单元的内容,适合于数据或文件的串行读写存储。

     

    目前NOR FLASH存储器的价格比较贵,而NAND FLASH存储器的价格相对来说比较合适,所以现在采用微处理器作为处理器的嵌入式系统中比较流行的启动方式是采用NAND FLASH的启动方式,也即把启动程序和系统的镜像写到NAND FLASH中,开机之后从NAND FLASH中启动。

     

    选择NAND FLASH时主要需要供电电压、访问时间和页编程及块擦除时间。

    图7 NAND FLASH一些技术参数

    4.1.2.3    LCD显示屏选择

    LCD显示屏选择需要考虑下面一些指标:

    1)    分辨率及尺寸

    2)    是否强光下可见。

    3)    RGB数据接口

    图8 LCD屏的功耗参数

    4.1.3选择嵌入式操作系统

     

    选择嵌入式操作系统需要考虑下面一些因素

    1)    系统的实时要求,如果要求是硬实时的系统,那么应该选择VxWorks操作系统较为合适

    2)    如果是软实时系统,而且不需要特别复杂和友好的人机界面,那么应该选择linux操作系统,否则,选择WINCE操作系统可能较好,当然,如果要开发智能手机,那么Android是比较合适的选择。

    3)    操作系统的移植难度

    4)    项目开发人员是否熟悉此操作系统

    5)    系统要求的RAM内存大小

     

    比如,如果要求嵌入式系统要求支持512MB及以上这的RAM内存,那么就不能选择WINCE操作系统了,而linux和android是可以支持的。

     

    4.1.4选择开发板或者是评估板

     

    为了加快嵌入式系统的开发,一般需要选择和我们要开发的产品功能相近的开发板,这样可以通过评估开发板的功能和性能来对我们要开发的产品有个初步的预估,而且可以先在开发板上定制系统、开发bootloader、驱动和应用程序,这样就让软件开发的工作尽可能可以和硬件同时进行。

     

    4.1.5 编程语言的选择

    选择编程语言需要考虑下面的一些因素:

    1)    软件开发人员最熟悉的是哪种语言

    使用最熟悉的语言可以开发出性能更好程序,而且较少一些bug。

     

    2)    语言使用的广泛程度

    嵌入式系统开发的系统和驱动层的开发,基本上是用汇编、C和C++,而对于应用层的开发主要是用C++、Java或者是C#,其中C++基本上是开发应用程序的通用语言,java主要用在android操作系统的应用层开发,C#主要用在WINCE和MB操作系统的应用开发中。

     

    3)    语言的性能如何

    一般来说,越是高级的语言,其编译器和运行库附件的开销越大,应用程序也就越大,那么运行速度会越慢。例如汇编语言编写程序的性能>C>C++>C#,其中C#和java需要包含额外的组件---解释器,以允许“在运行过程中”处理代码,至于C#和java哪个性能较好,应该看应用场合了。

     

    4.2 硬件设计

    4.2.1原理图设计

    这一阶段的设计需要硬件开发人员熟悉处理器的功能和各个引脚的用途,下面我把之前在原理图设计阶段遇到的问题做个总结:

    1)    SDRAM bank address引脚连接出错

    根据客户的要求,我们要把产品64MB的SDRAM升级为128MB的SDRAM,可是在原理图设计的时候,把用于Bank选择的地址端画错了,就直接导致无法有效利用128MB的SDRAM,而只能使用其中的64MB,那么就只能改变来解决这个问题了

    图9 S3C2440 SDRAM地址引脚连接示例

    图10 S3C2440和SDRAM芯片的连接图

    2)    USB HOST端供电电压不足

    连接到USB HOST端的USB设备(比如U盘、USB鼠标)需要5V的供电电压才能正常工作,可是在设计的时候直接由电池输出来的电压(最大只有4.2V,这是我们选择的电池决定的)来给USB HOST端供电,这样就导致了在用电池供电的时候,USB鼠标和U盘不能工作。后来添加了一个升压IC之后才解决了这个问题。

     

    3)    CPU的LCD显示数据接口和LCD显示器的数据接口的次序没有对应

    这个问题就直接导致了显示颜色不正常,偏色等情况。

     

    4)      设计原理图的时候,需要考虑软件的实现方式,比如串口是否需要流控的方式。

     

    4.2.2 PCB设计

    这里我特别提一下SDRAM走线的问题,之前一个产品的第一板回来之后调试ok后,我们的驱动在这一版本调试完成之后也做了备份,后来经过调试之后需要做第二板,用我们之前验证ok的系统来在第二板上跑的时候,系统无法正常加载,总是停在一个固定的地方,经过检查这两个版本的原理图,其中修改的地方不可能让系统跑不起来的,经过各种修改无效之后,想到对CPU降频处理,由533MHZ降到400MHZ,这样系统就可以跑起来了,后来经过验证时SDRAM的走线引起了这个问题。

     

    4.2.3 硬件的装配和测试

    主要是样板的焊接、各模块电压电流测试和检查模块出来的波形是否正常。

     

    4.2  结构设计

    4.3  软件设计

    4.3.1 系统和驱动开发

    如果购买了开发板或者评估版,系统和驱动的开发就可以把一些尽量可以完成的工作在开发板上来完成,而不需要等到样机回来再调试,这样可以缩短开发时间。

     

    4.3.1.1 建立交叉开发环境

    因为嵌入式系统的资源受限制,无法建立起所需要的开发环境,并且对于只面对产品的嵌入式系统来说,没有必要设计成既是运行环境又是开发环境的系统。那么就需要在PC机上建立开发环境来开发出那些在嵌入式系统中运行的程序。

     

    对于要开发基于WINCE6.0操作系统的嵌入式系统,那么就需要在PC端安装VS2005+PB6.0,以及一些附件,这样就可以在PC端来开发出可以在嵌入式系统中运行的程序了。

     

    4.3.1.2 定制系统

    这需要根据应用来定制,对于WINCE操作系统来说,微软开发的VS2005+PB6.0这个IDE便于我们来定制系统

    图11 WINCE6.0的PB6.0系统定制图

    这样很便于我们根据客户的需求来定制系统,但是这需要我们熟悉操作系统的各个模块的功能,而且还要注意他们之间的依赖关系,只有对操作系统所有的模块都很熟悉,才能很快定制出所需要的操作系统,这是需要很长时间去熟悉的,尤其是linux操作系统。

     

    4.3.1.3 开发bootloader

    Bootloader的作用是初始化硬件并且引导操作系统,还有一个更为重要的功能就是把操作系统镜像文件写到FLASH中,这是我们在开发及调试过程中需要经常性的动作。

    图12  bootloader引导系统启动的流程图

     

    开发bootloader的主要内容如下:

    1)    选择更新系统的方式

    在开发过程中,我们一般通过USB、网口或者是SD卡的下载方式来把操作系统写到FLASH中,当然了,bootloader也以把自身的镜像文件写到FLASH中。

    2)    在bootloader中添加产品logo的显示

    3)    在bootloader中进行充电的指示

    4)    在bootloader中进行一些参数的设置,操作系统会采用这些参数来做相应的动作。

     

    4.3.1.4 开发驱动程序

    当bootloader能够正常下载操作系统镜像文件之后,就可以在板子上进行驱动的调试了。一般情况下,CPU都集成了不同的控制器来控制对应的外围设备,比如DRAM控制器用于控制DRAM存储器,LCD控制器用于控制LCD显示屏的正常显示。下面以开发显示驱动为例来描述驱动开发主要包含的内容:

    1)    先熟悉CPU中对应的控制器部分。

    2)    掌握要驱动的外围设备的工作原理。

    3)    根据外围设备的工作原理来配置相应的控制器部分。

    4)    编译生成新的操作系统镜像文件通过bootloader写到flash后看能否正常工作,如果可以,就表示此驱动的调试基本完成了,否则就要分析问题和解决问题了。

     

    根据外围设备的特点,开发的驱动一般分为三种:

    1)    根据外围设备的时序要求,需要配置微处理器的寄存器来产生外围设备需要的时序来驱动外围设备正常工作。

    这里典型的设备就是LCD显示屏,比如我们需要根据下面的时序图来配置微处理器的寄存器,只有正确配置了寄存器,才能正常驱动LCD屏的正常显示

    图13 LCD显示屏时序参数

    这种类型的设备还有camera、VGA等。

    2)    外围设备需要正常的上电和断电要求

    图14 SIM5218的启动和关闭的电源要求

    3)    需要正常的物理连接和上电,对上电时序没有要求

    图15 SR-96的电路设计图

     

    4.3.2 应用程序开发

    应用程序开发部分即使没有开发板,也可以在模拟器中先进行调试,比如WINCE操作系统就提供WINCE模拟器来为应用程序开发人员提供开发环境,这样,应用程序开发部分也可以和硬件设计阶段并行开发。

     

    在应用程序开发阶段,驱动开发人员需要协助进行应用开发,应用程序开发的内容主要如下:

     

    1)    验证定制的操作系统是否满足客户的需要,比如对于WINCE操作系统来说,是否添加了对透明效果处理的支持,这部分可以在开发板中验证。

    2)    在开发板中根据驱动开发人员提供的接口来完成和驱动的正常通信。

     

     

    5. 系统调试和集成

    5.1 系统的调试

     

    这阶段的工作是整个开发过程中最复杂、最费时的,特别需要相应的辅助工具支持。

    主要的工作包含两方面:

    1)    硬件工程师和驱动工程师协同调试

    当样机的焊接和硬件测试完成之后,就要把正对样机移植好的操作系统下载到样机中进行调试,这时就需要硬件和驱动工程师一起调试了。先是驱动工程师通过编写驱动程序来驱动外围设备,如果不能正常驱动外围设备,就要对自己的驱动的设计进行检查,如果多次检查没有问题的情况下还是不能正确驱动外围设备,那么就要和硬件工程师沟通,说明情况,一起来解决问题。

    2)    驱动工程师和应用工程师协同调试

    在第1)部分中确认把系统所需要的功能调试完成之后,也就是驱动程序可以正常驱动外设设备之后,这时候就要把应用程序加进来一起调试,主要看应用程序是否正常调用驱动程序提供的接口来正常工作。

     

    这里总结一下之前调试过程中遇到的一些问题和总结:

    1)    SDRAM的时序要求的问题

    为了降低成本,产品由之前128MB的SDRAM换为另一种128MB的SDRAM,仔细比较这两种SDRAM的数据手册,发现几乎没有差别,可就是无法更新系统,经过多次对RAM控制器的寄存器的配置后,对CL的值由2clocks改为3clocks后,就正常工作了

    图16 S3C2440的RAM控制器CL参数

    这里是结合SDRAM中对此参数的要求来决定的

    图17 SDRAM的CL参数

    2)    SDRAM的供电电压问题

    在通过串口下载nboot的镜像文件到SDRAM并且校验的时候,校验出错,经过验证之后发现软件没有问题,只能尝试从硬件查找了,发现对SDRAM的供电不是很稳定导致的。

     

    3)    适当的备份

    在一次测试中,发现本来已经ok的功能突然不正常工作了,因为这一阶段自己做了好些修改,一时找不出问题所在,后来就怀疑是硬件的问题,经过硬件同事的对硬件的测试之后,发现硬件是ok的。这时候要判断导致此问题的办法,最好是用之前ok的软件版本来在此板子上测试,如果是ok的,那就说明是软件的问题;如果不行就说明是硬件的问题。所以这时候,之前对代码的备份就体现出其重要性了。这有助于我们对问题的定位。

    4)    硬件上的变动,就算是很小的变动,也尽量要和驱动工程师沟通和确认。

    5.2系统的集成

    将测试完成的软件系统装入制作好的硬件系统中,进行系统综合测试,验证系统功能是否能够正确无误地实现,最后将正确的软件固化在目标硬件中。主要的测试包括可靠性测试、性能测试、安全性测试、环境测试和电磁兼容测试。

     

    6. 系统测试

    6.1 测试的原因

     

    1)    找出错误

    测试是为了找出系统中存在的bug,包括硬件和软件的。

    2)    减少风险

    测试可以将自己、公司和客户的风险降到最低,测试的目标就是证明系统与软件正如设计所要求的那样正常工作。要确保产品的功能和性能可以满足可以的需求,测试人员会尽力测试系统与软件,尽可能找出任何一个可能的bug。

     

    3)    降低成本

    Bug发现的越早,修改的费用就越低。

    4)    提高性能

    找到bug并且解决了bug,能优化系统性能,而且还有可能避免致命的错误。

     

    6.2 何时测试

    在嵌入式系统进入开发的时候就可以了,比如,我们一般会在开发板上先测试系统的性能。测试包含硬件测试、软件测试,而且实际上软件过程中的调试也属于测试的范畴,这就是由开发人员进行的模块测试和调试。当然了,这部分的测试时不完整的,所以需要测试人员进行全面的测试。

     

    6.3测试的内容

    6.3.1功能测试

    功能测试也称为黑盒测试,这是因为其测试实例在设计时不引用被测试程序的实际代码部,也就是不用暴露盒子的内部,黑盒测试一般包含下面几点:

    1)    边界测试

    2)    异常测试

    3)    错误猜测

    4)    性能测试

     

    6.3.2 覆盖测试

     

    功能测试的弱点在于它很少能检查完所有的代码,而覆盖测试则尽可能使每条代码语句、判断点或是判定路径都最少被执行一次,从而避免功能测试的弱点。覆盖测试也称为白盒测试,它需要运用软件实现的全部知识来进行设计,测试时需要看到程序实现、执行的细节,白盒测试一般包含下面几点:

    1)    语句测试:选择的测试实例至少执行一次程序中的每条语句。

    2)    判断或分支覆盖:选择的测试实例使每个分支至少运行一次。

    3)    条件覆盖:选择的测试实例使每个用于判断的条件的条件具有所有可能的逻辑值。


    展开全文
  • 嵌入式系统开发圣经

    千次下载 热门讨论 2006-06-09 16:47:16
    嵌入式系统开发圣经 大小为42M的书,给你提供详细的嵌入式开发知识,是学习的好资料 本书特色:详细的理论讲解,让你全面了解当前嵌入式开发系统的发展趋势。以信息家电、智能型手机、PDA产品为出发点,广泛深入地...
  • 嵌入式系统开发设计---嵌入式系统开发设计

    万次阅读 多人点赞 2018-09-20 07:42:01
    嵌入式系统设计的主要任务是定义系统的功能、决定系统的架构,并将功能映射到系统实现... 嵌入式系统的设计方法跟一般的硬件设计、软件开发的方法不同,是采用硬件和软件协同设计的方法,开发过程不仅涉及软件领域...

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

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

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

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

     

    1 嵌入式系统设计概述

        进行嵌入式系统设计前,应明确嵌入式系统设计本身的特点及衡量嵌入式系统设计的一些主要的技术指标。

        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)对可靠性的测试级别比通用软件要高得多。

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

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

    展开全文
  • 嵌入式系统开发流程

    2019-12-24 15:21:03
    嵌入式系统开发流程 嵌入式系统的一般开发可以参照下图所示流程,但不同系统的开发应用并不一定完全一样,该图只表示出了嵌入式系统开发过程中可能包括的部分,对于复杂的系统,开发流程可能会更复杂一些。 第一步...

    嵌入式系统开发流程

    嵌入式系统的一般开发可以参照下图所示流程,但不同系统的开发应用并不一定完全一样,该图只表示出了嵌入式系统开发过程中可能包括的部分,对于复杂的系统,开发流程可能会更复杂一些。

    1. 第一步就是对系统的需求分析:确定设计任务和设计目标,一般分为功能性需求和非功能性需求两个方面,功能需求主要包括输入/输出信号和系统的操作方式等;非功能需求主要包括系统的性能、成本、功耗、体积、重量等。
    2. 需求分析后很重要的一个步骤是设计选型,包括系统中用到所有元件(功能、性能、价格、交期、可替代性等)的选型,而其中嵌入式处理器的选型尤为重要。据不完全统计,目前全世界嵌入式处理器的品种总量己经超过1000种,流行的体系结构有30多个系列。面对如此众多的处理器,设计者需要根据项目需要,综合考虑,选择出一款合适的处理器。在选择的过程中不仅应考虑处理器的运算速度、程序存储器容量、数据存储器容量、能够提供I/O口数量和功耗等问题,也应该考虑到开发工具的相关问题,比如开发工具是否容易获取,开发者对于开发工具的熟悉程度等。
    3. 选型结束后,可以进行硬件设计、制作及调试工作,当然这几步不一定一次成功,可能会有一些反复,直到硬件测试完成后,可以进入下一步软件设计工作。结合设计的软件,进行系统测试,系统测试完毕后,并不意味着嵌入式系统的开发过程全部结束。系统交付用户使用后,可能还会发现一些问题,所以之后根据用户的使用反馈,还需要对系统进一步完善。
    需求分析
    设计选型
    硬件设计
    硬件测试
    软件设计
    系统测试

    注:本文参考摘录于 《MC9S12XS单片机原理及嵌入式系统开发》

    展开全文
  • 嵌入式系统开发设计

    2019-07-11 13:02:07
    嵌入式系统开发设计 嵌入式系统设计的主要任务是定义系统的功能、决定系统的架构,并将功能映射到系统实现架构上。系统架构既包括软件系统架构也包括硬件系统架构。 嵌入式系统设计具有以下特点: 软、硬件协同...

    嵌入式系统开发设计

    嵌入式系统设计的主要任务是定义系统的功能、决定系统的架构,并将功能映射到系统实现架构上。系统架构既包括软件系统架构也包括硬件系统架构。

    嵌入式系统设计具有以下特点: 软、硬件协同并行开发; 微处理器的类型多种多样; 实时嵌入式操作系统具有多样性; 与通用系统开发相比,可利用系统资源很少; 应用支持少; 要求特殊的开发工具; 软、硬件都要很健壮; 调试很困难。

    开发模型与设计流程 :

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

    (1)瀑布模型。

    瀑布模型由五个主要阶段构成:

    需求分析阶段确定目标系统的基本特点;

    系统结构设计阶段将系统的功能分解为主要的构架;

    编码阶段主要进行程序的编写和调试;

    测试阶段检测错误;

    最后一个是维护阶段,主要负责修改代码以适应环境的变化,并改正错误、升级。各个阶段的工作和信息总是由高级的抽象到较详细的设计步骤单向流动,是一个理想的自顶向下的设计模型。

    (2)螺旋模型。

    螺旋模型假定要建立系统的多个版本,早期的版本是一个简单的试验模型,用于帮助设计者建立对系统的直觉和积累开发此系统的经验,随着设计的进展,会创建更加复杂的系统。在每一层设计中,设计者都会经过需求分析、结构设计、测试三个阶段。

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

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

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

    后端设计,如系统集成和测试要考虑整个系统。在中间阶段中,软件和硬件构件的开发彼此相互独立,并且大多数的硬件和软件的工作能够相对独立地进行。最后,要将经调试后正确无误的可执行程序固化到目标机上。

    展开全文
  • 系列索引:《嵌入式系统原理与应用》 | 嵌入式系统 重点知识梳理 ...嵌入式系统开发工具的组成 小结 嵌入式系统的开发过程 宿主机 目标机 宿主机与目标机的连接 要建立交叉开发环...
  • 本课程基于龙芯智龙开发板讲解嵌入式系统开发相关知识。 课程内容包含: 1. 实验平台介绍及开发环境的搭建。 2. Linux应用编程技术:线程、信号、网络等相关知识。 3. 操作系统内核原理及内核裁剪。 4. 开发板硬件...
  • 嵌入式系统开发环境主要包括: 集成开发工具 交叉编译器 批处理文件 makefile Link Script 调试工具 下载工具 其它工具(Offline Tools) 模拟器 版本控制工具 接下来分别讲解以上各个工具: 1、集成开发工具 一般...
  • arm9嵌入式系统开发与实践

    热门讨论 2009-07-28 02:53:32
    arm9嵌入式系统开发与实践arm9嵌入式系统开发与实践arm9嵌入式系统开发与实践arm9嵌入式系统开发与实践arm9嵌入式系统开发与实践arm9嵌入式系统开发与实践
  • 嵌入式系统开发概述

    2016-11-02 23:12:07
    嵌入式系统开发概述: 1、嵌入式的理解? 2、嵌入式开发和单片机的开发的区别?  传统开发又叫单片机开发,传统开发的缺点有两个:第一,软件的可移植性差。第 二,软件开发人员必须懂硬件的工作原理。  嵌入式...
  • ARM嵌入式系统开发:软件设计与优化ARM嵌入式系统开发:软件设计与优化ARM嵌入式系统开发:软件设计与优化ARM嵌入式系统开发:软件设计与优化ARM嵌入式系统开发:软件设计与优化ARM嵌入式系统开发:软件设计与优化...
  • 嵌入式系统开发学习笔记(5)

    千次阅读 热门讨论 2021-03-15 14:18:21
    嵌入式系统开发学习笔记嵌入式系统开发企业级Makefile编写文件名称函数说明 嵌入式系统开发 企业级Makefile编写 文件名称 1、myhead:头文件 2、总控Makefile:进入各个功能子目录执行make命令,并将所有的.o文件...
  • 嵌入式系统开发步骤

    千次阅读 2014-11-01 23:14:48
    大致讲解嵌入式系统开发的步骤
  • 嵌入式系统开发小白学习笔记(11)

    千次阅读 2021-03-23 08:17:09
    嵌入式系统开发上期回顾嵌入式系统开发工具(一)文件编程Linux文件(二)进程线程编程(三)TCP/UDP 上期回顾 嵌入式系统开发小白学习笔记(10) 嵌入式系统开发工具 (一)文件编程 Linux文件 (1)文件本身包含...
  • 得益于开源软件的发展,完全可以基于全开源软件做嵌入式系统开发
  • 嵌入式系统开发小白学习笔记(9)

    千次阅读 热门讨论 2021-03-19 08:09:52
    嵌入式系统开发上期回顾嵌入式系统开发工具(接上期)shell变量类型(四)变量表达式 上期回顾 嵌入式开发小白学习笔记(8) 嵌入式系统开发工具(接上期) shell变量类型 (四)变量表达式 1、test时shell程序中的...
  • 嵌入式系统开发-学习路线

    千次阅读 2018-06-23 11:53:24
    嵌入式系统开发 随着嵌入式设备的普及,嵌入式应用的需求量也随之增大,本课程将重点培养基于linux系统下的嵌入式应用开发,包括5个阶段,其中课程涵盖了linux系统下的多进程、多线程嵌入式开发,网络编程,ARM体系...
  • 基于状态机的嵌入式系统开发

    热门讨论 2011-04-02 15:54:35
    基于状态机的嵌入式系统开发是当前流行、前景广阔的嵌入式系统开发方法。本书是基于状态机的嵌入式系统开发的入门指导书,兼顾理论性与实践性,介绍了嵌入式系统及状态机的基础知识,同时加入了生动的实际案例程序。...
  • 目前嵌入式系统开发应用非常的广泛,在很多领域都有应用,而且技术更新很快。  嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于应用系统对功能、可靠性、成本、体积、功耗有严格要求...
  • 嵌入式系统开发学习笔记(4)

    千次阅读 多人点赞 2021-03-12 08:45:32
    嵌入式系统开发学习笔记嵌入式Linux开发工具调试器调试器—gdbgdb命令gdb命令使用工程管理器工程管理器—make 嵌入式Linux开发工具 调试器 调试器—gdb 1、gdb也是GUN计划(a\启动程序 b\设置断点 c\查看变量值) 2...
  • 嵌入式有不少组合名词,例如嵌入式系统,嵌入式软件,Linux嵌入式,Android嵌入式,嵌入式Web,等等。通常对嵌入式的定义其实是对"嵌入式系统"的定义。 学习Linux,必须先获得一个Linux主机环境,通常情况...
  • 嵌入式系统开发小白学习笔记(22)

    千次阅读 2021-04-12 14:59:57
    嵌入式系统开发学习笔记嵌入式系统开发链表1、任务队列2、线程池example: 嵌入式系统开发 链表 1、任务队列 (1)任务队列为空 (2)任务队列为满 (3)任务队列为不为空 任务队列为空时,线程池里的线程阻塞等待 ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 32,993
精华内容 13,197
关键字:

嵌入式系统开发