《時間觸發(fā)嵌入式系統(tǒng)設計模式》- 模塊化程序編寫
為什么要使用模塊化程序設計?
大家可能在在學習嵌入式過程中經(jīng)常會碰到動輒就是在一個文件里面實現(xiàn)一個功能幾百上千行代碼,然后花了大量的時間去理清代碼設計的思路,當分析清楚后,發(fā)現(xiàn)原來這個程序其實可以寫的更好理解,我在工作中碰到過很多類似的工程師大牛,都是十幾年行業(yè)經(jīng)驗,不可否認有些確實寫的很優(yōu)秀,但是寫的代碼跳來跳去,需要你花費大量的時間來閱讀,我們技術(shù)工程師的時間很寶貴,行業(yè)競爭也很激烈,如何用高效易于溝通的程序框架寫程序那就顯得尤為重要,騰出來的時間完全可以學習更多有意義的東西,同時也能得到同事老板的認可??!為這一步加油?
我們先來看下常用的嵌入式控制系統(tǒng)基本框架和兩個用的非常廣泛的控制器的拆解圖片



? ? ? 我們看了上面的嵌入式系統(tǒng)基本框架,結(jié)合我們平常學習51單片機了解到的知識,單片機本身需要處理的基本就是一些輸入量(數(shù)字輸入和模擬輸入)、輸出量(顯示器,數(shù)字輸出和模擬輸出)以及通信。
比如我們用按鍵控制LED燈亮滅:我們檢測按鍵的輸入狀態(tài),然后根據(jù)應用程序邏輯來改變LED燈的輸出狀態(tài)。

再比如我們的洗衣機:洗衣機面板上有按鍵輸入量、門限位開關(guān)量、離散輸出電機正反轉(zhuǎn)控制、進水電磁閥控制、排水牽引電機控制、LED顯示狀態(tài)、數(shù)碼管顯示當前洗滌剩余時間。

總結(jié)起來就是:這些輸入輸出量可以做成標準化模塊,而我們的應用程序則根據(jù)我們具體的需求去實現(xiàn)相應的邏輯,這樣我們每次就可以把這些標準模塊組裝起來然后直接開始我們的應用程序,像搭樂高積木一樣。

模塊化程序變形記
我們先來看這個按鍵控制LED燈狀態(tài)翻轉(zhuǎn)單個源文件程序

代碼部分:

程序進行拆分

接下來我們來將這個程序進行拆分,拆成模塊化的程序,我們將其拆成3個模塊,分別是LED模塊,按鍵模塊,和主函數(shù)模塊;包涵的文件分別是:LED.c, LED.h ? ? KEY.c, KEY.h, ? ? ? main.c, main.h
第一步:我們把文件先準備好

第二步: 然后我們來對這些文件添加到工程當中

第三步: 我們先來對main.h文件進行改造
編譯,下載進去,OK沒有問題


我這里給大家講講頭文件包涵的內(nèi)容,以及主要用來干什么
我們一般會在頭文件中看到如下頭文件代碼樣式 ,這個主要是用來防止一個源文件多次包含同一個頭文件
1、頭文件中主要放置源文件中可能用到的其它頭文件包含,比如說我們這里用到了#include<stc12c5a60s2.h> ? #include<intrins.h>兩個頭文件。
2、頭文件中會放置這種類型定義以及宏定義也是可以的,主要是在源文件中會多次使用到的宏定義和類型定義,我們暫時只了解這么多,后面我們碰到新的情況,再補充。
3、函數(shù)原型定義
我們的.c文件里面則主要放置函數(shù)的具體實現(xiàn),以及用到的一些變量或數(shù)組,我們同樣等后面遇到再具體講一講

有了上面的基礎(chǔ)我們繼續(xù)對其它的兩個文件進行模塊化改造
首先來改造KEY.c和KEY.h
KEY.c源文件代碼
KEY.h頭文件代碼:
main.c文件代碼:
main.h文件代碼:
編譯下載進去,OK,沒有問題


細心的朋友應該有發(fā)現(xiàn),我們又往頭文件中加入了新的東西sbit KEY = P0^2;引腳定義,我們后面使用多少個輸入端口都可以在這里定義,這樣可以做到跟其他模塊無關(guān),應用程序中只需要調(diào)用函數(shù)即可。
? ? ?在main.h文件中放置其他源文件模塊都需要用到的類型定義,公共頭文件以及一些公共函數(shù)等;其他模塊頭文件中則主要包含跟模塊相關(guān)的一些定義和函數(shù)原型,比如說按鍵模塊頭文件中則放置了按鍵引腳定義,按鍵初始化函數(shù)、按鍵掃描函數(shù)以及按鍵的一些宏變量;我們拆分模塊的一些基本原則是在以后的定義修改中不能牽一發(fā)動全身,就跟我們以前學C語言講的高內(nèi)斂、低耦合一樣,就是模塊內(nèi)部的所有東西盡量保持相對獨立,確保可移植,不能說這改個參數(shù),其它所有的模塊都要改一遍,那是完全違背我們拆解模塊的一個初衷

后記:
? ? ? 看到這里大家可能覺得這不是脫褲子放屁,多此一舉么,就為了實現(xiàn)這么個破玩意,寫這么多東西??!如果只是為了實現(xiàn)一個簡單的按鍵控制LED燈亮滅,那做這么多事情當然是不值的,這里主要是提供一種新的程序設計方式,為寫大型的、復雜的程序做準備,相信很多朋友看過STM32的程序,那玩意工程一上來就是幾十個xx.c,xx.h文件,很多人沒有基礎(chǔ)直接去看,感覺很費勁,但是看的懂的人又覺得那玩意寫的非常好,寫的非常優(yōu)秀。
? ? ?另外,大家看到我還有個LED.c,LED.h文件還沒往里面填內(nèi)容,大家可以自行補充下,有疑問可以在評論區(qū)提出來,也可以去網(wǎng)上尋找答案,看《嵌入式系統(tǒng)構(gòu)件》這本書也是一個不錯的選擇。
? ? ?這種模塊化程序程序設計無論是在arduino, STM32,還是windows應用程序開發(fā)中都應用非常廣泛,大家要熟練掌握,勤動手,多思考。