UML嵌入式系统开发实例文档格式.docx
- 文档编号:21330314
- 上传时间:2023-01-29
- 格式:DOCX
- 页数:12
- 大小:136.65KB
UML嵌入式系统开发实例文档格式.docx
《UML嵌入式系统开发实例文档格式.docx》由会员分享,可在线阅读,更多相关《UML嵌入式系统开发实例文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
介面用途:
从硬体的PnP谈起
硬体埠(Port)就是介面
8051硬体的埠(Port)其实就是介面,透过介面可以连接到LED、蜂鸣器、及键盘(Keyboard)等等。
如下图:
硬体的介面
有了像P0、P1等介面,ㄧ个8051单晶片就可以随时与LED显示器分合自如,也就俗称的PnP(PlugandPlay)。
日常生活中的介面
上述的介面观念并不是电脑硬体才有。
在一般生活上已经存在非常久远了。
例如:
例如家中墙壁上的插头介面:
日常生活中的「插头/插座」介面
上图里,X、Y、Z牌的电器皆提供双脚插头。
而A、B皆为双孔插座。
透过介面能带来许多方便,例如Z可插在A上,也可将Z拔出来换插在B上﹔X可随时插到A或B。
所以共可有XA、XB、YA、YB、ZA、ZB六种搭配,极具弹性。
X、Y、Z三者具有共同介面。
A、B具有共同介面。
双方介面能相容合作,就创造出极大弹性了。
插头与插座两个族群能各自发展,只要介面一致,就能相辅相成。
例如电器业者可以推出更多种的电器,则电器体系就会无限成长了,如下图所示。
「插头」体系之扩充
由于Ym、Yn及K与X、Y、Z的介面是一致的,都提供双脚插头。
所以皆可买回家插在A或B牌插座上。
同理,插座族群亦能扩充如下图所示:
「插座」体系之扩充
这两族群在独立成长的过程中,其介面维持不变,保持其相容性。
所以新型电器如Ym,可插在新型的C电脑桌之插座上。
当然,新旧也仍可搭配,如X可插在D餐桌之插座上,以上是带给消费者之利益;
此外,也带给生产者好处:
电器设计者(如声宝家电)不必考虑到插座背后的电源构造(及其可能之变化),只要介面一致(两脚插头搭配双孔插座)就行了。
另一方面,插座背后电源结构之设计者(如水电设计师)也不必费心去了解电器之构造,只要提供一致介面(两脚插头搭配双孔插座)就行了。
因此,消费者、电器制造者、及水电设计师三方皆获得益处。
如此,系统不只追求一时的连结,更要追求持久的和谐与成长。
为了达成这个目标,系统的新陈代谢必须顺畅,也就是,系统内之物件必须能随时迅速汰旧换新、分合自如(即PnP)。
汽车轮盘就是介面
为了实现PnP,我们必须进行介面设计,就如同汽车的轮胎能随时抽换(PnP),其依赖标准的轮盘(即介面)设计。
也是因为能随时抽换轮胎(即分合自如),所以汽车能持久保持整体的和谐。
PnP(即分合自如)是目的,而介面是手段。
介面设计之优劣关系到PnP之效果。
例如上述的汽车轮胎坏了,只要从介面(如轮盘)卸下坏轮胎,换上新轮胎就让汽车恢复了。
轮盘介面之存在价值就在于:
汽车的部份(如轮胎)受损了,只要PnP、迅速换上新轮胎,就不牵累了整部汽车,避免汽车瘫痪。
就轮胎的角度而言,汽车是轮胎的Client,它正使用轮胎,接受轮胎的服务。
当NISSAN汽车能以一视同仁的态度来对待不同厂牌的轮胎(如固特异轮胎、南港轮胎)时,也就是不同厂牌的轮胎,只要合乎轮盘介面,就能PnP到汽车上,这就是多形性了。
所以多形性与PnP的涵意是一致,都意味着:
做好介面设计,促进物件之分合自如,让系统不会因某部份改变而造成瘫痪,反而新陈代谢顺畅、生生不息。
介面代表一个空间
轮盘介面,代表一个虚的空间,凡是符合此介面的物件(包括未来可能会出现的新品牌轮胎),皆属于该空间的元素。
此空间内的元件会生生不息、推陈出新、更新版本,就是所有过去、现在、未来的多形性物件的集合,就是此空间。
这个空间是跨时间的,也是跨空间的。
透过介面空间容纳更多别人未来的元件,不但整合了别人的元件,也整合别人源源不绝的设计智慧,让自己成长更快。
此外,也整合别人过去、现在、未来所设计的产品。
如此,一方面让自己的系统生生不息;
另一方面让别人的物件拥有更多用途和历练、品质更加精美;
回过头来,更促进我们系统的品质与生命力,构成Win-Win-Win.....的繁荣景象。
因之,介面是系统分析与设计的关键、是追求系统品质的尚方宝剑。
软体介面
在8051硬体组件里含有嵌入式软体,如下图:
图嵌入式软体的角色
如果软体也有埠可连结硬体埠时,如下图:
软体物件的介面
LED物件的data_port连接到8051硬体组件P0时,其关系就相当于硬体组件P0连接到LED显示器之关系。
基于这个相对应关系可得到效果:
●你已经理解:
8051硬体组件很容易将LED显示器PnP掉。
●同理可知道:
LED软体物件很容易将8051硬体组件PnP掉。
当我们从8051硬体组件PnP掉LED显示器时,意味着:
8051硬体组件(如同车体)的重用(Reuse);
而不是LED显示器(如同轮胎)的重用。
许多人误解为介面设计是在追求小物件的重用,其实是不对的。
想一想,当您的台灯灯管坏了,把坏灯管拔掉,换上新灯管,结果是:
重用了整个台灯,而不是重用灯管。
在想一想,一部Benz轿车轮胎坏掉了,把坏轮胎抽换掉,整部汽车恢复完好,所以重用「整部汽车」了。
当然,轮胎也有其重用之价值,只是其价值不高;
反而重用整部汽车的价值非常高。
为了让您更深刻体会这个真谛,兹举StevenVogel在他的书----猫掌与弹弓里所说的:
「对人类来说,….系统功能要达到整齐划一,通常得凭藉建造过程的持续一贯,零件(物件)要能够彼此互换也需要高度的一贯性。
自然界确正好相反,不仅对于零件互相交换毫无兴趣,甚至还积极反对它。
(例如免疫系统排斥心脏移植)。
」
所以,介面设计之意义,并非要不断重用它来获利;
而是追求能低成本换掉坏元件,然后装上新元件;
就等于重用整个系统里的其它好物件,以及该新物件。
所以:
●轮胎(物件)是要换掉的,不要想去Reuse轮胎,其价值很低。
●换掉坏轮胎,等于再生(Renew)一部汽车,等于重用整部汽车的其它好物件,价值极大。
●换掉坏轮胎,而装上新轮胎,等于使用(UseorReuse)未来所有潜在可用的物件。
积极换掉旧物件,等于积极重用未来潜在的新元件。
重用既有元件是有意义,但是价值不高,若因之而必须调整整个系统的其他好物件(即牵一发动全身),就得不偿失了!
最后,请您看看世界知名软体专家Cheesman&
Daniels的书----UMLComponents:
ASimpleProcessforSpecifyingComponent_BasedSoftware里所说的:
“Thismaysurprisesomepeople.Manythinktheprimaryobjectiveofcomponentsisreuse.Theywanttodesignsomethingonceanduseitoverandoveragainindifferentcontexts,therebyrealizinglargeproductivitygains,takingadvantageofbest-in-classsolutions,theconsequentimprovedquality,andsoforth.Theseareadmirableobjectives,butthemaindrivertodayisthatthingskeepchanging,andoften----aswithbusiness-to-businesselectroniccommerce----thereisnolongeranyhopethatcentralizedcontrolcannotbeexerted.Insuchanenvironmentoneoftheprimaryobjectivesofacomponentisthatitmustbeeasilyreplaceable….”
(这可能会让您很惊讶!
许多人认为元件的主要目标是重用元件。
其希望只要设计一次元件,就能一再地在不同场合里反覆使用它,因而提高人员产能,运用最好的解决方案,然后改善品质等等。
但是,今天问题的根源在于一切事情都快速变迁----尤其是跨企业的电子商务----中央集权机制已无用武之地。
在此环境里,软体元件设计的首要目标就是:
能轻易把它换掉。
)
能以极低的成本换掉坏元件,就能带给软体系统弹性、灵活及生命力,其元件的新陈代谢极为顺畅。
元件(物件)就如同壁虎的尾巴,当壁虎的尾巴被猫咬住时,会立即断尾逃生。
壁虎迅速干净例落地丢弃旧物件,重用没有被咬住的身体,再生出新尾巴(物件),恢复(Renew)成一只活生生的完整壁虎。
如果壁虎不能轻易弃尾(抛弃物件)逃生,这个已经不能正常运作的尾巴(坏物件)就会拖累整只壁虎。
软体介面的范例之一
分析与设计
现在我们使用KeilC来逐步实作上图15-7的软体介面。
从下图可知LED类别需要定义两个埠,如下图:
图15-8规划LED物件的介面
以LW_OOPC定义LED类别如下:
CLASS(LED)
{
void(*data_port)(char);
void(*scan_port)(char);
……
};
接下来,设计两个channel(可呈现为物件或函数)。
例如,
staticvoidchannel_0(chary){
P0=y;
}
staticvoidchannel_1(charx){
P1=x;
其中,channel_0已经连接到P0,而channel_1已经连接到P1。
现在就拿channel_0连接到LED物件的data_port。
同时也拿channel_1连接到LED物件的scan_port上。
其指令写法为:
LED*t;
………
t->
data_port=channel_0;
scan_port=channel_1;
于是就将LED物件与8051硬体组件连接起来了,如下图:
图15-9以channel连接软体物件与硬体组件
上述图15-8和15-9都不是UML标准图示,兹以StarUML工具绘制UML的组合结构图(Composite-StructureDiagram)如下:
图15-10UML的组合结构图
以KeilC实作软体介面
首先撰写LED类别的定义:
/*EX15-led.h*/
#ifndefLED_H
#defineLED_H
void(*run)(LED*);
#endif
定义了data_port和scan_port两个函数来实现LED物件对外的埠。
接着定义一般软体内部函数run()来处理物件内部的事务。
如下述程式码:
/*EX15-led.c*/
#include<
REG52.H>
#include"
lw_oopc_kc.h"
ex15-led.h"
voidg_delay(unsignedlongms){
longi,j;
for(i=0;
i<
ms;
i++)
for(j=0;
j<
120;
j++);
staticunsignedcharSEGTAB[]={0xC0,0xf9,0xa4,0xb0,0x99,0x92,0x83,0xf8,0x80,0x98};
staticunsignedcharSCANLINE[]={0xf7,0xfb,0xfd,0xfe};
staticvoidrun(LED*t){
unsignedcharch,sc;
/*--------------------*/
P0=0xf0;
ch=SEGTAB[0];
sc=SCANLINE[0];
scan_port(0xff);
data_port(ch);
scan_port(sc);
g_delay(20000);
ch=SEGTAB[9];
sc=SCANLINE[1];
CTOR(LED)
FUNCTION_SETTING(run,run)
END_CTOR
执行run()函数里的指令:
就把channel_0()和channel_1()连接到LED物件的两个埠上。
接下来的指令:
//取得'
0'
这个数字的data_code
//取得显示在第0个位置的scan_code
//清除
//送出data_code到P0
//送出scan_code到P1
于是LED显示器的第1位数出现'
。
再来的指令:
9'
//取得显示在第1个位置的scan_code
于是LED显示器的第2位数出现'
最后撰写main()函数:
/*EX15-ap-1.c*/
externvoid*LEDNew();
charxdataMemPool[1024];
voidmain(void){
LED*led;
init_mempool(MemPool,sizeof(MemPool));
/*--------------------------*/
led=LEDNew();
led->
run(led);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- UML 嵌入式 系统 开发 实例