必修:VSF的事件驅(qū)動(dòng)

設(shè)計(jì)上,VSF的底層核心是一個(gè)參照UML設(shè)計(jì)的狀態(tài)機(jī)構(gòu)架。不過,我這里先不準(zhǔn)備講狀態(tài)機(jī),因?yàn)閂SF里的狀態(tài)機(jī)構(gòu)架從來都沒有被用到過,哪怕一次。實(shí)質(zhì)上,VSF底層的核心是事件驅(qū)動(dòng)。

事件驅(qū)動(dòng)應(yīng)該有不少人了解,說白了,就是由事件來驅(qū)動(dòng)程序的運(yùn)行。在VSF里,可以總結(jié)為:有事件處理,沒事件休眠。系統(tǒng)的關(guān)鍵在于處理好3種實(shí)時(shí)性任務(wù)--硬實(shí)時(shí)、軟實(shí)時(shí)、非實(shí)時(shí)。事件驅(qū)動(dòng)系統(tǒng)也同樣需要處理好這3種任務(wù)。下面就以VSF的搶占式構(gòu)架來說明一下。

VSF系統(tǒng)的搶占式構(gòu)架的流程圖如下(支持硬實(shí)時(shí)、軟實(shí)時(shí)和非實(shí)時(shí)):


vsfpre.png

針對(duì)3種實(shí)時(shí)性任務(wù):
main里的運(yùn)行的是非實(shí)時(shí)隊(duì)列。main函數(shù)里會(huì)初始化所有任務(wù),然后進(jìn)入while循環(huán)。while循環(huán)里,判斷main隊(duì)列中是否有事件等待,有的話就一一取出并分發(fā)給對(duì)應(yīng)任務(wù)處理,沒有的話就休眠。
PendSV里運(yùn)行的是軟實(shí)時(shí)隊(duì)列(可以搶占main中的非實(shí)時(shí)隊(duì)列),只是讀出PendSV隊(duì)列中的事件,并一一分發(fā)給對(duì)應(yīng)任務(wù)處理。
然后就是系統(tǒng)各種中斷,直接處理實(shí)時(shí)性代碼,并且發(fā)送事件到對(duì)應(yīng)的隊(duì)列。根據(jù)應(yīng)用需求,這里可以發(fā)給軟實(shí)時(shí)隊(duì)列(PendSV隊(duì)列,發(fā)送事件后,還會(huì)自動(dòng)使能PendSV),也可以發(fā)給非實(shí)時(shí)隊(duì)列(main隊(duì)列)。

所以,VSF中的任務(wù)優(yōu)先級(jí)實(shí)質(zhì)是事件隊(duì)列的優(yōu)先級(jí),VSF中的搶占只是MCU本身中斷的搶占。典型構(gòu)架中使用了非實(shí)時(shí)隊(duì)列(main隊(duì)列)和軟實(shí)時(shí)隊(duì)列(PendSV隊(duì)列),而實(shí)際應(yīng)用中,還可以用其他一個(gè)或者多個(gè)中斷實(shí)現(xiàn)出額外優(yōu)先級(jí)的事件隊(duì)列。

為了節(jié)省資源,VSF還可以被配置為協(xié)作式構(gòu)架,流程圖如下:


vsfco.png

協(xié)作式構(gòu)架中,沒有非實(shí)時(shí)隊(duì)列和軟實(shí)時(shí)隊(duì)列,中斷產(chǎn)生的事件是直接調(diào)用任務(wù)的evt_handler(事件處理函數(shù))處理了,并且所有中斷不互相搶占。協(xié)作式構(gòu)架是目前VSF最常用的構(gòu)架,因?yàn)槭琴Y源占用最小的方式。

那么關(guān)于VSF中的任務(wù)的話,底層都只是一個(gè)evt_handler(事件處理函數(shù)),用于處理各個(gè)事件。當(dāng)然,VSF的任務(wù)高層有更加簡(jiǎn)單的實(shí)現(xiàn)方式,這些以后會(huì)一一說明。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容