1.QPプロフィール:
量子プラットフォーム(QPと称する量子プラットフォーム)リアルタイム組込みシステムのためのソフトウェア・フレームワークであり、QPは、階層ステートマシン、イベント駆動型プラットフォームに基づいて、軽量、オープンソースです。
QPは、イベントハンドラ(QEP)、四つの部分の軽量イベント駆動型フレームワーク(QF)、タスクスケジューリングマイクロカーネル(QK)とリアルタイムトレースデバッガ(QS)が含まれています。
QPは(CまたはC ++言語を使用して)明確な構造組み込みアプリケーションを開発するために使用できます。
2.QEPの核となるアイデア
QEPコアアイデアは機能の現在の状態に関数ポインタを使用することで、関数ポインタは、条件付き状態関数を実行し、実行結果に応じて他の適切なアクションを実行するために使用されます。
図C言語変換の状態(1)
状態マップが容易に(省略コンストラクタと初期化機能)以下に例示、C言語表現に変換することができます。
状態設定とタイミング設定状態のタイミングたとえば、次のプレーナ状態機械FSMは、図は、2つの状態を有します。
これは、次のCコードに変換することができます
2つのステータス関数の宣言:
static QState Bomb4_setting(Bomb4 *me, QEvent const *e);/*声明设置状态函数*/ static QState Bomb4_timing (Bomb4 *me, QEvent const *e);/*声明计时状态函数*/
実現の2つの状態関数(事件の取り扱い):
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関数ポインタの状態を定義し、関数ポインタは、状態関数のいずれかを使用することを指すことができます。異なる事象(信号)分類処理のために、状態関数内で明確な構造のスイッチ---ケースステートメントを使用。
次のようにポインタの状態関数が定義されています。
typedef QState (*QStateHandler)(void *me, QEvent const *e); /*状态函数指针,指向状态机中任何一个状态函数*/
前記QState次のように定義された状態関数の戻り値を呼び出します:
typedef uint8_t QState;/*状态返回值,状态机状态处理函数返回值*/
4つの戻り値があります:0 --- Q RETは HANDLED、イベントが処理されましたが、変換しない、内部変換と呼ばれることを示し、1 --- Q RETは無視され、何の契約、イベントは無視されていることを示していない。2 --- Q RET TRANは、イベントが処理されたことを示し、変換、他の州への変換; Qは--- 3。RET SUPER、親状態に入ること、そして唯一の階層ステートマシンHSMに。
現在のステータス(3)状態マシン
面または内部状態機械FSM階層状態機械HSM QStateHandlerは、状態関数の現在の状態であり、状態の機能、状態、機能状態点、イベントがある場合、常にイベントが発生へのポインタである状態変数のタイプを定義しますプロセスの状態への現在の状態の関数。ステートマシンは、複数の状態を有しているが、同時に、唯一の「フォーカス」(現在の状態)、「フォーカス」QできTRAN(ターゲット)が変更されます。
次のように現在の状態変数が定義されています。
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