今回は「イベントフラグ」について説明していきたいと思います。
これは必須の機能ではありませんが、非常によく使われる機能だと思います。
「イベントフラグ」もタスク同様、ITRONの機能の一つです。
タスクの解説の際、以下のような簡単なソースコードを記載しました。
void task(intptr_t exinf) { 前処理(); while (1){ イベント待ち(); /* ☆ */ タスクの処理(); } }
ここの「☆」の部分で使用する機能です。
タスクはいわゆる「イベントドリブン型」で、何かイベントが起きるまで待機します。
そのイベント待ちに使用する機能の一つがイベントフラグです。
「一つ」を強調したのは、他にもイベント待ちをする機能があるからです。
イベントフラグは引数にビットパターンを指定し、指定したビットのすべて、またはいずれかがセットされるまで待ち状態にすることができます。
他のタスクや割り込みハンドラなどからイベントフラグをセットし、フラグがセットされるのを待っているタスクを動かすという使い方になります。
簡単な例をあげますと、キーボードのドライバに使えますね。
キーが押されたら割り込みが入り、割り込みハンドラが起動する。
割り込みハンドラからキーボードドライバのタスクへイベントフラグで通知し、タスクが押されたキーを判別してアプリケーションに通知する、といった使い方です。
他にもネットワークからのデータの送受信イベントや、周期的にデータを収集するタスクが、ある一定の決まったサイズのデータ収集が完了したら通知し、そのデータをパケット化してサーバーに送るタスクをイベントフラグで起こす、といった使い方なども考えられます。
なんとなくイメージが掴めたでしょうか?
イベントフラグはその名が示すとおり、あるイベントが発生したことを通知するだけです。
ビット(フラグ)に意味を持たせ、そのイベントが発生したことを通知します。
そのため、他のタスクや割り込みハンドラと「データ」そのものを受け渡しすることはできません。
もちろん、それをやるための他の機能もあります(そのうち解説します)。
イベントフラグはフラグのセット/リセットだけで意味が伝わるような事象に使用するのがベターかと思います。
イベントフラグ関連で主に使用するサービスコールは以下のものです。
* CRE_FLG(イベントフラグを生成する)
* set_flg/iset_flg(イベントフラグをセットする)
* clr_flg(イベントフラグをクリアする)
* wai_flg(イベントフラグがセットされるのを待つ)
* pol_flg(イベントフラグがセットされているかポーリングする)
ちなみにサービスコースの頭に「i」が付いているものは、割り込みハンドラから呼び出す場合のサービスコールです。
wai_flgは上記のソースコードの「☆」部分で使用します。
注意事項が一つあります。
CRE_FLGでイベントフラグを生成する際に、イベントフラグの属性に「TA_CLR」を指定するとwai_flgのイベント待ちから抜けてきた際にフラグが自動的に全てクリアされます。
言い換えると、この属性を指定しないとフラグがセットされたままになり、自分でclr_flgでクリアしないと次にwai_flgを呼び出したときに待ちに入らずにすぐに抜けてきてしまいます。
今回はイベントフラグの概要について説明してみました。
次回は実機を使用してイベントフラグの動作を確認したいと思います。
[…] 前回はイベントフラグについて説明しました。今回はRaspberry […]