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