イベントフラググループ:紹介と基本サービス
RTOSRevealedシリーズを表示する
イベントフラググループは、以前の記事で紹介されました。 Nucleus SEでは、信号に多少似ていますが、柔軟性が高くなっています。これらは、タスク間で単純なメッセージを渡すための低コストでありながら柔軟な手段を提供します。
イベントフラグの使用
Nucleus SEでは、イベントフラグはビルド時に設定されます。アプリケーションには、最大16のイベントフラググループを設定できます。イベントフラググループが設定されていない場合、イベントフラググループに関連するデータ構造やサービスコールコードはアプリケーションに含まれません。
イベントフラググループは、8つの1ビットフラグのセットであり、複数のタスクで安全に利用できるようにアクセスが制御されます。 1つのタスクで、イベントフラグの任意の組み合わせを設定またはクリアできます。別のタスクは、いつでもイベントフラググループを読み取るか、特定のフラグパターンを待機(ポーリングまたは一時停止)することができます。
イベントフラググループの設定
イベントフラググループの数
Nucleus SEのほとんどの側面と同様に、イベントフラググループの構成は主に #define によって制御されます。 nuse_config.h のステートメント 。キー設定は NUSE_EVENT_GROUP_NUMBER 、アプリケーションに設定されているイベントフラググループの数を決定します。デフォルト設定は0(つまり、イベントフラググループは使用されていません)で、16までの任意の値に設定できます。値が間違っていると、コンパイル時エラーが発生し、 nuse_config_checkのテストによって生成されます。 h (これは nuse_config.c に含まれています したがって、このモジュールでコンパイルされます)結果として #error コンパイル中のステートメント。
ゼロ以外の値を選択することは、イベントフラググループの「マスターイネーブル」です。これにより、一部のデータ構造がそれに応じて定義およびサイズ設定され、このシリーズの後半でさらに詳しく説明します。また、APIを有効にする設定をアクティブにします。
APIの有効化
Nucleus SEのすべてのAPI関数(サービス呼び出し)には、有効な #define があります。 nuse_config.h の記号 。イベントフラググループの場合、これらは次のとおりです。
NUSE_EVENT_GROUP_SET NUSE_EVENT_GROUP_RETRIEVE NUSE_EVENT_GROUP_INFORMATION NUSE_EVENT_GROUP_COUNT
デフォルトでは、これらはすべて FALSE に設定されています 、したがって、各サービスコールを無効にし、実装コードを含めることを禁止します。アプリケーションのイベントフラググループを構成するには、使用するAPI呼び出しを選択し、それらの有効化記号を TRUE に設定する必要があります。 。
これは、デフォルトの 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関数が有効で、イベントフラググループが構成されていない場合( NUSE_Event_Group_Count()を除く)、コンパイル時エラーが発生します。 これは常に許可されています)。コードで有効にされていないAPI呼び出しを使用すると、アプリケーションに実装コードが含まれていないため、リンク時間エラーが発生します。
イベントフラグサービス呼び出し
Nucleus RTOSは、イベントフラグに関連する7つのサービス呼び出しをサポートし、次の機能を提供します。
-
イベントフラグを設定します。 NUSE_Event_Group_Set()によって実装されます NucleusSEで。
-
イベントフラグを取得します。 NUSE_Event_Group_Retrieve()によって実装されます NucleusSEで。
-
指定されたイベントフラググループに関する情報を提供します。 NUSE_Event_Group_Information()によって実装されます NucleusSEで。
-
アプリケーションに(現在)構成されているイベントフラググループの数を返します。 NUSE_Event_Group_Count()によって実装されます NucleusSEで。
-
新しいイベントフラググループをアプリケーションに追加します(作成)。 NucleusSEには実装されていません。
-
アプリケーションからイベントフラググループを削除します(削除)。 NucleusSEには実装されていません。
-
アプリケーション内の(現在)すべてのイベントフラググループへのポインタを返します。 NucleusSEには実装されていません。
これらの各サービス呼び出しの実装について詳しく調べます。
(NucleusRTOSまたはNucleusSEのいずれかで)リセット機能が提供されていないことに注意してください。これは意図的なものです。リセットは、特別な状態が優勢であることを意味します。イベントフラググループの場合、唯一の「特別な」条件はすべてゼロであり、 NUSE_Event_Group_Set()で設定できます。 。
イベントフラググループセットおよび取得サービス
イベントフラググループで実行できる基本的な操作は、1つ以上のフラグを設定し、フラグの現在の状態を取得することです。 NucleusRTOSとNucleusSEはそれぞれ、これらの操作のための2つの基本的なAPI呼び出しを提供します。これについては、ここで説明します。
イベントフラグはビットであるため、2進数として視覚化するのが最適です。標準Cはバイナリ定数(8進数と16進数のみ)の表現をサポートしていないため、Nucleus SEディストリビューションには便利なヘッダーファイル nuse_binary.h が含まれています。 –これには #define が含まれます b01010101 の形式の記号 256個の8ビット値すべてに対して。
イベントフラグの設定
イベントフラグを設定するためのNucleusRTOS API呼び出しは非常に柔軟であり、 AND を使用してイベントフラグを設定およびクリアできます。 およびまたは オペレーション。 Nucleus SEは、タスクの一時停止がオプションであることを除いて、同じサービスを提供します。
Nucleus RTOSAPIによるフラグ設定の呼び出し
サービスコールプロトタイプ:
STATUS NU_Set_Events(NU_EVENT_GROUP * group、UNSIGNED event_flags、
OPTION操作);
パラメータ:
グループ –ユーザー提供のイベントフラググループ制御ブロックへのポインタ
event_flags –操作対象のフラグのパターンのビット値
操作 –実行する操作。 NU_OR の可能性があります (フラグを設定するため)または NU_AND (フラグをクリアするため)
返品:
NU_SUCCESS –通話は正常に完了しました
NU_INVALID_GROUP –イベントフラググループポインタが無効です
NU_INVALID_OPERATION –指定された操作は NU_OR ではありませんでした または NU_AND
Nucleus SEAPIによるフラグ設定の呼び出し
このAPI呼び出しは、Nucleus RTOSAPIの主要な機能をサポートしています。
サービスコールプロトタイプ:
STATUS NUSE_Event_Group_Set(NUSE_EVENT_GROUP group、
U8 event_flags、OPTION操作);
パラメータ:
グループ –フラグが設定/クリアされるイベントグループのインデックス(ID)
event_flags –操作対象のフラグのパターンのビット値
操作 –実行する操作。 NUSE_OR の可能性があります (フラグを設定するため)または NUSE_AND (フラグをクリアするため)
返品:
NUSE_SUCCESS –通話は正常に完了しました
NUSE_INVALID_GROUP –イベントフラググループインデックスが無効です
NUSE_INVALID_OPERATION –指定された操作は NUSE_OR ではありませんでした または NUSE_AND
Set EventFlagsのNucleusSE実装</ strong>
NUSE_ Event_Group_Set()の初期コード API呼び出しのブロック(タスクの一時停止)のサポートが有効になっているかどうかに関係なく、API関数(パラメーターチェック後)は一般的です。ロジックは非常に単純です:
NUSE_CS_Enter(); if(operation ==NUSE_OR){NUSE_Event_Group_Data [group] | =event_flags;} else / * NUSE_AND * / {NUSE_Event_Group_Data [group]&=event_flags;}
ビットパターン、 event_flags 、は、指定されたイベントフラググループにORまたはANDされるだけです。
残りのコードは、タスクのブロックが有効になっている場合にのみ含まれます:
#if NUSE_BLOCKING_ENABLE while(NUSE_Event_Group_Blocking_Count [group]!=0) { U8インデックス; / *ブロックされているタスクがあるかどうかを確認します* / / *このイベントグループについて* / for(index =0; index{ if((LONIB(NUSE_Task_Status [index])== NUSE_EVENT_SUSPEND) &&(HINIB(NUSE_Task_Status [index])==group)) { NUSE_Task_Blocking_Return [index] =NUSE_SUCCESS; NUSE_Task_Status [index] =NUSE_READY; 休憩; } } NUSE_Event_Group_Blocking_Count [group]-; } #if NUSE_SCHEDULER_TYPE ==NUSE_PRIORITY_SCHEDULER NUSE_Reschedule(NUSE_NO_TASK); #endif #endif NUSE_CS_Exit(); return NUSE_SUCCESS;
このイベントフラググループでタスクが中断された(取得された)場合、それらはすべて再開されます。スケジューラに応じて実行する機会がある場合、リターンの条件が満たされているかどうかを判断できます。イベントフラグの取得を参照してください。 以下。
2ページに進む>>
埋め込み