如何設計一個好的軟件架構,如何提高軟件的擴展性,移植性,復用性和可讀性?
很多做嵌入式開發的朋友經常會遇到這種情況:一個項目軟件設計完成了,客戶提出了一些新的功能需求。這時侯如果客戶新需求不多,軟件增加一些新功能即可,但是增加新功能后程序容易出現各種異常問題;這時侯如果客戶新需求很多,導致軟件全局很多地方需要修改,甚至有可能導致軟件重寫。造成這種結果的原因是,軟件設計沒有遵循軟件設計原則,沒有使用正確的設計模式和正確的軟件架構。
軟件設計五大原則:單一原則 ,開閉原則,里氏代換原則,接口隔離原則,依賴倒置原則。
27種設計模式:適配器模式,裝飾模式,觀察者模式,迭代器模式,拜訪者模式等等(不一一列舉)。
軟件架構:分層架構,過濾器架構,插件架構,MVC架構等等。
規則和方法繁多,往往難以融會貫通地使用到實際項目中,接下來我用一個項目來介紹如何遵循軟件設計原則,如何使用良好的設計模式和架構,這個項目是一個用于智能家具系統的網關軟件設計項目。
我們先來了解一下智能家居系統,它是由網關,智能觸控屏,控制模塊,檢測模塊等組成,實現對家居設備智能控制。該系統可以控制燈,空調,窗簾,藍牙音樂,地暖等家居設備。用戶可以通過語音指令,智能觸控屏,手機App,電腦云端等方式監控家居設備狀態。該系統應用場景如圖:
網關功能描述
智能家居系統的控制樞紐是網關,網關的主要任務是實現對觸控模塊,控制模塊,檢測模塊的狀態監測和控制。網關的功能如下:
1、使用嵌入式以太網控制器硬件實現TCP訪問局域網內的本地服務器和外網的云端服務器。本地服務器可以配置網關參數,可以通過網口對網關固件進行升級,用戶通過手機APP使用云端服務器下發數據給網關。
2、使用485總線接收面板的和環境傳感器的上報數據,分析數據并下發485指令操作開關控制器實現對執行單元的控制。
3、用戶可以通過擴展的輸入輸出IO口,實現簡單的開關輸入和控制。
網關硬件描述
網關的硬件使用華大的HC32F460單片機為核心,外圍設備有485電路,RTC電路,LCD電路,以太網控制器電路,IO控制電路。網關的硬件框圖如下:
軟件框架
網關軟件使用FreeRTOS操作系統,采用了模塊化設計方法,每個功能獨立成一個模塊,每個單獨的模塊采用了分層設計。軟件框架圖如下:
軟件使用了模塊化設計的方法,模塊化設計核心思想就是“分而治之”, 就是把一個復雜的問題分解為若干個簡單的問題,然后逐個解決。在嵌入式軟件設計中通常以硬件外設劃分模塊如:485模塊,RTC模塊,LCD模塊,溫濕度模塊,ADC數據采集模塊,GPIO控制模塊等。模塊化設計提高了軟件系統的擴展性,模塊可以根據需求布署和刪除,模塊化設計遵循了單一原則。軟件工程源碼中模塊的劃分如下:
單獨的功能模塊采用了的分層設計,分層設計的核心思想也是“分而治之”,分層設計將軟件功能水平分割成合理的多個子系統,軟件中緊密關聯的部分被集中放在一個層內。分層設計的框圖如下:
分層架構有以下優點:
1、每一層都把一個具體功能抽象化。
2、可以降低代碼的相互依賴程度,更改代碼時影響的層很少。
3、層可以被復用。
軟件工程源碼中GPIO任務的BSP層代碼如下:
每個層都有一個xxxx_interface()函數,上層文件通過這個函數使用下層提供的服務,這種設計原則為接口隔離原則。3層模型的調用關系圖如下:
每個功能模塊采用了3層的分層設計,第1層處理MCU寄存器相關操作,第2層處理驅動控制和邏輯控制,第2層用來處理與其他業務模塊的數據交互.分層設計提高了軟件系統的移植性,如果項目更換了MCU那么只用修改第1層,如果更換改了外設那么只用修改第2層,如果更改了業務邏輯那么只用修改第3層。
任務之間通信
網關軟件中的普通任務相互隔離,所有普通任務只與消息推送任務進行數據交互,消息推送任務將消息推送給相應任務。各個任務之間的信息交互模式如下:
這種設計模式為中間者模式。在中間者模式,對象之間不能直接通信,而是間接地通過中間者進行通信。中間者收到信息后,再將信息轉發給相關對象,這樣減少了對象之間的相互依賴。中間者模式有以下優點:
1、對象之間是松耦合
2、將多對多的關系通過中間者轉換成一對一的關系
3、修改一個對象,不需要考慮其它對象通信適應問題。
消息推送任務采用訂閱與發布機制。普通任務狀態改變向消息推送任務發布消息,推送任務獲取發布任務的發布信息名稱,并一層檢查其他任務的訂閱信息名稱,是否包含發布信息名稱,然后將信息推送給相關任務。這樣減少了任務之間的耦合,提高了軟件的擴展性。消息推送任務代碼如下:
業務控制
網關軟件使用模塊化設計,普通任務不參入軟件的整體業務控制,每個普通任務只負責完成模塊內部的控制邏輯,如RTC任務時負責設置時間和讀取時間,GPIO只負責讀取IO口和控制IO口。軟件設計了一個特殊的邏輯控制任務,這個任務負責記錄軟件整體狀態,并通過發布消息改變其他的任務的狀態。這種也是使用的中間者模式。邏輯框圖如下:
邏輯控制任務是通過發布特定的消息來實現對子任務的控制,子任務狀態改變后也是通過發布消息通知邏輯控制任務。
邏輯控制任務分析
網關軟件中邏輯控制任務控制整個程序運行狀態,因此邏輯控制任務設計非常關鍵,邏輯控制任務設計軟件設計框架如下:
子任務將信息發布給邏輯控制任務,由于不同的子任務發布的消息格式不同,數據長度不同,因此邏輯控制任務先用指令歸一化接口,將不同模塊的不同格式的數據轉換成邏輯任務中統一的數據格式如:指令類型+指令數據。代碼如下:
指令歸一化處理后將指令放入隊列緩存器中,然后指令過濾器讀取隊列緩存器中的指令進行處理,這種設計模式為命令模式,這種設計模式可以把一個命令的形成和執行在時間上去耦,命令的生成和執行可以在不用時間完成。
指令過濾器從指令隊列中讀取指令,并一層一層處理指令得到有效的執行指令,這種設計構架為過濾器構架,代碼如下:
經過邏輯處理后產生一些控制指令,并將控制指令放入隊列緩存,指令分發處理模塊讀取控制指令,根據控制指令類型發布消息給相應的任務。
總結
網關的軟件框架基本描述完了,希望獲取源碼的朋友們可以在評論區里留言,我將提供學習源碼(刪減部分與商業相關代碼)。
總結一下關鍵詞:
模塊化設計,分層設計,單一原則,接口隔離原則,中間者模式,訂閱發布,歸一化,命令模式,過濾器架構






