如何用一個例項來探討嵌入式軟體架構設計

badwell發表於2018-07-01

 一、感慨

近公司新招了一個做嵌入式軟體開發開發的童鞋,該童鞋是從上海的某一個上市公司出來的,因為我們這邊人手不夠,因此把他安排了去負責一個新產品的研發,前期讓他負責加速度計、NB-IOT、舵機、外接Flash的功能測試,測試完成之後,準備讓他做一個該產品的概要設計。然後他花了2個星期的時間,給我們寫出來一個概要設計,說實話,我看到這個概要設計,我就覺得是剛畢業的大學生寫的。

版本一的架構設計

2.1系統體系結構
系統分為兩層:硬體驅動層、應用層。
2.1.1硬體驅動層
硬體驅動層包含板載硬體資源正常執行所需的所有驅動程式。
1)MCU初始化
2)I2C資料存取
3)SPI資料讀取
4)加速度計初始化
5)藍芽模組啟動
6)BC95模組啟動
7)485通訊模組啟動
2.2.2應用層
1)Mcu執行模式切換
2)震動及傾斜
3)資料解析
4)開/關鎖
5)資料傳送
6)歷史資料儲存

看到版本一的架構設計之後,說實話,我還是第一次見到這樣來寫架構設計的,居然是以序號來寫的,這個讓別人讀起來,特別的彆扭。  

版本二的架構設計

看到版本二的架構設計之後,雖然頗感欣慰,但是想到達到我們所要求的,還要很大的一段距離,該架構設計,主要有以下幾點問題:

1.對架構的理解還不是很清晰,既然是做架構設計,那就應該從整體來看,而不是僅僅只是侷限於一個模組,或者功能裡面。

2.還是每個層次的理解也還不是很清晰,比如講MCU的初始化,歸於硬體驅動層裡面。MCU的初始化,嚴格意義上來說,是屬於流程的一部分了,而不是驅動。比如電腦的開啟啟動,把這個歸於硬體的驅動裡面,肯定是屬於牛頭不對馬嘴的。

3.還有就是各個模組的啟動,也是不能屬於硬體驅動層的,也都是業務流程的一部分了,都不應該屬於驅動層的一部分。

4.還有就是匯流排資料的讀寫,雖然驅動的作用也就是讀寫,但是資料匯流排的讀寫不能寫成硬體驅動。

5.應用層的系統引數初始化,也還是屬於流程。

6.資料的解析和資料的發生,都是屬於通訊功能裡面的,不應該單獨獨立出來,屬於單個的應用。

 

看到這裡之後,說實話,我真的很驚訝,難倒從大企業出來的童鞋,能力都是這樣的嗎?從大企業出來的童鞋們,工資也是要的老高老高的,難倒他們不知道,在昆明的工資,都是以K來計算的嗎?在昆明能拿到8K的工資做開發的人就已經很少了。然後再到1W

以上的,童鞋們就更少了。

說實話,我們的這位童鞋,上班的時候,還經常看電子書,在實習期間還經常看電子書,我不知道,他哪來的實力,心可以放的這麼寬,交代的活沒有完成,還有時間來看電子書。當然託他的福,我的工資也終於漲到6K了,因為新人的工資,比老人高,

做的活還是一樣的(結果一不一樣我就知道了),為了考慮到老人的心裡面不平衡,所以才給我加的工資的。領導們在批加工資的申請的時候,還專門把我叫去辦公室,讓我表決心啥的。。

 

然後,我讓他去改,把我說的這些改改,然後再看一下,還有什麼問題沒?結果我看他在那抓耳撓腮,還有各種嘆氣,然後和我說,改不了。

既然改不了,那我就只能親自操刀上陣了,畢竟同事一場。

 

 二、基本框架圖

(1)架構設計的目的

1、應用的程式碼邏輯清晰,且避免重複的造輪子。

2、如果沒有好的架構,移植將會是一件很痛苦的事情,因此一個好的架構設計,方便軟體的移植。

3、最大限度的複用。

4、高耦合低內聚。 

 

(2)設計思路

如何把硬體的驅動和一個功能封裝成一個個的模組,然後可以像小朋友搭積木一個,一個個模組可以快速的拼接起來,組成一個個不同的模型。

我們的嵌入式架構思路也是來源於此,即功能模組化設計、分層設計。

這個設計和WEB開發的MVC模式類似,都是注重分層設計。

 

模組化設計:將收集到的需求,進行歸類,總結和分析,將這些需求概括為一個個單獨的功能,每一個功能,做成一個單獨的功能模組。

分層設計一句話不好直接表達,其主要體現在一下幾方面:

1、功能模組對外呼叫的模組封裝成一個個API,將底層驅動做個API以供功能模組呼叫。(各個功能模組可以獨立編譯(如通訊模組純ANSI C,可在任意平臺複用),或者呼叫驅動層介面(日誌庫模組呼叫了驅動讀寫Flash),總而言之,言而總之,封裝出各個功能獨立的可複用的功能模組。)

2、API分為驅動層API和應用層API,而不是所有程式都呼叫驅動層API。(整個應用中都呼叫驅動層API會導致應用中驅動呼叫隨處可見,無法移植和最大限度的複用)

 

總體分 硬體驅動層-->功能模組層-->業務邏輯層-->應用層

總體結構示意框圖:

說明:

1.層與層之間不能跨層呼叫。

2.模組與模組各自獨立,無依賴關係。

3.模組提供統一的介面供上層呼叫,模組的內外介面分明。

4.模組的功能只能增,不能改。

5.各個功能模組層也還可以進行繼續分層,比如介面層、驅動層、硬體層。

 

(3)模組層次說明

硬體驅動層

硬體驅動層包含板載硬體資源正常執行所需的所有驅動程式並提供API給功能模組呼叫。

功能模組層

功能模組層包括實現具體功能的函式,通過呼叫驅動層API實現相應功能,同時提供可呼叫的API給業務邏輯層。

業務邏輯層

業務邏輯層包括產品整體功能的各個業務流程,通過呼叫功能模組層的API實現。

應用層

應用層將各個業務邏輯進行整合呼叫,完成整個產品的功能。

 

(4)優勢

如果驅動變動了,或者換不同平臺,只需更改驅動層,應用層不受影響。

如果功能模組變動了,只需升級相應的功能模組,其他的模組不受影響,應用層也不受影響。

按照這種邏輯設計好之後,主要的工作就是在業務邏輯層。應用層則為程式的總體流程和框架,主要呼叫業務邏輯層實現不同的功能。

 

 

 

相關文章