軟件架構(gòu)是體現(xiàn)在其組件中的系統(tǒng)的基本組織,它們之間的相互關(guān)系和環(huán)境,以及指導(dǎo)其設(shè)計(jì)和發(fā)展的原則[1]。軟件架構(gòu)不意味著一次就可以創(chuàng)建并固定下來(lái)。相反,在嵌入式開(kāi)發(fā)中,軟件架構(gòu)應(yīng)該在產(chǎn)品的整個(gè)生命周期中不斷發(fā)展和變化。
在實(shí)施過(guò)程中經(jīng)過(guò)思考并不斷發(fā)展的軟件架構(gòu)有很多好處,例如:
充當(dāng)正在建設(shè)的項(xiàng)目的路線圖
提供可用于培訓(xùn)工程師和向管理層和利益相關(guān)者解釋軟件的軟件圖
最大限度減少不必要的返工
降低開(kāi)發(fā)成本
團(tuán)隊(duì)可以使用五個(gè)步驟來(lái)開(kāi)發(fā)和發(fā)展他們的軟件架構(gòu):
1.分離軟件架構(gòu)
2.識(shí)別和跟蹤數(shù)據(jù)資產(chǎn)
3.分解系統(tǒng)
4.界面和組件設(shè)計(jì)
5.模擬、迭代和縮放
今天讓我們來(lái)了解一下第1個(gè)步驟。
步驟 1–分離軟件架構(gòu)
許多嵌入式開(kāi)發(fā)團(tuán)隊(duì)將他們的軟件架構(gòu)視為一個(gè)單一的內(nèi)聚架構(gòu),包括應(yīng)用程序代碼和硬件交互。以這種方式看待架構(gòu)并不奇怪,因?yàn)榍度胧杰浖こ處熗ǔ挠布慕嵌葋?lái)看待他們的系統(tǒng)。嵌入式軟件是獨(dú)特的,因?yàn)樗仨毰c硬件交互,這不同于所有其他軟件工程領(lǐng)域。雖然這是真的,但是現(xiàn)代軟件架構(gòu)師將會(huì)并且應(yīng)該把依賴(lài)于硬件和獨(dú)立于硬件的軟件分開(kāi),如圖1所示。
圖1——嵌入式軟件架構(gòu)分為硬件相關(guān)和獨(dú)立架構(gòu),通過(guò)抽象層進(jìn)行交互。(圖片來(lái)源:嵌入式軟件設(shè)計(jì)[2])。
傳統(tǒng)上,開(kāi)發(fā)人員將設(shè)計(jì)和實(shí)現(xiàn)他們的架構(gòu),以便硬件的獨(dú)立層和依賴(lài)層緊密耦合。但是不幸的是,緊密耦合的架構(gòu)有很多問(wèn)題。
緊密耦合架構(gòu)的問(wèn)題
首先,它們不太便于攜帶。例如,如果微控制器突然變得不可用,會(huì)發(fā)生什么?如果代碼是緊密耦合的,那么試圖將應(yīng)用程序代碼轉(zhuǎn)移到新的微控制器上運(yùn)行就變得非常困難。應(yīng)用程序代碼與微控制器上的底層硬件調(diào)用緊密耦合!如果嵌入式開(kāi)發(fā)人員不更新他們的架構(gòu),他們就不得不重新檢查所有的代碼,并修改與硬件交互的每一行代碼。更新架構(gòu)的公司通過(guò)抽象和依賴(lài)注入打破了架構(gòu)耦合。
其次,在開(kāi)發(fā)環(huán)境中而不是在目標(biāo)硬件上對(duì)應(yīng)用程序進(jìn)行單元測(cè)試幾乎是不可能的。如果應(yīng)用程序代碼直接調(diào)用硬件,大量的工作將進(jìn)入測(cè)試工具以成功運(yùn)行測(cè)試,或者測(cè)試將需要在硬件上完成。在硬件上進(jìn)行測(cè)試是緩慢的,并且通常是手動(dòng)的而不是自動(dòng)化的過(guò)程。結(jié)果是軟件沒(méi)有得到很好的測(cè)試,整個(gè)系統(tǒng)的質(zhì)量受到影響。此外,交付軟件可能需要更長(zhǎng)時(shí)間。
最后,緊密耦合的架構(gòu)會(huì)有可伸縮性問(wèn)題。緊密耦合的系統(tǒng)通常共享數(shù)據(jù)。隨著軟件系統(tǒng)試圖增長(zhǎng)和增加新的特性,每增加一個(gè)新的特性,增加新的代碼就變得更加困難。組件之間的交互、訪問(wèn)共享數(shù)據(jù)的能力以及出現(xiàn)麻煩的缺陷的機(jī)會(huì)都急劇增加。因此,盡管嵌入式開(kāi)發(fā)人員努力工作以完成工作,功能開(kāi)發(fā)可能會(huì)停滯不前。
分離架構(gòu)如何解決問(wèn)題
將軟件架構(gòu)分成依賴(lài)于硬件的和獨(dú)立的架構(gòu)解決了緊密耦合架構(gòu)的所有問(wèn)題。例如,在硬件相關(guān)架構(gòu)和獨(dú)立架構(gòu)之間創(chuàng)建一個(gè)抽象層,可以將應(yīng)用代碼從一個(gè)微控制器轉(zhuǎn)移到下一個(gè)微控制器。抽象層打破了硬件依賴(lài);換句話(huà)說(shuō),應(yīng)用程序不知道也不關(guān)心硬件。相反,應(yīng)用程序依賴(lài)于接口。新的依賴(lài)于硬件的組件只需要滿(mǎn)足接口的要求,這意味著如果我們改變硬件,只有硬件模塊改變!而不是整個(gè)代碼庫(kù)。
在兩個(gè)架構(gòu)之間添加一個(gè)抽象層也解決了單元測(cè)試的許多問(wèn)題。有了抽象層,就更容易創(chuàng)建向應(yīng)用程序代碼返回預(yù)期和意外數(shù)據(jù)的測(cè)試替身和模擬。我們甚至不需要硬件就可以編寫(xiě)所有的應(yīng)用程序代碼!
當(dāng)我們保持我們的體系結(jié)構(gòu)獨(dú)立,并專(zhuān)注于最小化耦合時(shí),擴(kuò)展軟件就變得容易多了。然而,僅僅因?yàn)槲覀兎纸饬思軜?gòu)并不意味著我們不能在每個(gè)架構(gòu)中產(chǎn)生耦合和內(nèi)聚的問(wèn)題。我們?nèi)匀恍枰_保我們遵循固體兩種架構(gòu)中的原則。好消息是,它允許嵌入式開(kāi)發(fā)人員獨(dú)立關(guān)注每個(gè)架構(gòu),這意味著實(shí)時(shí)和硬件約束問(wèn)題不會(huì)進(jìn)入核心應(yīng)用程序邏輯。
最后一個(gè)好處是,通過(guò)分離依賴(lài)于硬件和獨(dú)立的架構(gòu),我們可以在硬件可用之前專(zhuān)注于開(kāi)發(fā)和交付應(yīng)用程序。這樣做的好處是,客戶(hù)和管理層可以提前訪問(wèn)應(yīng)用程序并提供反饋。然后迭代應(yīng)用程序并關(guān)注于確保它滿(mǎn)足實(shí)際需求的能力變得更加易于管理。今天,太多的團(tuán)隊(duì)專(zhuān)注于首先準(zhǔn)備好硬件,而核心應(yīng)用程序是事后才想到的。這不是設(shè)計(jì)和構(gòu)建系統(tǒng)的方法。
軟件架構(gòu)設(shè)計(jì)第1步結(jié)論
軟件架構(gòu)可以幫助團(tuán)隊(duì)控制他們的軟件。成功的軟件架構(gòu)通常是通過(guò)迭代和演化創(chuàng)建的。設(shè)計(jì)軟件架構(gòu)的第一步是認(rèn)識(shí)到嵌入式系統(tǒng)不只有一種架構(gòu)。取而代之的是兩種架構(gòu):硬件依賴(lài)型和獨(dú)立型架構(gòu)。有目的地分離這些架構(gòu)允許嵌入式開(kāi)發(fā)人員利用現(xiàn)代軟件技術(shù)和方法來(lái)改進(jìn)上市時(shí)間、質(zhì)量和開(kāi)發(fā)成本。