1.QPプロフィール:
量子プラットフォーム(QPと称する量子プラットフォーム)リアルタイム組込みシステムのためのソフトウェア・フレームワークであり、QPは、階層ステートマシン、イベント駆動型プラットフォームに基づいて、軽量、オープンソースです。
QPは、イベントハンドラ(QEP)、四つの部分の軽量イベント駆動型フレームワーク(QF)、タスクスケジューリングマイクロカーネル(QK)とリアルタイムトレースデバッガ(QS)が含まれています。
QPは(CまたはC ++言語を使用して)明確な構造組み込みアプリケーションを開発するために使用できます。
図1.QP全体構造
QFプロフィールの2.QP
QFはQPとQFのコアは、ソフトウェアバス(ソフトウェアバス、Sバス)として理解することが可能です。これに関連してソフトウェアバスAOとハードウェア割り込みサービスルーチンISRの多くは、イベントの保管、流通、回収、その他の機能を担うQFは、イベント駆動型です。
QFは、イベント駆動型フレームワークです。アプリケーション、イベントのインスタンスを作成し、プール内のイベントを入れて、適切にイベントを配布することができ、アクティブオブジェクト(ステートマシン、タスク)のイベントを登録AOインチ アプリケーションは、イベントが発生した場合、QFはAOにイベントを配布する、特定のイベントを登録することができます。アプリケーションが複数のAOから構成され、各AOは、タスクと考えることができます。ハードウェア割り込みプログラムは、AOと見ますが、優先度が比較的高いです。
データ構造類似UCOS-II構造を使用して5つのデータ構造及び動作、によってQF QF。
図2. QFの全体的な構造の改善
3.QF配布イベント
図1に示すように、QFは、ソフトウェアバスであり、ソフトウェアバス上AO ISRに接続されています。QFは、5つの主要なデータ構造(深くUCOS IIカーネルを見て、影響を受けUCOS II)が含まれています。
イベントを配布する方法は2つあります。
(1)直接配信イベント
別のAOに直接配布さAOイベントaは、イベントの直接配信です。ターゲットAOを知るために、このイベントを配布するAOの方法。
使用void QActive_postFIFO(QActive *me, QEvent const *e)
イベントを配布する機能を。
(2)P / S配布イベント
P / S(パブリッシュパブリッシュ・サブスクライブ - サブスクライブ)するために、QFを使用してAO、サブスクリプション・イベント表は、配布するイベントを、P / Sは、イベントを掲載しました。このように、どこのイベントを配布するには知っているだろうQFは、AO、サブスクリプション・イベント表を見つけ、ターゲット配信イベントAO AOを知りません。P / SはAOの間の結合を減少させる方法を提供しました。
使用void QF_publish(QEvent const *e)
函数分发事件。
图3.QF软件总线和两种投递事件方式
框架QF包括活动对象AO,每个AO包含一个AO队列(QEQueue)和状态机。QF中还有5个主要的数据结构表,其中有3个AO相关的数据结构:AO订阅事件表,AO队列状态表,AO注册表;有1个事件池QMPool,用于保存事件实例,其它事件都是对这个事件实例的引用;有1个时间事件链表QtimeEvt,用于定时事件处理。图 2是相应数据表与QF和AO的关系。
图4.QF框架及五个数据表
4.QF运行
QF运行时,包括的过程有:
(1)QF初始化;
(2)AO和ISR产生事件;
(3)分发事件到AO队列;
(4)循环调度分派事件到状态机。
在把事件放到AO队列中时,会置位AO队列状态表相应位;从AO队列中取出事件时,会清零AO队列状态表相应位。总之,放事件到AO队列或从AO队列取事件,都会修改AO队列状态表。
图5.QF运行过程及数据表关系
(1)QF初始化
在QF运行之前,首先要进行初始化,要创建AO、创建事件池、创建AO订阅事件表,创建AO队列等一系统开始工作。
图6.QF初始化
(2)AO和ISR产生事件
在AO或ISR中,用Q_NEW()
宏可以创建用户事件实例,并放到事件池中。
如用 UserEvt *pe = Q_NEW(UserEvt , UserSig1)
创建了一个用户事件pe。可以分发这个用户事件pe到AO队列中。
其中,UserEvt是增加了参数的用户自定义事件,它是继承自QEvent,UserEvt定义如下,
typedef struct UserEvtTag {
QEvent
super; / 继承自QEvent /
uint8_t parameter;/增加的事件参数 /
} UserEvt;
UserSig1是用户定义的信号,用枚举来定义,定义如下,
enum UserSignals {
User1SIG = QUSER_SIG,/ 用户定义第一个信号 /
User2_SIG, / 第二个信号 /
User3_SIG, / 第三个信号 /
...
/ 其它信号 /
};
(3)分发事件到AO队列
可以用QActive_postFIFO(TargetAO, (QEvent *)pe)
直接分发事件或用QF_publish((QEvent *)pe)
间接分发事件到目标AO队列中。使用直接分发事件方式时,不需要AO订阅事件表QF_subscrList的参与,而间接分发事件时要用到AO订阅事件表。
这两种分发事件都会修改AO队列状态表QF_readySet_
(QK中,用QK_readySet),置位相应位,而在Vanilla调度或QK调度会清除AO队列状态表相应位。
ステートマシン〜(4)の環状スケジュールディスパッチイベント
-超ロビンスケジューリングバニラ実施形態のための2つのスケジューリング方法は、このタスクは、非プリエンプティブモードである
-他の方法QKスケジューリングモード、スピナーがQKありますコア、この方法でタスクがプリエンプティブです。
2つのスケジューリング方法のプロセス:
図スケジューリングプロセス7.Vanilla
図スケジューリングプロセス8.QK
5.まとめ
QFを生成イベント、保存、配信イベントのためのフレームワークです。イベントとサポートスケジューリングタスクの2つの方法で配布するには、2つの方法がありますが、QFはAOとISRの多くを搭載されるソフトウェアバスとして理解することができます。これは、63 AO + ISRをサポートすることができます。
参考:
[1] QPの量子インターネット、量子プログラミング:http://www.state-machine.com