日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

QP之QEP原理

發(fā)布時間:2024/4/17 编程问答 48 豆豆
生活随笔 收集整理的這篇文章主要介紹了 QP之QEP原理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

1.QP簡介:

量子平臺(Quantum Platform, 簡稱QP)是一個用于實(shí)時嵌入式系統(tǒng)的軟件框架,QP是輕量級的、開源的、基于層次式狀態(tài)機(jī)的、事件驅(qū)動的平臺。

QP包括事件處理器(QEP)、輕量級的事件驅(qū)動框架(QF)、任務(wù)調(diào)度微內(nèi)核(QK)和實(shí)時跟蹤調(diào)試器(QS)四個部分。

利用QP可以開發(fā)出結(jié)構(gòu)清晰的嵌入式應(yīng)用程序(使用C或C++語言)。

2.QEP核心思想

QEP的核心思想就是,用一個函數(shù)指針指向當(dāng)前狀態(tài)函數(shù),使用這個函數(shù)指針有條件地執(zhí)行某狀態(tài)函數(shù),并根據(jù)執(zhí)行結(jié)果執(zhí)行其它的相應(yīng)動作。

(1)狀態(tài)圖到C語言的轉(zhuǎn)換
狀態(tài)圖可以很容易地轉(zhuǎn)換到C語言表示,下面舉例說明(略去了構(gòu)造函數(shù)和初始化函數(shù))。

例如下面的平面狀態(tài)機(jī)FSM,圖中有兩個狀態(tài):設(shè)置狀態(tài)setting和定時狀態(tài)timing。

可以轉(zhuǎn)換成C代碼如下
兩個狀態(tài)函數(shù)聲明:

static QState Bomb4_setting(Bomb4 *me, QEvent const *e);/*聲明設(shè)置狀態(tài)函數(shù)*/static QState Bomb4_timing (Bomb4 *me, QEvent const *e);/*聲明計(jì)時狀態(tài)函數(shù)*/

兩個狀態(tài)函數(shù)的實(shí)現(xiàn)(對事件的處理):

QState Bomb4_setting(Bomb4 *me, QEvent const *e) {switch (e->sig) {case UP_SIG: {/*UP_SIG事件處理---增加定時處理*/...return Q_HANDLED();}case DOWN_SIG: {/*DOWN_SIG事件處理---減少定時事件處理*/...return Q_HANDLED();}case ARM_SIG: {/*ARM_SIG事件處理---定時事件處理*/return Q_TRAN(&Bomb4_timing); /* 轉(zhuǎn)到定時狀態(tài)*/}}return Q_IGNORED(); /*忽略事件*/ }/*----6.4-狀態(tài)函數(shù)(定時狀態(tài)處理)-----.*/ QState Bomb4_timing(Bomb4 *me, QEvent const *e) {switch (e->sig) {case Q_ENTRY_SIG: {/*狀態(tài)進(jìn)入處理*/...return Q_HANDLED();}case UP_SIG: {/*UP_SIG事件處理---保存密碼設(shè)置*/...return Q_HANDLED();}case DOWN_SIG: {/*DOWN_SIG事件處理---保存密碼設(shè)置*/...return Q_HANDLED();}case ARM_SIG: {/*ARM_SIG事件處理---密碼正確則解除定時引爆,轉(zhuǎn)到設(shè)置狀態(tài)*/if (me->code == me->defuse) {return Q_TRAN(&Bomb4_setting);}return Q_HANDLED();}case TICK_SIG: {/*定時事件處理*/...return Q_HANDLED();}}return Q_IGNORED(); }

(2)狀態(tài)函數(shù)指針
在QP中用函數(shù)表示狀態(tài),叫狀態(tài)函數(shù),一個狀態(tài)用一個狀態(tài)函數(shù)表示,系統(tǒng)有多個狀態(tài),也就可以用多個函數(shù)來表示。在QEP中定義了一個狀態(tài)函數(shù)指針QStateHandler,用這個函數(shù)指針可以指向任何一個狀態(tài)函數(shù)。在狀態(tài)函數(shù)內(nèi)使用了結(jié)構(gòu)清晰的switch---case語句,對不同的事件(信號)進(jìn)行分類處理。

狀態(tài)函數(shù)指針定義如下:

typedef QState (*QStateHandler)(void *me, QEvent const *e); /*狀態(tài)函數(shù)指針,指向狀態(tài)機(jī)中任何一個狀態(tài)函數(shù)*/

其中 QState是調(diào)用狀態(tài)函數(shù)的返回值,其定義如下:

typedef uint8_t QState;/*狀態(tài)返回值,狀態(tài)機(jī)狀態(tài)處理函數(shù)返回值*/

有四種返回值:0---QRETHANDLED,表示事件被處理了,但沒有轉(zhuǎn)換,叫內(nèi)部轉(zhuǎn)換; 1---QRETIGNORED, 表示事件被忽略,沒有處理; 2---QRETTRAN,表示事件被處理了,并有轉(zhuǎn)換,轉(zhuǎn)換到其它狀態(tài); 3---QRETSUPER,表示進(jìn)入父狀態(tài)了,只用于層次狀態(tài)機(jī)HSM中。

(3)狀態(tài)機(jī)的當(dāng)前狀態(tài)

平面狀態(tài)機(jī)FSM或?qū)哟螤顟B(tài)機(jī)HSM內(nèi)部定義了一個QStateHandler類型的state變量,它是一個指向狀態(tài)函數(shù)的指針,state指向哪個狀態(tài)函數(shù),哪個狀態(tài)函數(shù)就是當(dāng)前狀態(tài),有事件時,總是把事件發(fā)給當(dāng)前狀態(tài)的狀態(tài)函數(shù)來處理。狀態(tài)機(jī)有多個狀態(tài),但同一時刻,只有一個“焦點(diǎn)”(當(dāng)前狀態(tài)),“焦點(diǎn)”可以用QTRAN(target)來改變。

當(dāng)前狀態(tài)變量定義如下:

typedef struct QFsmTag {QStateHandler state; /*狀態(tài)變量,當(dāng)前活動狀態(tài),也就是經(jīng)常用到的me->state */} QFsm; /*平面狀態(tài)機(jī)FSM數(shù)據(jù)結(jié)構(gòu)*/typedef struct QFsmTag QHsm; /*層次狀態(tài)機(jī)HSM數(shù)據(jù)結(jié)構(gòu),與FSM一樣*/

狀態(tài)轉(zhuǎn)換定義如下:

#define Q_TRAN(target_)(((QFsm *)me)->state = (QStateHandler)(target_), Q_RET_TRAN)

發(fā)給狀態(tài)機(jī)的事件,總是發(fā)到當(dāng)前狀態(tài)變量所指向的狀態(tài)函數(shù)來處理。

(4)事件處理器
事件處理器,也可以理解為一個狀態(tài)機(jī)引擎,當(dāng)處理有事件時,調(diào)用當(dāng)前狀態(tài)的狀態(tài)函數(shù)處理這個事件,并處理調(diào)用狀態(tài)函數(shù)的返回值,根據(jù)返回值進(jìn)行相應(yīng)的狀態(tài)變換(如轉(zhuǎn)移到父狀態(tài))。

同時狀態(tài)引擎也處理狀態(tài)的進(jìn)入(ENTER)、退出(EXIT),并處理初始偽狀態(tài)。

事件處理器利用狀態(tài)函數(shù)指針來調(diào)用狀態(tài)函數(shù),總是把事件發(fā)送到當(dāng)前狀態(tài),但事件不是在當(dāng)前狀態(tài)處理了,由調(diào)用的結(jié)果來判斷。

3.結(jié)論

用狀態(tài)函數(shù)指針從原理上可以調(diào)用任何狀態(tài)函數(shù),并檢查調(diào)用結(jié)果。狀態(tài)機(jī)引擎也就成了一個事件分派執(zhí)行器。QHsm_dispatch()函數(shù)是QP中最復(fù)雜的函數(shù),是理解狀態(tài)機(jī)處理的關(guān)鍵。

參考:
【1】QP量子平臺、量子編程:http://www.state-machine.com

轉(zhuǎn)載于:https://www.cnblogs.com/hyper99/p/QP-zhiQEP-yuan-li.html

總結(jié)

以上是生活随笔為你收集整理的QP之QEP原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。