,,
(1.昆山鑫盛盟創(chuàng)科技有限公司,昆山 215300;2.蘇州大學(xué);3.武夷學(xué)院)
嵌入式系統(tǒng)終端構(gòu)件是具有通用功能的嵌入式外圍設(shè)備的軟硬件實(shí)體總稱(chēng)[1]。它們負(fù)責(zé)實(shí)現(xiàn)嵌入式系統(tǒng)的信息采集、顯示、交互、控制等具體應(yīng)用功能。這類(lèi)應(yīng)用對(duì)象具有一定的通用性,因此終端構(gòu)件可復(fù)用可移植性顯得相當(dāng)重要。當(dāng)前終端構(gòu)件的復(fù)用和移植效率還處于較低的水平。這其中有嵌入式系統(tǒng)本身特性的因素,也有設(shè)計(jì)規(guī)范化的問(wèn)題。目前市場(chǎng)上終端構(gòu)件銷(xiāo)售商通常是將工程師提供的一系列零碎的源碼、文檔、參考手冊(cè)、工具等十幾甚至幾十個(gè)文件打包和硬件一起提供給用戶(hù),用戶(hù)面對(duì)一堆雜亂無(wú)章的文件,通常需要花費(fèi)大量的時(shí)間來(lái)尋找、梳理與自己需求相關(guān)的線索。從這側(cè)面可以看出大多數(shù)嵌入式工程師的目的只是開(kāi)發(fā)出產(chǎn)品實(shí)現(xiàn)功能,構(gòu)件設(shè)計(jì)過(guò)程往往是依經(jīng)驗(yàn)行事,對(duì)于底層驅(qū)動(dòng)程序設(shè)計(jì)沒(méi)有徹底貫徹軟件工程思想,開(kāi)發(fā)過(guò)程缺少規(guī)范化的文檔管理等。這些因素都直接導(dǎo)致了終端構(gòu)件可復(fù)用性和可移植性較差。
近些年來(lái)人們參考通用計(jì)算機(jī)軟件工程體系,將基于構(gòu)件化的軟件開(kāi)發(fā)(Component-Based Software Development,CBSD)思想引入到嵌入式系統(tǒng)設(shè)計(jì)當(dāng)中。Kopetz等人提出了嵌入式軟件組合構(gòu)建理論,明確了構(gòu)件化設(shè)計(jì)、組合構(gòu)造的思想和原則,并建立構(gòu)件可組合設(shè)計(jì)的理論基礎(chǔ)[2-3]。參考文獻(xiàn)[4]提出了一種嵌入式系統(tǒng)代碼合成技術(shù),通過(guò)增加中間層,屏蔽硬件和平臺(tái)特性。本文針對(duì)嵌入式系統(tǒng)終端構(gòu)件設(shè)計(jì)可移植性差等問(wèn)題,從面向應(yīng)用對(duì)象的角度,厘清終端構(gòu)件共性和個(gè)性知識(shí)要素,建立終端構(gòu)件概念模型,從硬件原理圖繪制到驅(qū)動(dòng)程序設(shè)計(jì)一系列過(guò)程,提出一套符合構(gòu)件化思想、層次清晰、封裝合理且與MCU無(wú)關(guān)的終端構(gòu)件一般性設(shè)計(jì)方法,并通過(guò)一個(gè)液晶屏終端構(gòu)件設(shè)計(jì)實(shí)例來(lái)闡述并驗(yàn)證其合理性和有效性。
圖1 嵌入式系統(tǒng)構(gòu)件層次模型
構(gòu)件是系統(tǒng)中模塊化、可部署和可替換的部件,構(gòu)件封裝對(duì)外提供一組接口[5]。嵌入式終端構(gòu)件也稱(chēng)底層外設(shè)構(gòu)件或應(yīng)用構(gòu)件,在嵌入式系統(tǒng)中屬于最外層次的構(gòu)件,按照生產(chǎn)者和消費(fèi)者關(guān)系,終端構(gòu)件只有需求接口而沒(méi)有供給接口。需求接口接受其中間構(gòu)件或者核心構(gòu)件提供的服務(wù),如鍵盤(pán)模塊、LED或LCD顯示模塊等。終端構(gòu)件可以調(diào)用底層內(nèi)部構(gòu)件,如LCD可調(diào)用GPIO、SPI等。終端構(gòu)件通常對(duì)應(yīng)著一種或多種具體應(yīng)用功能,如嵌入式系統(tǒng)的信息采集、顯示、交互、控制等功能。嵌入式系統(tǒng)構(gòu)件層次模型圖如圖1所示。
嵌入式硬件構(gòu)件(Hardware Component,HwC)是指將一個(gè)或者多個(gè)硬件功能模塊、支撐電路及其功能描述封裝在一起,提供一系列規(guī)范的輸入/輸出接口的可重用的硬件實(shí)體[6]。一個(gè)完整硬件構(gòu)件通常包含三大部分:構(gòu)件描述、構(gòu)件實(shí)體、構(gòu)件接口[7]。構(gòu)件描述是一個(gè)硬件構(gòu)件的說(shuō)明文檔,主要內(nèi)容包括硬件名稱(chēng)、主要功能、引腳說(shuō)明及注意事項(xiàng)等。一個(gè)終端硬件構(gòu)件可表述為如下模型[8]:
HwC={構(gòu)件實(shí)體,構(gòu)件描述,接口描述};
構(gòu)件實(shí)體={封裝的硬件實(shí)現(xiàn)};
構(gòu)件描述={構(gòu)件的功能描述,構(gòu)件注意事項(xiàng)};
接口描述={接口標(biāo)識(shí),接口網(wǎng)標(biāo),接口含義,調(diào)用說(shuō)明}。
硬件構(gòu)件的概念模型可通過(guò)硬件原理圖進(jìn)行表述。為了清晰表達(dá)硬件構(gòu)件概念模型,在繪制原理圖時(shí),需遵循以下基本規(guī)則:①同類(lèi)型元器件命名時(shí)以相同字母為前綴并進(jìn)行編號(hào),如電阻名稱(chēng)為R1、R2,電容名稱(chēng)C1、C2等;②應(yīng)給出詳細(xì)的文字描述,包括構(gòu)件中英文名稱(chēng)、功能描述、接口描述以及注意事項(xiàng)等,以提升硬件構(gòu)件的可讀性;③用虛框封裝硬件構(gòu)件的電路及文字描述,虛框之內(nèi)為硬件構(gòu)件的實(shí)體;④標(biāo)明硬件構(gòu)件的對(duì)外輸入/輸出接口,接口標(biāo)識(shí)分為接口注釋和接口網(wǎng)標(biāo)兩種,接口注釋用來(lái)描述接口功能,標(biāo)于虛框之內(nèi),接口網(wǎng)標(biāo)則標(biāo)于虛框之外,用來(lái)表示電路連接特性。
對(duì)于終端構(gòu)件而言,因其只有需求接口,硬件設(shè)計(jì)時(shí)首要考慮的問(wèn)題就是該構(gòu)件需要什么樣的信號(hào)才能工作。因此繪制終端構(gòu)件原理圖時(shí),沒(méi)有對(duì)外接口網(wǎng)標(biāo)而只有接口注釋。圖2給出一個(gè)典型LCD終端構(gòu)件的原理圖。一個(gè)遵循規(guī)范繪制的原理圖,可讀性強(qiáng),與之相對(duì)應(yīng)的驅(qū)動(dòng)構(gòu)件修改方便,可有效提高移植效率。
圖2 LCD構(gòu)件原理圖
構(gòu)件是軟硬件綜合體,硬件引腳連接只是最基本前提,要實(shí)現(xiàn)構(gòu)件的正常功能,必須有構(gòu)件驅(qū)動(dòng)程序進(jìn)行配合。引腳是硬件構(gòu)件對(duì)外的唯一接口,與之對(duì)應(yīng)驅(qū)動(dòng)構(gòu)件要有相應(yīng)的代碼表達(dá)出原理圖的含義。從終端驅(qū)動(dòng)構(gòu)件可移植角度出發(fā),驅(qū)動(dòng)構(gòu)件應(yīng)面向應(yīng)用對(duì)象也就是構(gòu)件本身進(jìn)行編程,實(shí)現(xiàn)這一目的必須在驅(qū)動(dòng)程序的頭文件中添加引腳映射功能。通過(guò)引腳宏定義映射,可以屏蔽不同MCU引腳的差異性,驅(qū)動(dòng)程序編程只需針對(duì)終端構(gòu)件的引腳展開(kāi)即可,無(wú)需關(guān)心不同型號(hào)MUC引腳的區(qū)別。構(gòu)件復(fù)用到相同型號(hào)的MCU不需要更改任何內(nèi)容即可直接復(fù)用,如果移植到不同型號(hào)MCU為核心的應(yīng)用系統(tǒng)當(dāng)中,只需改動(dòng)頭文件引腳的映射關(guān)系,對(duì)于驅(qū)動(dòng)程序來(lái)說(shuō),則可做到最小的改動(dòng)即可實(shí)現(xiàn)高效移植。例如圖2中原理圖中基于恩智浦KL25微控制器的引腳映射,定義如下:
#define LCD_CLK (PTA_NUM|15) //LCD時(shí)鐘
#define LCD_SDI (PTA_NUM|16) //LCD主出從入
#define LCD_RS (PTA_NUM|4) //LCD復(fù)位
#define LCD_DC (PTA_NUM|12) //LCD數(shù)據(jù)/命令
#define LCD_SDO (PTA_NUM|17) //LCD主入從出
終端構(gòu)件是包含硬件構(gòu)件和驅(qū)動(dòng)構(gòu)件的完整軟硬件實(shí)體。硬件構(gòu)件生產(chǎn)通常都會(huì)遵循一定的標(biāo)準(zhǔn)規(guī)范。從某種意義上說(shuō),驅(qū)動(dòng)構(gòu)件設(shè)計(jì)更大程度地決定了該終端構(gòu)件的可復(fù)用和可移植性的高低。驅(qū)動(dòng)構(gòu)件是直接面向硬件操作的軟件程序及相應(yīng)的說(shuō)明文檔。驅(qū)動(dòng)構(gòu)件直接和硬件打交道,從軟件工程角度來(lái)看,驅(qū)動(dòng)程序必須與核心構(gòu)件具體型號(hào)的MCU無(wú)關(guān),而是面向終端構(gòu)件本身,這樣才具有復(fù)用和移植價(jià)值。終端驅(qū)動(dòng)構(gòu)件設(shè)計(jì)的關(guān)鍵問(wèn)題是如何對(duì)這類(lèi)構(gòu)件的共性和具體應(yīng)用系統(tǒng)的特性進(jìn)行分析,抽象出該構(gòu)件對(duì)象的屬性和對(duì)外接口[9]。
終端驅(qū)動(dòng)構(gòu)件(Terminal Drive Component,TDC)包括頭文件(.h)、源程序文件(.c)文件、文件描述、接口描述等,其概念模型可表述為:
TDC={頭文件,源程序文件,文件描述,接口描述}
頭文件={具體硬件引腳連接映射關(guān)系,功能函數(shù)聲明,全局常量定義}
源程序文件={函數(shù)功能實(shí)現(xiàn)}
文件描述={頭文件標(biāo)注,源程序文件標(biāo)注,函數(shù)頭注}
函數(shù)頭注={函數(shù)名稱(chēng),函數(shù)功能描述,返回值類(lèi)型,參數(shù)描述,注意事項(xiàng)}
參數(shù)描述={參數(shù)列表,參數(shù)方向,參數(shù)含義}
用戶(hù)在使用構(gòu)件時(shí),可以通過(guò)頭文件描述的構(gòu)件完整信息進(jìn)行接口調(diào)用,而不必關(guān)心封裝在構(gòu)件源程序中的服務(wù)實(shí)現(xiàn)細(xì)節(jié)。一個(gè)設(shè)計(jì)良好的構(gòu)件被復(fù)用或者移植到不同嵌入式系統(tǒng)中,通常只需修改少量頭文件,對(duì)于源程序盡量做到少改甚至不改。
為了便于復(fù)用和移植,驅(qū)動(dòng)構(gòu)件設(shè)計(jì)應(yīng)遵循以下基本原則和規(guī)范:
① 命名一致性原則。驅(qū)動(dòng)構(gòu)件的頭文件和源程序文件的主文件名必須與驅(qū)動(dòng)構(gòu)件名一致,構(gòu)件的屬性和內(nèi)外部函數(shù)命名統(tǒng)一以構(gòu)件名+屬性名/操作名形式,命名應(yīng)有見(jiàn)名知義的效果。
② 通信內(nèi)聚性和分層內(nèi)聚性原則。內(nèi)聚性指的是構(gòu)件內(nèi)部函數(shù)功能清晰單一明確,只負(fù)責(zé)一組相關(guān)的操作。通信內(nèi)聚指的要有專(zhuān)門(mén)負(fù)責(zé)構(gòu)件的底層通信函數(shù);分層內(nèi)聚指的是函數(shù)設(shè)計(jì)應(yīng)有層次化,高層函數(shù)能調(diào)用底層函數(shù),底層函數(shù)不能調(diào)用高層函數(shù)[10]。
③ 內(nèi)外有別原則。構(gòu)件函數(shù)分為內(nèi)部函數(shù)和外部函數(shù),內(nèi)部函數(shù)僅限構(gòu)件內(nèi)部調(diào)用,外部接口函數(shù)是外界操作構(gòu)件的接口,外部程序訪問(wèn)構(gòu)件屬性必須借助外部接口函數(shù)進(jìn)行,不可直接訪問(wèn)構(gòu)件屬性。
④ 松耦合原則。構(gòu)件應(yīng)嚴(yán)格限制全局變量的使用,且所有數(shù)據(jù)傳遞都要通過(guò)函數(shù)的形參進(jìn)行,這樣編碼既簡(jiǎn)潔高效又安全可靠。
TFTLCD即薄膜晶體管液晶顯示器,是一種常用液晶顯示器件。下面我們利用上文所述的設(shè)計(jì)思想和基本原則從原理圖繪制、公共要素分析及頭文件設(shè)計(jì)、驅(qū)動(dòng)要素分析及函數(shù)設(shè)計(jì)等方面給出一個(gè)面向應(yīng)用對(duì)象的TFTLCD構(gòu)件分析和設(shè)計(jì)完整過(guò)程。
LCD的硬件對(duì)外唯一接口是其連接引腳。因此原理圖的繪制用虛線封裝其內(nèi)部結(jié)構(gòu),虛線內(nèi)部給出引腳的基本含義,虛線外部給出對(duì)應(yīng)的接口網(wǎng)標(biāo),本例LCD引腳連接的網(wǎng)標(biāo)為恩智浦公司的Kinetis 系列KL25微控制器[11]。同時(shí)在虛擬框內(nèi)部給出詳細(xì)的構(gòu)件說(shuō)明,包括構(gòu)件中英文名稱(chēng)、各引腳功能和使用說(shuō)明以及注意事項(xiàng)等,如圖3所示。這樣在系統(tǒng)移植過(guò)程中就可快速進(jìn)行引腳的連接。
圖3 LCD構(gòu)件與KL25系統(tǒng)連接原理圖
要提高LCD構(gòu)件的可移植性,就必須實(shí)現(xiàn)面向應(yīng)用對(duì)象的設(shè)計(jì)和編程,屏蔽不同型號(hào)MCU的差異性。因此須在LCD構(gòu)件的頭文件lcd.h中對(duì)給出構(gòu)件的引腳連接的MCU的引腳進(jìn)行定義,使用宏定義描述硬件連接線,且每個(gè)接線都單獨(dú)宏定義,更具普適性。
除此之外,構(gòu)件的頭文件應(yīng)給出文件頭注,包括文件名稱(chēng)、功能概要、版本號(hào)、編寫(xiě)者或修改者姓名、最后修改時(shí)間等信息。頭文件包含(#include)為L(zhǎng)CD構(gòu)件提供服務(wù)的核心構(gòu)件或者中間構(gòu)件頭文件。LCD驅(qū)動(dòng)構(gòu)件的函數(shù)聲明都放在lcd.h頭文件。LCD驅(qū)動(dòng)構(gòu)件內(nèi)部函數(shù)和外部接口函數(shù)分開(kāi)聲明。LCD構(gòu)件使用的一些全局常量,如屏幕寬高以及顏色類(lèi)型都在lcd.h頭文件中進(jìn)行定義。
LCD構(gòu)件源程序文件lcd.c和頭文件一樣,給出文件頭注釋?zhuān)瑑?nèi)容與頭文件的頭注類(lèi)似,每個(gè)函數(shù)也都必須給出函數(shù)頭注,函數(shù)內(nèi)部代碼關(guān)鍵語(yǔ)句也應(yīng)有行注釋或邊注釋?zhuān)岣吡顺绦蚩勺x性。終端驅(qū)動(dòng)構(gòu)件函數(shù)從屬于驅(qū)動(dòng)構(gòu)件,驅(qū)動(dòng)函數(shù)的命名除要體現(xiàn)函數(shù)功能之外,還需要體現(xiàn)其從屬構(gòu)件不同的實(shí)現(xiàn)方式,如LCD_Init(LCD初始化)、LCD_ShowImage(LCD顯示圖片)等,避免構(gòu)件函數(shù)出現(xiàn)同名現(xiàn)象,同時(shí)函數(shù)名也要能夠“顧名思義”。
(1)驅(qū)動(dòng)要素分析及通信函數(shù)設(shè)計(jì)
LCD構(gòu)件能夠運(yùn)行的基礎(chǔ)是LCD與系統(tǒng)核心MCU正常通信。TFTLCD采用的驅(qū)動(dòng)控制器型號(hào)為ILI9341。構(gòu)件驅(qū)動(dòng)程序主要工作就是和ILI9341芯片打交道,MCU與ILI9341之間采用串行外設(shè)接口(Serial Peripheral Interface,SPI)方式通信。SPI通信需要考慮驅(qū)動(dòng)芯片各引腳數(shù)據(jù)傳輸?shù)臅r(shí)序問(wèn)題,對(duì)ILI9341驅(qū)動(dòng)芯片的初始化涉及對(duì)不同寄存器進(jìn)行操作,是一系列的復(fù)雜過(guò)程。對(duì)于一般嵌入式開(kāi)發(fā)人員,并不希望了解其復(fù)雜內(nèi)部機(jī)制,而是只要少量驅(qū)動(dòng)代碼修改便能移植使用。
LCD構(gòu)件的中上層函數(shù)如初始化、顯示等上層功能部函數(shù)的運(yùn)行均需建立在通信函數(shù)正常運(yùn)行的前提之下。根據(jù)構(gòu)件的通信內(nèi)聚性和分層內(nèi)聚性原則,給出了構(gòu)件專(zhuān)用底層通信函數(shù)代碼如下(按照命名一致性原則,函數(shù)命名統(tǒng)一采用LCD_操作名):
//發(fā)送8位數(shù)據(jù)
void LCD_wr_data(uint_8 data){
GPIO_set(LCD_DC,1);
//LCD_DC高電平表示發(fā)送數(shù)據(jù)
SPI_send(0,data);
//使用0號(hào)SPI模塊發(fā)送8位數(shù)據(jù)
}
//發(fā)送8位寄存器命令
void LCD_ wr_reg (uint_8 data){
GPIO_set(LCD_DC,0);
//LCD_DC低電平表示寫(xiě)寄存器
SPI_send1(0,data);
//使用0號(hào)SPI模塊發(fā)送8位寄存器命令
}
可以看出,數(shù)據(jù)通信函數(shù)調(diào)用了GPIO 構(gòu)件和SPI通信構(gòu)件。GPIO 構(gòu)件用來(lái)實(shí)現(xiàn)MCU引腳的初始化和狀態(tài)設(shè)置;SPI通信的初始化必須按照LCD驅(qū)動(dòng)芯片ILI9341設(shè)定的時(shí)序進(jìn)行。根據(jù)ILI9341參考手冊(cè)[12],該芯片使用的是數(shù)據(jù)發(fā)送低電平空閑,上升沿取數(shù)模式,對(duì)應(yīng)的時(shí)鐘極性CPOL及相位CPHA選擇均為0,因此將引腳初始化和SPI構(gòu)件初始化如下:
GPIO_init(LCD_RS,1,0);
GPIO_init(LCD_DC,1,0);
SPI_init(SPI_0,1,6000,0,0);
說(shuō)明:GPIO_init是GPIO構(gòu)件初始化函數(shù),分別將LCD_RS和LCD_DC設(shè)置為輸出引腳,默認(rèn)值為低電平。SPI_init 為構(gòu)件初始化函數(shù),參數(shù)SPI_0為0號(hào)SPI模塊;1為MCU為通信主機(jī);6000為通信波特率;最后兩個(gè)參數(shù) 0、0分別為時(shí)鐘極性及相位。這些通信的關(guān)鍵要素必須在文檔中交代清楚,以便移植時(shí)參考。終端構(gòu)件在移植時(shí),除了引腳連接和宏定義映射外,作為功能實(shí)現(xiàn)的基礎(chǔ),驅(qū)動(dòng)構(gòu)件的通信函數(shù)是極為關(guān)鍵的,必須予以高度重視。
(2)中上層功能函數(shù)設(shè)計(jì)
有了底層通信函數(shù)作為基礎(chǔ),其他中上層功能函數(shù)就可實(shí)現(xiàn)具體功能,例如LCD的初始化函數(shù)、LCD顯示區(qū)域設(shè)置函數(shù)等都是對(duì)ILI9341寄存器一系列的設(shè)置,過(guò)程相對(duì)比較復(fù)雜,但是每一種模式通常都遵循固定的順序步驟,需根據(jù)ILI9341參考手冊(cè)調(diào)用底層通信函數(shù)LCD_wr_reg等對(duì)寄存器進(jìn)行一系列的設(shè)置,設(shè)計(jì)時(shí)將具體的步驟封裝,對(duì)外屏蔽其復(fù)雜的寫(xiě)寄存器操作,必要時(shí)通過(guò)參數(shù)設(shè)置入口,開(kāi)發(fā)人員只需調(diào)用即可,該類(lèi)函數(shù)借助通信函數(shù)實(shí)現(xiàn)其操作與構(gòu)件底層通信無(wú)關(guān),易于復(fù)用和移植。下面是兩個(gè)常用功能函數(shù)樣例:
void LCD_Init(void); //LCD構(gòu)件初始化
void LCD_AreaSet(uint_16 x1,uint_16 y1,uint_16 x2,uint_16 y2);
//顯示區(qū)域設(shè)置
其中,LCD_AreaSet函數(shù)中x1、y1和x2、y2是確定顯示矩形區(qū)域的對(duì)角線兩點(diǎn)坐標(biāo)值。
LCD具體應(yīng)用功能(如畫(huà)點(diǎn)、畫(huà)線、畫(huà)圈、顯示文字、顯示圖像等)需要綜合考慮,如何進(jìn)行封裝和設(shè)計(jì),方便用戶(hù)使用。鑒于篇幅,下面以顯示圖像函數(shù)LCD_ShowImage為例進(jìn)行說(shuō)明。顯示圖像通常需要知道顯示位置、圖像尺寸和圖像的點(diǎn)陣信息,因此LCD_ShowImage函數(shù)可設(shè)計(jì)如下:
void LCD_ShowImage (uint_16 x,uint_16 y,uint_16 width,uint_16 height,uint_8 *image);
其中,x、y是圖片顯示的起始坐標(biāo),width 和height分別為圖像的寬度和高度,image則為存儲(chǔ)圖像的點(diǎn)陣信息數(shù)組首地址。函數(shù)內(nèi)部也是通過(guò)調(diào)用通信函數(shù)來(lái)實(shí)現(xiàn)圖像的顯示,用戶(hù)無(wú)需知道細(xì)節(jié),只需知道參數(shù)意義即可進(jìn)行調(diào)用。
在LCD驅(qū)動(dòng)構(gòu)件函數(shù)層次中,中上層功能函數(shù)在移植時(shí)基本無(wú)需改動(dòng),可看作驅(qū)動(dòng)構(gòu)件的通用層。移植的關(guān)鍵在于MCU頭文件和構(gòu)件的底層通信函數(shù),因此這部分可看作是LCD構(gòu)件的適配層。LCD構(gòu)件驅(qū)動(dòng)程序?qū)哟渭昂瘮?shù)關(guān)系如圖4所示。
圖4 LCD構(gòu)件驅(qū)動(dòng)程序?qū)哟文P?/p>
一個(gè)構(gòu)件的可移植性高低可以采用軟件可移植性度量進(jìn)行分析。下面分別利用基于移植成本和移植工作量?jī)煞N可移植性度量模式[13]對(duì)LCD構(gòu)件進(jìn)行可移植度量分析。
(1)基于移植成本度量
該度量模式基于軟件的可移植性和開(kāi)發(fā)成本之間的關(guān)系來(lái)衡量可移植性程度,可使用下式:
其中,DP表示可移植性大小,COSTport表示軟件的移植成本,COSTredevelop表示軟件重新開(kāi)發(fā)的成本,DP越大表示軟件的可移植性越高。從復(fù)用和移植步驟可以看出,在新系統(tǒng)移植時(shí),LCD構(gòu)件只需修改適配層的引腳定義和通信函數(shù),其他功能則基本不需改動(dòng),反映到成本上,COSTport遠(yuǎn)遠(yuǎn)小于COSTredevelop。因此,LCD構(gòu)件從成本角度看可移植性較高。
(2)基于移植工作量度量
該度量模式通過(guò)與移植環(huán)境相關(guān)的靜態(tài)指標(biāo)(如代碼修改量、移植耗時(shí)等)來(lái)衡量可移植性高低。如上文所述,LCD構(gòu)件嚴(yán)格按照構(gòu)件概念模型設(shè)計(jì),代碼具有模塊化、層次化的特征。移植新系統(tǒng)時(shí),需要修改的僅僅是頭文件的引腳定義和源文件中通信函數(shù)的重寫(xiě),除特殊情況外,其他部分基本不需改動(dòng),而且LCD構(gòu)件有規(guī)范的注釋和移植說(shuō)明、注意事項(xiàng)等文檔作為移植參考。經(jīng)實(shí)驗(yàn)室測(cè)試,在新購(gòu)的TFTLCD構(gòu)件代碼零亂、沒(méi)有相關(guān)參考文檔的情況下,移植成功花費(fèi)了大約兩天時(shí)間,而經(jīng)過(guò)本文封裝形成規(guī)范的TFTLCD構(gòu)件,交付給另一個(gè)沒(méi)有參與設(shè)計(jì)且技術(shù)水平相當(dāng)?shù)娜藛T,在基于不同型號(hào)的核心構(gòu)件系統(tǒng)中進(jìn)行移植花費(fèi)時(shí)間僅約3小時(shí),大大提高了效率,且運(yùn)行更加穩(wěn)定可靠。測(cè)試說(shuō)明按照本文提出規(guī)范設(shè)計(jì)面向應(yīng)用對(duì)象的終端構(gòu)件具有良好的可復(fù)用可移植性。