要做到嵌入式應用的代碼邏輯清晰,且避免重復的造輪子,沒有好的應用架構怎么行。
如果沒有好的架構,移植將會是一件很痛苦的事情。
如果沒有好的架構,復用是最大的難題,沒法更大限度的復用原有的代碼。
如果沒有好的架構,一旦驅動改了,所有的地方都要改,費時費力且很容易出錯。
如果沒有好的架構,應用層中穿插著硬件驅動層的代碼,看著會是一片混亂,邏輯不清,代碼維護起來會很困難。
這里總結下我的嵌入式程序設計思路,分享出來與大家共同探討,同時也歡迎提出不同意見。
現在的小朋友都愛玩搭積木的游戲,一個模塊一個模塊的拼裝起來,快速組成各種不同的模型?,F在的產品設計也很少從零開始。大都復用現有成熟的模塊,專注于某個擅長領域。
我的嵌入式應用架構思路來源與此,即功能模塊設計與分層。
把API分為驅動層和應用層API,而不是所有程序都調用驅動層API。(整個應用中都調用驅動層API會導致應用中驅動調用隨處可見,無法移植和最大限度的復用)
先把一個應用進行功能模塊劃分,并對整體結構進行分層,然后設計出功能獨立的各個模塊(如算法模塊,文件庫模塊,通信庫模塊),在模塊之上開放公共接口。
驅動層提供出公共接口供上層調用。各個功能模塊可以獨立編譯(如算法模塊純ANSI C,可在任意平臺復用),或者調用驅動層接口(文件庫模塊調用了驅動讀寫Flash),總而言之,言而總之,封裝出各個功能獨立的可復用的功能模塊。
總體分:硬件驅動層-->功能模塊層-->應用接口層-->業務邏輯層-->應用層
總體結構示意框圖:
應用層,為程序的總體的運行框架,組織調用業務邏輯??梢杂媚撤N嵌入式操作系統實現幾種任務 。如定時任務,卡處理任務,菜單任務,通信任務。
業務邏輯層,如CPU卡處理,交通部卡處理,銀聯卡處理,M1卡處理,通信記錄上傳,黑名單下載,票價參數下載等。
應用接口層,提供公共的api接口供應用接口供上層調用。這些接口也可由下層的功能模塊開放出來,應用接口層負責匯總。
功能模塊層,可以封裝不同的功能模塊。如算法庫,文件庫,通信庫,銀聯庫,向上提供應用接口層的接口,向下調用驅動接口。
硬件驅動層,由各個驅動模塊組成,向上提供統一的接口。
遵循一些約定:
1.每個模塊提供出的接口要統一,后續只能增,不能改原來的接口。
2.模塊與模塊之間相互獨立,互不影響,不能相互調用,只能調用它下層的接口。
3.由模塊構成層,層與層之間不能跨級調用。如在應用層中不能看到直接調用驅動層的代碼。
4.模塊中又可以繼續分層,如接口層,驅動層,硬件層。
如果驅動變動了,或者換不同平臺,只需更改驅動層,應用層不受影響。如果功能模塊變動了,只需升級功能功能模塊,其他的模塊不受影響,應用層也不受影響。
按照這種邏輯設計好之后,主要的工作就是在業務邏輯層。應用層則為程序的總體流程和框架,主要調用業務邏輯層實現不同的功能。
我們現在的代碼結構,基本是按這個思路來的。
硬件驅動層-->功能模塊層-->應用接口層-->業務邏輯層-->應用層。
看看以下兩種風格的代碼,你更喜歡哪個。
另一種風格:
同樣是保存參數,非要拆成AlgCRC16 ,WritePraFlash( (unsigned char *)&NetPra , NETPRA_ADDR , sizeof(_NetPra) )兩步嗎?
還有AH_Para_Verify這個,在應用層中真是多余啊,檢測失敗又從Flash讀取。關于參數,一開機就應該檢測合法性了。
既然都是要保存參數,就應該做個封裝,如上圖所示,把系統用到的不同參數做個規劃。應用層調用APP_Open_UseFile 或者APP_Read_UseFile,
而不是直接的去讀寫Flash。
來看看赫赫有名的谷歌的android架構,雖然很復雜,但從框圖上看,也像是搭積木,各個功能模塊獨立,層次分明。最低層建立在linux Kernel基礎上,然后是各個組件庫libraries,再往上是應用框架和應用。
以NC_FileLib,文件庫模塊為例,如果要用在其他平臺,如EH0918手持機設備,只需要移植幾個硬件層接口即可。
-
嵌入式
+關注
關注
5089文章
19169瀏覽量
306769 -
接口
+關注
關注
33文章
8684瀏覽量
151632
原文標題:嵌入式應用軟件架構如何設計?
文章出處:【微信號:gh_c472c2199c88,微信公眾號:嵌入式微處理器】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論