嵌入式系统的软件架构设计.docx

上传人:b****7 文档编号:16167464 上传时间:2023-07-11 格式:DOCX 页数:42 大小:51.85KB
下载 相关 举报
嵌入式系统的软件架构设计.docx_第1页
第1页 / 共42页
嵌入式系统的软件架构设计.docx_第2页
第2页 / 共42页
嵌入式系统的软件架构设计.docx_第3页
第3页 / 共42页
嵌入式系统的软件架构设计.docx_第4页
第4页 / 共42页
嵌入式系统的软件架构设计.docx_第5页
第5页 / 共42页
嵌入式系统的软件架构设计.docx_第6页
第6页 / 共42页
嵌入式系统的软件架构设计.docx_第7页
第7页 / 共42页
嵌入式系统的软件架构设计.docx_第8页
第8页 / 共42页
嵌入式系统的软件架构设计.docx_第9页
第9页 / 共42页
嵌入式系统的软件架构设计.docx_第10页
第10页 / 共42页
嵌入式系统的软件架构设计.docx_第11页
第11页 / 共42页
嵌入式系统的软件架构设计.docx_第12页
第12页 / 共42页
嵌入式系统的软件架构设计.docx_第13页
第13页 / 共42页
嵌入式系统的软件架构设计.docx_第14页
第14页 / 共42页
嵌入式系统的软件架构设计.docx_第15页
第15页 / 共42页
嵌入式系统的软件架构设计.docx_第16页
第16页 / 共42页
嵌入式系统的软件架构设计.docx_第17页
第17页 / 共42页
嵌入式系统的软件架构设计.docx_第18页
第18页 / 共42页
嵌入式系统的软件架构设计.docx_第19页
第19页 / 共42页
嵌入式系统的软件架构设计.docx_第20页
第20页 / 共42页
亲,该文档总共42页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

嵌入式系统的软件架构设计.docx

《嵌入式系统的软件架构设计.docx》由会员分享,可在线阅读,更多相关《嵌入式系统的软件架构设计.docx(42页珍藏版)》请在冰点文库上搜索。

嵌入式系统的软件架构设计.docx

嵌入式系统的软件架构设计

1.前言

嵌入式是软件设计•领域的一个分支,它自身的诸多特点决定了系统架构师的选择,同时它的一些问题乂具有相当的通用性,可以推广到其他的领域。

提起嵌入式软件设汁,传统的印象是单片机,汇编,奇度依赖硬件。

传统的嵌入式软件开发者往往只关注实现功能本身,而忽视诸如代码复用,数据和界面分离,可测试性等因素。

从而导致嵌入式软件的质量高度依赖开发者的水平,成败系之一身。

随着嵌入式软硬件的飞速发展,今天的嵌入式系统在功能,规模和复杂度各方面都有了极大的提升。

比如,Marvell公司的PXA3xx系列的最高主频已经达到SOOMhz,内建USB,WIFI,2D图形加速,32位DDR内存。

在硬件上,今天的嵌入式系统已经达到其至超过了数年前的PC平台。

在软件方面,完善的操作系统已经成熟,比如SyinbiainLinux,WinCEo基于完善的操作系统,诸如字处理,图像,视频,音频,游戏,网页浏览等各种应用程序层出不穷,其功能性和复朵度比诸PC软件不遑多让。

原来多选用专用®件和专用系统的一些商业设备公司也开始转换思路,以出色而廉价的硬件和完善的操作系统为基础,用软件的方式代替以询使用专有硕件实现的功能,从而实现更低的成本和更高的可变更,可维护性。

2•决定架构的因素和架构的影响

架构不是一个孤立的技术的产物,它受多方面因素的影响。

同时,一个架构乂对软件开发的诸多方面造成影响。

下面举一个具体的例子。

摩托车的发动机在出厂前必须通过一系列的测试。

在流水线上,发动机被送到每个工位上,山工人进行诸如转速,噪音,振动等方面的测试。

要求实现一个嵌入式设备,具备以下基本功能:

L安装在工位上,工人上班前开启并登录。

2.通过传感器自动采集测试数据,并显示在屏幕上。

3.记录所有的测试结果,并提供统计•功能。

比如次品率。

如果你是这个设备的架构师,哪些问题是在设计架构的时候应该关注的呢?

2.1嵌入式常见误解

1)小型的系统不需要架构

有相当多的嵌入式系统规模都较小,一般是为了某些特定的U的而设计的。

受工程师认识,客户规模和项U进度的影响,经常不做任何架构设ih直接以实现功能为U标进行编码。

这种行为表面上看满足了进度,成本,功能各方面的需求,但是从K远来看,在扩展和维护上付出的成本,要远远高于最初节约的成本。

如果系统的最初开发者继续留在组织内并负责这个项U,那么可能一切都会正常,一旦他离开,后续者因为对系统细节的理解不足,就可能引入更多的错误。

要注意,嵌入式系统的变更成本要远远高于一般的软件系统。

好的软件架构,可以从宏观和微观的不同层次上描述系统,并将各个部分隔离,从而使新特性的添加和后续维护变得相对简单。

举一个城铁刷卡机的例子,这个例子在前面的课程中出现过。

简单的城铁刷卡机只需要实现如下功能:

一个While循环足以实现这个系统,直接就可以开始编码调试。

但是从一个架构师的角度,这里有没有值得抽象和剥离的部分呢?

1.计费系统。

计费系统是必须抽象的,比如从单次计费到按里程计费。

传感器系统。

传感器包括磁卡感应器,投币器等。

设备可能更换。

故障处理和恢复。

考虑到较高的可幕性和较短的故障恢复时间,这

2.

3.

部分有必要单独设讣。

未来很可能出现的需求变更:

L操作界面。

是否需要抽象出专门的Model来?

以备将来实现View。

2.数据统计。

是否需要引入关系型数据库?

如果直接以上面的流程图编码,当出现变更后,有多少代码可以复用?

不过,也不要因此产生过度的设计。

架构应当立足满足当前需求,并适当的考虑重用和变更。

2)敏捷开发不需要架构

极限编程,敏捷开发的出现使一些人误以为软件开发无需再做架构了。

这是一个很大的误解。

敬捷开发是在传统瀑布武开发流程出现明显弊端后提出的解决方案,所以它必然有一个更奇的起点和对开发更严格的要求。

而不是倒退到石器时代。

事实上,架构是敬捷开发的一部分,只不过在形式上,敬捷开发推荐使用更高效,简单的方式来做设讣。

比如画在口板上然后用数码相机拍下的UML图:

用用户故事代替用户用例等。

测试驱动的敬捷开发更是强迫工程师在写实际代码前设讣好组件的功能和接

口,

而不是直接开始写代码。

敬捷开发的一些特征:

针对比传统开发流程更大的系统

承认变化,迭代架构

简洁而不混乱强调测试和®构

嵌入式环境下软件设计的特点

要谈嵌入式的软件架构,首先必须了解嵌入式软件设计的特点。

1)

和硬件密切相关

2.

3.

嵌入式软件普遍对硬件有着相当的依赖性。

这体现在儿个方面:

一些功能只能通过硬件实现,软件操作硕件,驱动硬件。

硬件的差异/变更会对软件产生重大影响。

没有硬件或者硕件不完善时,软件无法运行或无法完整运行。

这些特点导致儿方面的后果:

软件丄程师对硬件的理解和熟练程度会很大程度的决定软件的性能/稳定性等非功能性指标,而这部分一向是相对复杂的,需要资深的丄程师才能保证质量。

2.软件对硬件设计高度依赖,不能保持相对稳定,可维护性和可重用

性差

3.软件不能离开硬件单独测试和验证,往往需要和硬件验证同步进行,造成进度前松后紧,错误定位范W扩大。

针对这些问题,有儿方面的解决思路:

1.用软件实现硬件功能。

选用更强大的处理器,用软件来实现部分硬件功能,不仅可以降低对硬件的依赖,在响应变化,避免对特定型号和厂商的依赖方面都很有好处。

这在一些行业里已经成为了趋势。

在PC平台也经历了这样的过程,比如早期的汉卡。

2.将对硬件的依赖独立成硬件抽象层,尽可能使软件的其他部分硬件无关,并可以脱离硬件运行。

一方面将硬件变更其至换件的风险控制在有限的范ffl内,另一方面提高软件部分的可测试性。

2)稳定性要求高

大部分嵌入式软件都对程序的长期稳定运行有较高的要求。

比如手机经常儿个月开机,通讯设备则要求24*7正常运行,即使是通讯上的测试设备也要求至少正常运行8小时。

为了稳定性的U标,有一些比较常用的设计手段:

1.将不同的任务分布在独立的进程中。

&好的模块化设计是关键

2.WatchDog,Heartbeat,重新启动失效的进程。

3.完善而统一的日志系统以快速定位问题。

嵌入式设备一般缺乏有力的调试器,日志系统尤其重要。

4.将错误孤立在最小的范M内,避免错误的扩散和连锁反应。

核心代码要经过充分的验证,对非核心代码,可以在监控或者沙盒中运行,避免其破坏整个系统。

3)内存不足

虽然当今的嵌入式系统的内存比之以K讣数的时代已经有了很大的提高,但是随着软件规模的增长,内存不足的问题依然时时困扰着系统架构师。

有一些原则,架构师在进行设计决策的时候可以参考:

(1)虚拟内存技术

有一些嵌入式设备需要处理巨大的数据量,而这些数据不可能全部装入内存中。

一些嵌入式操作系统不提供虚拟内存技术,比如WinCE4・2每个程序最多只能使用32M内存。

对这样的应用,架构师应该特别设计•自己的虚拟内存技术。

所谓的虚拟内存技术的核心是,将暂时不太可能使用的数据移出内存。

这涉及到一些技术点

1.引用讣数,正在使用的数据不能移出。

2.使用预测,预测下一个阶段某个数据的使用可能性。

基于预测移出数据或者提前装入数据。

占位数据/对象。

高速缓存。

在复朵数据结果下缓存高频率使用的数据,直接访问。

快速的持久化和装载。

下图是一个全国电宿机房管理系统的界面示意图:

每个节点下都有大量的数据需要装载,可以使用上述技术将内存占用降到最低。

(2)两段式构造

3.

4.

5.

在内存有限的系统里,对象构造失败是必须要处理的问题,失败的原因中最常见的则是内存不足(实际上这也是对PC平台的要求,但是在实际中往往忽略,因为内存实在便宜)。

两段式构造就是一种常用而有效的设计。

举例来说:

CMySimpleClass:

classCMySimpleCIass

public:

CMySimpleClass();~CMySimpleClass();

private:

intSomeData;

CMyCoinpoundCIass:

classCMyCoinpoundClass

public:

CMyCompoundClass();~CMyCompoundClass();

private:

CMySimpleClass*iSimpleClass;

在CMyCoinpoundClass的构造函数里初始化iSiinpleClass对象。

CMyCoinpoundClass:

:

CMyCompoiindClass()

iSimpleClass=newCMySimpleClass;

当创建CMyCompoundCIass的时候会发生什么呢?

CMyCoinpoundClass*myCompoundClnss=newCMyCompoundClass;

2.

3.

4.

为CMyCoinpoundClass的对象分配内存调用CMyCoinpoundClass对象的构造函数在构造函数中初建一个CMySiinpIeClass的实例构造函数结束返回

一切看起来都很简单,但是如果第三步创建CMySimpleClass对象的时候发生内存不足的错误怎么办呢?

构造函数无法返回任何错误信息以提示调用者构造没有成功。

调用者于是获得了一个指向CMyCompoundCIass的指针,但是这个对象并没有构造完整。

如果在构造函数中抛出异常会怎么样呢?

这是个著名的噩梦,因为析构函数不会被调用,在创建CMySimpleClass对象之前如果分配了资源就会泄露。

关于在构造函数中抛出异常可以单讲一个小时,但是有一个建议是:

尽量避免在构造函数中抛出异常。

所以,使用两段式构造法是一个更好的选择。

简单的说,就是在构造函数避免任何可能产生错误的动作,比如分配内存,而把这些动作放在构造完成之后,调用另一个函数。

比如:

AddressBook*book=newAddressBook()

If(!

book->Construct())

deletebook;book=NULL;

这样可以保证当Construct不成功的时候释放已经分配的资源。

在最重要的手机操作系统Symbian上,二段武构造法普遍使用。

(3)内存分配器

不同的系统有着不同的内存分配的特点。

有些要求分配很多小内存,有的则需要经常增长已经分配的内存。

一个好的内存分配器对嵌入式的软件的性能有时具有重大的意:

义。

应该在系统设计•时保证整个系统使用统一的内存分配器,并且可以随时更换。

(4)内存泄漏

内存卅t漏对嵌入式系统有限的内存是非常严重的。

通过使用自己的内存分配器,可以很容易的跟踪内存的分配释放情况,从而检测出内存泄漏的悄况。

4)处理器能力有限,性能要求高

这里不讨论实时系统,那是一块很大的专业话题。

对一般的嵌入式系统而言,山于处理器能力有限,要特别注意性能的问题。

一些很好的架构设计由于不能满足性能要求,最终导致整个项U的失败。

架构师必须明G,新技术常常意味着复杂和更低的性能。

即使这不是绝对的,山于嵌入式系统硬件性能所限,弹性较低。

一旦发现新技术有和当初设想不同之处,就更难通过修改来适应。

事实证明,嵌入式的远程控制方案还是要釆用Activex.VNC或者其他的方案。

分层结构有利于清晰的划分系统职责,实现系统的解耦,但是每多一个层次,就意味着性能的一次损失。

尤其是当层和层之间需要传递大量数据的时候。

对嵌入式系统而言,在釆用分层结构时要控制层次数量,并且尽量不要传递大量数据,尤其是在不同进程的层次之间。

如果一定要传递数据,要避免大量的数据格式转换,如XML到二进制,C++结构到Python结构。

嵌入式系统能力有限,一定要将有限的能力用在系统的核心功能上。

5)存储设备易损坏,速度较慢

受体积和成本的限制,大部分的嵌入式设备使用诸如CompactFlash,SD・miniSDMMC等作为存储设备。

这些设备虽然有着不担心机械运动损坏的优点,但是其本身的使用寿命都比较短暂。

比如,CF卡一般只能写100万次。

而SD更短,只有W万次。

对于像数码相机这样的应用,也许是足够的。

但是对于需要频繁擦写磁盘的应用,比如历史数据库,磁盘的损坏问题会很快显现。

比如有一个应用式每天向CF卡上写一个16M的文件,文件系统是FAT16,每簇大小是2K,那么写完这个16M的文件,分区表需要写8192次,于是一个100万次寿命的CF实际能够工作的时间是1000000/8192=122天。

而损坏的时候,CF卡的其他绝大部分地方的使用次数不过万分之一。

除了因为静态的文件分区表等区块被频繁的读写而提前损坏,一些嵌入式设备还要面对直接断电的挑战,这会在存储设备上产生不完整的数据。

损耗均衡的基本思路是平均地使用存储器上的各个区块。

需要维护一张存储器区块使用悄况的表,这个表包括区块的偏移位置,当前是否可用,以及己经擦写地次数。

当有新的擦写请求的时候,根据以下原则选择区块:

L尽量连续

2.擦写次数最少

即使是更新已经存在的数据,也会使用以上原则分配新的区块。

同样,这张表的存放位置也不能是固定不变的,否则这张表所占据的区块就会最先损坏。

当要更新这张表的时候,同样要使用以上算法分配区块。

如果存储器上有大量的静态数据,那么上述算法就只能针对剩下的空间生效,这种悄况下还要实现对这些静态数据的搬运的算法。

但是这种算法会降低写操作的性能,也增加了算法的复杂度。

一般都只使用动态均衡算法。

日前•比较成熟的损耗均衡的文件系统有JFFS2,和YAFFSo也有另一种思路就是在FAT16等传统文件系统上实现损耗均衡,只要事先分配一块足够大的文件,在文件内部实现损耗均衡算法。

不过必须修改FAT16的代码,关闭对最后修改时间的更新。

现在的CF卡和SD卡有的己经在内部实现了损耗均衡,这种1W况下就不需要软件实现了。

如果在向存储器写数据的时候发生断电或者被拔出,那么所写的区域的数据就处于未知的状态。

在一些应用中,这会导致不完整的文件,而在另一些应用中,则会导致系统失败。

所以对这类错误的恢复也是嵌入戎软件设讣必须考虑的。

常用的思路有两种:

1.日志型的文件系统

这种文件系统并不是直接存储数据,而是一条条的日志,所以当发生断电的时候,总可以恢复到之前的状态。

这类文件系统的代表如ex(3o

21.双备份

双备份的思路更简单,所有的数据都写两份。

每次交替使用。

文件分区表也必须是双备份的。

假设有数据块A,A1是他的备份块,在初始时刻和A的内容是一致的。

在分区表中,F指向数据块A,F1是他的备份块。

当修改文件时,首先修改数据块AI的内容,如果此时断电,A1的内容错误,但因为F指向的是完好的A,所以数据没有损坏。

如果AI修改成功,则修改F1的内容,如果此时断电,因为F是完好的,所以依然没有问题。

现在的Flash设备,有的已经内置错误检测和错误校正技术,可以保证在断电时数据的完整。

还有的包括自动的动态/静态损耗均衡算法和坏块处理,完全无须上层软件额外对待,可以当作硬盘使用。

所以,®件越发达,软件就会越可鼎,技术不断的进步,将让我们可以把更多的精力投入到软件功能的本身,这是发展的趋势。

6)故障成本高昂

嵌入式产品都是软硬件一起销售的给用户的,所以这带来了一个纯软件所不具备的问题,那就是当产品发生故障时,如果需要返厂才能修复,则成本就很高。

嵌入式设备常见有以下的儿类故障:

a)数据故障。

由于某些原因导致数据不能读出或者不一致。

比如断电引起的数据库错误。

软件本身的缺陷,需要通过发布补丁程序或者新版本的软件

b)软件故障。

修正。

比如用户下载了错误的系统内核,导致系统无法启动。

这种故障只有返厂,不属于我们的讨论范

C)系统故障。

d)硬件故障。

针对前三类故障,要尽可能保证客户自己,或者现场技术人员就可以解决。

从架构的角度考虑,如下原则可以参考:

a)使用具备错误恢复能力的数据管理设计。

当数据发生错误时,用户可以接受的处理依次是:

i・错误被纠正,所有数据有效

ii・错误发生时的数据(可能不完整)丢失,之前的数据有效。

iii.所有数据丢失

iv.数据引擎崩溃无法继续工作

一般而育,满足第二个条件即可。

(日志,事务,备份,错误识别)

b)将应用程序和系统分离。

应用程序应该放置在可插拔的Flash卡上,可以通过读卡器进行文件复制升级。

非必要的悄况不要使用专用应用软件来升级应用程序。

C)要有“安全模式S即当主系统被损坏后,设备依然可以启动,重新升级系统。

常见的uboot可以保证这一点,在系统损坏后,可以进入uboot通过tftp磴新升级。

3.软件框架

在桌面系统和网络系统上,框架是普遍应用的,比如著名的ACE,MFC,RubyOnRails等。

而在嵌入式系统中,框架则是很少使用的。

究其原因,大概是认为嵌入式系统简单,没有重复性,过于注重功能的实现和性能的优化。

在前言中我们已经提到,现在的嵌入武发展趋势是向着复杂化,大型化,系列化发展的。

所以,在嵌入式下设计软件框架也是很有必要,也很有价值的。

就面我们讲到,嵌入式系统软件架构所面临的一些问题,其中很®要的一点是,对硬件的依赖和硬件相关软件的复杂性。

还包括嵌入式软件在稳定性和内存占用等方面的苛刻要求。

如果团队中的每个人都是这些方面高手的话,也许有可能开发出高质量的软件,但事实是一个团队中可能只有一两个资深人员,其他大部分都是初级工程师。

人人都去和硬件打交道,都负贵稳定性,性能等等指标的话,是很难保证最终产品质量的。

如果组件团队时都是精通硬件等底层技术的人才,乂很难设讣出在可用性,扩展性等方面出色的软件。

术业有专攻,架构师的选择决定着团队的组成方式。

同时,嵌入式软件开发虽然复杂,但是也存在大量的重用的可能性。

如何至用,乂如何应对将来的变更?

所以,如何将复杂性对大多数人屏蔽,如何将关注点分离,如何保证系统的关键非功能指标,是嵌入式软件架构设计•师应该解决的问题。

一种可能的解决方案就是软件框架。

框架是在一个给定的问题领域内,为了重用和应对未来需求变化而设讣的软件半成品。

框架强调对特定领域的抽象,包含大量的专业领域知识,以缩短软件的开发周期,提高软件质量为U的。

使用框架的二次开发者通过重写子类或组装对象的方式来实现特殊的功能。

复用是在我们经常谈到的话题,“不要重复发明轮子是耳熟能详的戒条。

不过对于复用的理解实际上是有很多个层次的。

最基础的复用是复制粘贴。

某个功能以前曾经实现过,再次需要的时候就复制过来,修改一下就可以使用。

经验丰S的程序员一般都会有自己的程序库,这样他们实现的时候就会比新的程序员快。

复制粘贴的缺点是代码没有经过抽象,往往并不完全的适用,所以需要进行修改,经过多次复用后,代码将会变得混乱,难以理解。

很多公司的产品都有这个问题,一个产品的代码从歼一个产品复制而来,修改一下就用,有时候其至类名变量名都不改。

按照“只有为复用设计•的代码才能真正复用,,的标准,这称不上是复用,或者说是低水平的复用。

更高级的复用是则是库。

这种功能需要对经常使用的功能进行抽象,提取出其中恒定不变的部分,以库的形式提供给二次开发程序员使用。

因为设讣库的时候不知道二次开发者会如何使用,所以对设计者有着很高的要求。

这是使用最广泛的一种复用,比如标准C库,STL库。

现在非常流行的Python语言的重要优势之一就是其库支持非常广泛,相反C++—直缺少一个强大统一的库支持,成为短板。

在公司内部的开发中总结常用功能并开发成库是很有价值的,缺点是对库的升级会影响到很多的产品,必须慎之乂慎。

框架是另一种复用。

和库一样,框架也是对系统中不变的部分进行抽象并加以实现,山二次开发者实现其他变化的部分。

典型的框架和库的最大的区别是,库是静态的,由二次开发者调用的;框架是活着的,它是主控者,二次开发者的代码必须符合框架的设计,山框架决定在何时调用。

举个例子,一个网络应用总是要涉及到连接的建立,数据收发和连接的关闭。

以库的形式提供是这样的:

conn=connect(host,port);

if(conn-isvalid())

data=conn.recvO;printf(data);conn.closeO;

框架则是这样的:

classinycomin:

classconnectpublic:

host();

port();

onconnectedO;

ondataarrived(unsignedchar*data,intlen);oncloseO;

框架会在“适当汀的时机创建mycoinm对象,并査询host和port,然后建立连接。

在连接建立后,调用onconnectedO接口,给二次开发者提供进行处理的机会。

当数据到达的时候调用ondatanrrived接口让二次开发者处理。

这是好莱坞原则,“不要来找我们,我们会去找你S

当然,一个完整的框架通常也要提供各种库供.一次开发者使用。

比如MFC提供了很多的库,如CString,但本质上它是一个框架。

比如实现一个对话框的OnInitDialog接口,就是山框架规定的。

和库比较起来,框架是更针对特定领域的抽象。

库,比如C库,是面向所有的应用的。

而框架相对来说则要狭窄的多。

比如MFC提供的框架只适合于Windows平台的桌面应用程序开发,ACE则是针对网络应用开发的框架,RubyOnRails是为快速开发web站点设计的。

越是针对特定的领域,抽象就可以做的越强,二次开发就可以越简单,因为共性的东西越多。

比如我们上面谈到嵌入武系统软件开发的诸多特点,这就是特定领域的共性,就属于可以抽象的部分。

具体到实际的嵌入式应用,乂会有更多的共性可以抽象。

框架的设tiu的是总结特定领域的共性,以框架的方式;实现,并规定二次开发者的实现方式,从而简化开发。

相应的,针对一个领域开发的框架就不能服务于另一个领域。

对企业而言,框架是一种极好的积累知识,降低成本的技术手段。

解除耦合和应对变化

框架设讣的一个重要U的就是应对变化。

应对变化的本质就是解耦。

从架构师的角度看,解耦可以分为三种:

L逻辑解耦。

逻辑解耦是将逻辑上不同的模块抽象并分离处理。

如数据和界面的解耦。

这也是我们最常做的解耦。

2.知识解耦。

知识解耦是通过设讣让掌握不同知识的人仅仅通过接口工作。

典型的如测试工程师所掌握的专业知识和开发工程师所掌握的程序设让和实现的知识。

传统的测试脚本通常是将这.一者合二为一的。

所以要求测试工程师同时具备编程的能力。

通过适当的方式,可以让测试丄程师以最简单的方式实现他的测试用例,而开发人员编写传统的程序代码来执行这些用例。

3.变与不变的解耦。

这是框架的要特征。

框架通过对领域知识的分析,将共性,也就是不变的内容固定下来,而将可能发生变化的部分交给二次开发者实现。

框架可以实现和规定非功能性需求

非功能性需求是指如性能,可幕性,可测试性,可移植性等。

这些特性可以通过框架来实现。

以下我们一一举例。

性能。

对性能的优化最忌讳的就是普遍优化。

系统的性能往往取决于一些特定的点。

比如在嵌入式系统中,对存储设备的访问是比较慢的。

如果开发者不注意这方面的问题,频繁的读写存储设备,就会造成性能下降。

如果对存储设备的读写山框架设计,二次开发者只作为数据的提供和处理者,那么就可以在框架中对读写的频率进行调节,从而达到优化性能的U的。

山于框架都是单独开发的,完

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 自然科学 > 物理

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2