一
錯誤的示范
近公司新招了一個做嵌入式軟件開發(fā)的同事,該同事是從上海的某一個上市公司出來的,因為我們這邊人手不夠,因此把他安排了去負責(zé)一個新產(chǎn)品的研發(fā),前期讓他負責(zé)加速度計、NB-IOT、舵機、外置Flash的功能測試,測試完成之后,準(zhǔn)備讓他做一個該產(chǎn)品的概要設(shè)計。然后他花了2個星期的時間,給我們寫出來一個概要設(shè)計,說實話,我看到這個概要設(shè)計,我就覺得是剛畢業(yè)的大學(xué)生寫的。版本一的架構(gòu)設(shè)計
2.1系統(tǒng)體系結(jié)構(gòu)系統(tǒng)分為兩層:硬件驅(qū)動層、應(yīng)用層。2.1.1硬件驅(qū)動層硬件驅(qū)動層包含板載硬件資源正常運行所需的所有驅(qū)動程序。1)MCU初始化2)I2C數(shù)據(jù)存取3)SPI數(shù)據(jù)讀取4)加速度計初始化5)藍牙模塊啟動6)BC95模塊啟動7)485通訊模塊啟動2.2.2應(yīng)用層1)Mcu運行模式切換2)震動及傾斜3)數(shù)據(jù)解析4)開/關(guān)鎖5)數(shù)據(jù)發(fā)送6)歷史數(shù)據(jù)保存
看到版本一的架構(gòu)設(shè)計之后,說實話,我還是第一次見到這樣來寫架構(gòu)設(shè)計的,居然是以序號來寫的,這個讓別人讀起來,特別的別扭。版本二的架構(gòu)設(shè)計

看到版本二的架構(gòu)設(shè)計之后,雖然頗感欣慰,但是想到達到我們所要求的,還要很大的一段距離,該架構(gòu)設(shè)計,主要有以下幾點問題:1.對架構(gòu)的理解還不是很清晰,既然是做架構(gòu)設(shè)計,那就應(yīng)該從整體來看,而不是僅僅只是局限于一個模塊,或者功能里面。2.還是每個層次的理解也還不是很清晰,比如講MCU的初始化,歸于硬件驅(qū)動層里面。MCU的初始化,嚴(yán)格意義上來說,是屬于流程的一部分了,而不是驅(qū)動。比如電腦的開啟啟動,把這個歸于硬件的驅(qū)動里面,肯定是屬于牛頭不對馬嘴的。3.還有就是各個模塊的啟動,也是不能屬于硬件驅(qū)動層的,也都是業(yè)務(wù)流程的一部分了,都不應(yīng)該屬于驅(qū)動層的一部分。4.還有就是總線數(shù)據(jù)的讀寫,雖然驅(qū)動的作用也就是讀寫,但是數(shù)據(jù)總線的讀寫不能寫成硬件驅(qū)動。5.應(yīng)用層的系統(tǒng)參數(shù)初始化,也還是屬于流程。6.數(shù)據(jù)的解析和數(shù)據(jù)的發(fā)生,都是屬于通信功能里面的,不應(yīng)該單獨獨立出來,屬于單個的應(yīng)用。
二
更改版基本框架圖
(1)架構(gòu)設(shè)計的目的1.應(yīng)用的代碼邏輯清晰,且避免重復(fù)造輪子。2.如果沒有好的架構(gòu),移植將會是一件很痛苦的事情,因此一個好的架構(gòu)設(shè)計,方便軟件的移植。3.最大限度地復(fù)用。4.高耦合低內(nèi)聚。(2)設(shè)計思路如何把硬件的驅(qū)動和一個功能封裝成一個個的模塊,然后可以像小朋友搭積木一個,一個個模塊可以快速的拼接起來,組成一個個不同的模型。我們的嵌入式架構(gòu)思路也是來源于此,即功能模塊化設(shè)計、分層設(shè)計。這個設(shè)計和WEB開發(fā)的MVC模式類似,都是注重分層設(shè)計。模塊化設(shè)計:將收集到的需求,進行歸類,總結(jié)和分析,將這些需求概括為一個個單獨的功能,每一個功能,做成一個單獨的功能模塊。分層設(shè)計一句話不好直接表達,其主要體現(xiàn)在一下幾方面:1.功能模塊對外調(diào)用的模塊封裝成一個個API,將底層驅(qū)動做個API以供功能模塊調(diào)用。(各個功能模塊可以獨立編譯(如通信模塊純ANSI C,可在任意平臺復(fù)用),或者調(diào)用驅(qū)動層接口(日志庫模塊調(diào)用了驅(qū)動讀寫Flash),總而言之,言而總之,封裝出各個功能獨立的可復(fù)用的功能模塊。)2.API分為驅(qū)動層API和應(yīng)用層API,而不是所有程序都調(diào)用驅(qū)動層API。(整個應(yīng)用中都調(diào)用驅(qū)動層API會導(dǎo)致應(yīng)用中驅(qū)動調(diào)用隨處可見,無法移植和最大限度的復(fù)用)總體分 硬件驅(qū)動層-->功能模塊層-->業(yè)務(wù)邏輯層-->應(yīng)用層總體結(jié)構(gòu)示意框圖:

說明:1.層與層之間不能跨層調(diào)用。2.模塊與模塊各自獨立,無依賴關(guān)系。3.模塊提供統(tǒng)一的接口供上層調(diào)用,模塊的內(nèi)外接口分明。4.模塊的功能只能增,不能改。5.各個功能模塊層也還可以進行繼續(xù)分層,比如接口層、驅(qū)動層、硬件層。(3)模塊層次說明
硬件驅(qū)動層硬件驅(qū)動層包含板載硬件資源正常運行所需的所有驅(qū)動程序并提供API給功能模塊調(diào)用。
功能模塊層功能模塊層包括實現(xiàn)具體功能的函數(shù),通過調(diào)用驅(qū)動層API實現(xiàn)相應(yīng)功能,同時提供可調(diào)用的API給業(yè)務(wù)邏輯層。
業(yè)務(wù)邏輯層業(yè)務(wù)邏輯層包括產(chǎn)品整體功能的各個業(yè)務(wù)流程,通過調(diào)用功能模塊層的API實現(xiàn)。
應(yīng)用層應(yīng)用層將各個業(yè)務(wù)邏輯進行整合調(diào)用,完成整個產(chǎn)品的功能。(4)優(yōu)勢如果驅(qū)動變動了,或者換不同平臺,只需更改驅(qū)動層,應(yīng)用層不受影響。如果功能模塊變動了,只需升級相應(yīng)的功能模塊,其他的模塊不受影響,應(yīng)用層也不受影響。按照這種邏輯設(shè)計好之后,主要的工作就是在業(yè)務(wù)邏輯層。應(yīng)用層則為程序的總體流程和框架,主要調(diào)用業(yè)務(wù)邏輯層實現(xiàn)不同的功能。
-
mcu
+關(guān)注
關(guān)注
147文章
18924瀏覽量
398012 -
嵌入式
+關(guān)注
關(guān)注
5198文章
20442瀏覽量
333976 -
API
+關(guān)注
關(guān)注
2文章
2368瀏覽量
66752
原文標(biāo)題:嵌入式軟件架構(gòu)設(shè)計實際該怎么做?
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
嵌入式系統(tǒng)的軟件架構(gòu)設(shè)計!
嵌入式軟件開發(fā)中的程序架構(gòu)
為何要進行嵌入式軟件架構(gòu)設(shè)計?如何設(shè)計?
決定嵌入式系統(tǒng)軟件架構(gòu)的因素和架構(gòu)的影響
要想成為ARM嵌入式硬件高手,你得這么做!資料下載
嵌入式架構(gòu)師成長之路--架構(gòu)設(shè)計
嵌入式電腦主板應(yīng)該如何正確的安裝?
詳解FreeRTOS:嵌入式軟件系統(tǒng)架構(gòu)
嵌入式硬件和嵌入式軟件哪個好?
如何正確的設(shè)計嵌入式軟件架構(gòu)應(yīng)該這么做
評論