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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

QP之QEP原理

發布時間:2024/2/2 综合教程 30 生活家
生活随笔 收集整理的這篇文章主要介紹了 QP之QEP原理 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1.QP簡介:

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

QP包括事件處理器(QEP)、輕量級的事件驅動框架(QF)、任務調度微內核(QK)和實時跟蹤調試器(QS)四個部分。

利用QP可以開發出結構清晰的嵌入式應用程序(使用C或C++語言)。

2.QEP核心思想

QEP的核心思想就是,用一個函數指針指向當前狀態函數,使用這個函數指針有條件地執行某狀態函數,并根據執行結果執行其它的相應動作。

(1)狀態圖到C語言的轉換
狀態圖可以很容易地轉換到C語言表示,下面舉例說明(略去了構造函數和初始化函數)。

例如下面的平面狀態機FSM,圖中有兩個狀態:設置狀態setting和定時狀態timing。

可以轉換成C代碼如下
兩個狀態函數聲明:

static QState Bomb4_setting(Bomb4 *me, QEvent const *e);/*聲明設置狀態函數*/

static QState Bomb4_timing (Bomb4 *me, QEvent const *e);/*聲明計時狀態函數*/

兩個狀態函數的實現(對事件的處理):

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); /* 轉到定時狀態*/
                     }
                 }
                 return Q_IGNORED(); /*忽略事件*/
}

                 /*----6.4-狀態函數(定時狀態處理)-----.*/
QState Bomb4_timing(Bomb4 *me, QEvent const *e) {
                 switch (e->sig) {
                     case Q_ENTRY_SIG: {/*狀態進入處理*/
                       ...
                         return Q_HANDLED();
                     }
                     case UP_SIG: {/*UP_SIG事件處理---保存密碼設置*/
                       ...
                         return Q_HANDLED();
                     }
                     case DOWN_SIG: {/*DOWN_SIG事件處理---保存密碼設置*/
                      ...
                         return Q_HANDLED();
                     }
                     case ARM_SIG: {/*ARM_SIG事件處理---密碼正確則解除定時引爆,轉到設置狀態*/
                         if (me->code == me->defuse) {
                             return Q_TRAN(&Bomb4_setting);
                                                   }
                         return Q_HANDLED();
                     }
                     case TICK_SIG: {/*定時事件處理*/
                      ...
                         return Q_HANDLED();
                     }
                 }
                 return Q_IGNORED();
}

(2)狀態函數指針
在QP中用函數表示狀態,叫狀態函數,一個狀態用一個狀態函數表示,系統有多個狀態,也就可以用多個函數來表示。在QEP中定義了一個狀態函數指針QStateHandler,用這個函數指針可以指向任何一個狀態函數。在狀態函數內使用了結構清晰的switch---case語句,對不同的事件(信號)進行分類處理。

狀態函數指針定義如下:

typedef QState  (*QStateHandler)(void *me, QEvent const *e);  /*狀態函數指針,指向狀態機中任何一個狀態函數*/

其中 QState是調用狀態函數的返回值,其定義如下:

typedef uint8_t QState;/*狀態返回值,狀態機狀態處理函數返回值*/

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

(3)狀態機的當前狀態

平面狀態機FSM或層次狀態機HSM內部定義了一個QStateHandler類型的state變量,它是一個指向狀態函數的指針,state指向哪個狀態函數,哪個狀態函數就是當前狀態,有事件時,總是把事件發給當前狀態的狀態函數來處理。狀態機有多個狀態,但同一時刻,只有一個“焦點”(當前狀態),“焦點”可以用QTRAN(target)來改變。

當前狀態變量定義如下:

typedef struct QFsmTag {QStateHandler  state;  /*狀態變量,當前活動狀態,也就是經常用到的me->state */
                       } QFsm;  /*平面狀態機FSM數據結構*/

typedef struct QFsmTag QHsm;  /*層次狀態機HSM數據結構,與FSM一樣*/

狀態轉換定義如下:

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

發給狀態機的事件,總是發到當前狀態變量所指向的狀態函數來處理。

(4)事件處理器
事件處理器,也可以理解為一個狀態機引擎,當處理有事件時,調用當前狀態的狀態函數處理這個事件,并處理調用狀態函數的返回值,根據返回值進行相應的狀態變換(如轉移到父狀態)。

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

事件處理器利用狀態函數指針來調用狀態函數,總是把事件發送到當前狀態,但事件不是在當前狀態處理了,由調用的結果來判斷。

3.結論

用狀態函數指針從原理上可以調用任何狀態函數,并檢查調用結果。狀態機引擎也就成了一個事件分派執行器。QHsm_dispatch()函數是QP中最復雜的函數,是理解狀態機處理的關鍵。

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

總結

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

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。