Nucleus SEのイベントフラググループ:設定とAPI使用の入門ガイド
イベントフラググループは、シグナルに似ていますがより豊富な機能を持つ、Nucleus SEにおける軽量で柔軟なタスク間通信メカニズムを提供します。
イベントフラグの使用
Nucleus SEでは、イベントフラグはビルド時に設定されます。最大16グループまで定義可能。設定しない場合、RTOSは関連するすべてのデータ構造とAPIコードを省略します。
イベントフラググループの設定
イベントフラググループ数
設定はnuse_config.h内の#define指令で駆動されます。鍵マクロNUSE_EVENT_GROUP_NUMBERがアプリケーションで使用するグループ数を設定(デフォルト0)。16超または負値はnuse_config_check.hによるコンパイル時#errorをトリガー。
非ゼロ値を設定するとイベントフラグサブシステムが活性化:データ構造が割り当てられ、API有効化が考慮されます。
API有効化
各サービスコールにはnuse_config.hに有効化マクロがあります:
NUSE_EVENT_GROUP_SET NUSE_EVENT_GROUP_RETRIEVE NUSE_EVENT_GROUP_INFORMATION NUSE_EVENT_GROUP_COUNT
デフォルトではすべてFALSEで、対応関数を無効化。APIを使用するには目的のマクロをTRUEに設定。ミスマッチ(NUSE_EVENT_GROUP_NUMBERが0なのにAPI有効化)はコンパイルエラーを引き起こします(NUSE_Event_Group_Count()は常に利用可能)。
デフォルトnuse_config.hからの抜粋:
#define NUSE_EVENT_GROUP_NUMBER 0 /* イベントグループ数 – 0-16 */ #define NUSE_EVENT_GROUP_SET FALSE /* サービスコール有効化 */ #define NUSE_EVENT_GROUP_RETRIEVE FALSE /* サービスコール有効化 */ #define NUSE_EVENT_GROUP_INFORMATION FALSE /* サービスコール有効化 */ #define NUSE_EVENT_GROUP_COUNT FALSE /* サービスコール有効化 */
有効化されていないAPIを参照するコードがあると、リンカが実装省略によりエラーを出します。
イベントフラグサービスコール
Nucleus SEにはイベントフラグ関連の7つのサービスコールがありますが、実装されているのは4つのみ:
- NUSE_Event_Group_Set() – フラグの設定またはクリア。
- NUSE_Event_Group_Retrieve() – 現在のフラグ状態の読み取り。
- NUSE_Event_Group_Information() – グループステータスの照会。
- NUSE_Event_Group_Count() – 設定済みグループ数の取得。
- グループの作成、削除、列挙はSEでは未実装。
専用のリセット関数はありません;NUSE_Event_Group_Set()でゼロフラグマスクに対するOR演算を行うことで、グループを全ゼロにリセットできます。
設定と取得操作
イベントフラグはビットなので、バイナリ値として表現するのが最適です。Nucleus SEにはnuse_binary.hが同梱され、b01010101のようなマクロで全256通りの8ビットパターンを定義しています。
イベントフラグの設定
RTOSとSEで類似のAPIを公開。RTOSプロトタイプは:
STATUS NU_Set_Events(NU_EVENT_GROUP *group, UNSIGNED event_flags, OPTION operation);
パラメータ:
group– イベントフラグ制御ブロックへのポインタ。event_flags– 操作対象フラグのビットマスク。operation–NU_OR(設定)またはNU_AND(クリア)。
戻り値:
NU_SUCCESSNU_INVALID_GROUPNU_INVALID_OPERATION
SE版は:
STATUS NUSE_Event_Group_Set(NUSE_EVENT_GROUP group, U8 event_flags, OPTION operation);
パラメータと戻りコードはRTOS版を反映し、NUSE_SUCCESS、NUSE_INVALID_GROUP、NUSE_INVALID_OPERATION。
実装のハイライト
コアルーチンはoperationをチェックしマスクを適用:
NUSE_CS_Enter(); if (operation == NUSE_OR) { NUSE_Event_Group_Data[group] |= event_flags; } else { /* NUSE_AND */ NUSE_Event_Group_Data[group] &= event_flags; }
ブロッキング有効(NUSE_BLOCKING_ENABLE)時、全タスクをイテレーションし、このグループでサスペンドしているタスクをウェイクアップし、ブロッキングカウンタを更新。その後、優先度スケジューラがアクティブならリセケジュールが発生する可能性があります。
サスペンドタスクはフラグ状態変更時にレジュームし、待機条件を評価できるようになります。
ページ2へ >>
埋め込み
- カムロック完全解説:キャビネットを目立たず確実に施錠する仕組み
- アイボルト(アイスクリュー)とは:設計と用途のプロフェッショナルガイド
- グロメット完全ガイド:種類・用途・機器保護の仕組み
- ステンレス鋼解説:組成・製造プロセス・グローバルインパクト
- Nucleus SEのメールボックス:設定と使用の実践ガイド
- Nucleus RTOSのセマフォ:ユーティリティサービスとデータ構造
- Nucleus SEのセマフォ:概要、設定、API要点
- イベントフラググループの習得:Nucleus RTOS/SEのユーティリティサービスとデータ構造
- Nucleus SEのキュー:導入とコアサービスコール
- ArrowとFreelancer.com、電子/電気エンジニアリングサービスのグローバルマーケットプレイス「ArrowPlus」を立ち上げ
- C# 入出力の基礎:ユーザー入力と出力の基本をマスター