開篇我們來一起侃侃曾用過的那些程序構架,其實搞單片機軟件的真沒啥構架可聊的,這是為啥,其實很多老工程師再和同事聊工作的時候也經常會說正在研究程序的構架,其實大部分程序都是順序構架,那有什么好了解的呢,其實這里用構架不太確切,與其說是構架不如說是代碼風格,這個的確是因人而異,五花八門的什么樣的都有,例如有一些比較特殊的,N個.h文件對應一個main.c,其實他在把.h當.c用,把變量函數和函數的定義都扔到.h文件中,雖然這么做不符合我們的常規套路,但是并不影響程序的正確性。如下圖:
還有那種全代碼就一個函數指針,不停地給函數指針賦值,然后調用該函數,這個說實話真的是把函數指針用的出神入化了,這種方式的應用其實應該是中有限狀態機理論的毒太深,曾經我也中過,這種代碼風格只是我們自己用自己的方式實現一種控制思想 ,沒接觸過這種風格的代碼上來可能會有點蒙圈,當然熟悉代碼也需要一定的時間。
好一點的風格就是模塊化編程,基本一個.h文件對應一個.c文件,然后提供一個接口文件,這種風格看起來更加的好理解一些,也比較符合常規的套路,如下圖:
但是不論上面的哪一種方法其實最初的目的只是想跳出這個籠子。哪怕初心是拼盡全力想要擺脫那種意大利面條式的編程方式,不想用N層if/else嵌套實現狀態模式控制,最終還是回到了順序式編程的框架,問題的根本在于我們靠一己之力,無法完成系統層部分,因為一個好的框架需要管理我們的代碼,其核心的實現涉及到數據結構,算法等等一系列吃基礎的東西,從零打造一個構架也不是我們的目的,我們的目的只是想要我們的代碼跳出這個框框。
下面開始介紹我們的豬腳:基于事件驅動型程序構架,這里我們先舉個例子,這個構架都應用在哪些領域,桌面應用程序開發,手機APP開發,Linux驅動應用開發,基本上那些我們或許有點接觸的不屬于我們這領域的項目,都是基于這種程序構架進行開發。
事件驅動型程序構架的核心:事件,只要舉個例子你就理解了,PC機按下鍵盤、點擊鼠標 都會產生一個事件,在我們的單片機中當你加入RTOS以后,最重要的一個東西叫做系統心跳(systemtick),這個在系統中被稱為一個系統事件,總結一下,有系統的地方就有事件,總結一下:系統的構架也是采用基于事件驅動型程序構架來設計的,雖然我們在單片機上移植了系統,也可以在應用開發中使用事件進行設計,但是我們的應用程序還不能算是一個具備是驅動型程序構架的軟件。
要打造一個事件驅動型構架我們都需要那些組成部分呢(這里也可以稱為組件):事件、事件處理器(層次性)、對象(應用程序中的基本要素),系統框架(實現對象機制的必備部分)等等,例如QP提供的構架,如下:
如果大家對事件驅動型編程比較感興趣,推薦大家可以學一下quantunleaps(量子編程)它提供了一個平臺供大家學習,百度輸入一下名稱官方網站就出來了,后面會基于QP來分享一下核心的內容,和大家一起學習。