信号
このRTOSRevealedでは、NucleusSEでサポートされているタスク間通信の最も簡単な方法である信号について説明します。これらは、タスク間で単純なメッセージを渡すための非常に低コストの手段を提供します。
シグナルの使用
シグナルは、自律的ではないという点で他のすべてのタイプのカーネルオブジェクトとは異なります。シグナルはタスクに関連付けられており、独立した存在はありません。シグナルがアプリケーション用に構成されている場合、各タスクには8つのシグナルフラグのセットがあります。
どのタスクでも、別のタスクのシグナルを設定できます。所有者タスクのみがシグナルを読み取ることができます。読み取りは破壊的です。つまり、信号は読み取りプロセスによってクリアされます。他のタスクは、タスクのシグナルを読み取ったりクリアしたりできません。
Nucleus RTOSには、別のタスクが1つ以上の信号フラグを設定したときに実行される関数をタスクが指定できるようにする機能があります。これは、割り込みサービスルーチンにいくぶん似ています。この機能はNucleusSEではサポートされていません。タスクは信号旗を明示的に調べる必要があります。
シグナルの構成
Nucleus SEのほとんどの側面と同様に、信号の構成は主に #define によって制御されます。 nuse_config.h のステートメント 。キー設定は NUSE_SIGNAL_SUPPORT です 、これにより、機能が有効になります(アプリケーション内のすべてのタスクに対して)。シグナルの数を指定することに疑問の余地はありません。アプリケーションのタスクごとに8つのフラグのセットがあります。
このイネーブルパラメータの設定は、信号の「マスターイネーブル」です。これにより、データ構造がそれに応じて定義およびサイズ設定されます。これについては、この記事の後半で詳しく説明します。また、APIを有効にする設定をアクティブにします。
APIの有効化
Nucleus SEのすべてのAPI関数(サービス呼び出し)には、有効な #define があります。 nuse_config.h の記号 。信号の場合、これらは次のとおりです。
NUSE_SIGNALS_SENDNUSE_SIGNALS_RECEIVE
デフォルトでは、これらは両方とも FALSE に設定されています 、したがって、各サービスコールを無効にし、実装コードを含めることを禁止します。アプリケーションのシグナルを構成するには、使用するAPI呼び出しを選択し、それらの有効化記号を TRUE に設定する必要があります。 。
これは、デフォルトの nuse_config.h からの抜粋です。 ファイル:
#define NUSE_SIGNAL_SUPPORT FALSE / *シグナルのサポートを有効にします* /#define NUSE_SIGNALS_SEND FALSE / *サービスコールイネーブラー* /#define NUSE_SIGNALS_RECEIVE FALSE / *サービスコールイネーブラー* /
シグナルAPI関数が有効で、シグナル機能が有効になっていない場合、コンパイル時エラーが発生します。コードで有効にされていないAPI呼び出しを使用すると、アプリケーションに実装コードが含まれていないため、リンク時間エラーが発生します。もちろん、シグナルサポートを有効にしてこれらのAPIを使用できないようにしても意味がないため、2つのAPI関数を有効にすることはやや冗長です。イネーブルは、他のNucleusSE機能との互換性のために含まれています。
シグナルサービスコール
Nucleus RTOSは、シグナルに関連する4つのサービスコールをサポートし、次の機能を提供します。
-
指定されたタスクにシグナルを送信します。 NUSE_Signals_Send()によって実装されます NucleusSEで。
-
信号を受信します。 NUSE_Signals_Receive()によって実装されます NucleusSEで。
-
シグナルハンドラーを登録します。 NucleusSEには実装されていません。
-
シグナルを有効/無効(制御)します。 NucleusSEには実装されていません。
これらの各サービス呼び出しの実装について詳しく調べます。
信号の送受信サービス
タスクの一連のシグナルに対して実行できる基本的な操作は、タスクにデータを送信し(任意のタスクで実行できます)、タスクからデータを読み取ります(したがって、データをクリアします。これは、所有者のみが実行できます)。 。 NucleusRTOSとNucleusSEはそれぞれ、これらの操作のための2つの基本的なAPI呼び出しを提供します。これについては、ここで説明します。
信号フラグはビットであるため、2進数として視覚化するのが最適です。標準Cは歴史的にバイナリ定数(8進数と16進数のみ)の表現をサポートしていないため、Nucleus SEディストリビューションには便利なヘッダーファイル nuse_binary.h が含まれています。 –これには #define が含まれます b01010101 の形式の記号 256個の8ビット値すべてに対して。これが nuse_binary.h からの抜粋です ファイル:
#define b00000000((U8)0x00)#define b00000001((U8)0x01)#define b00000010((U8)0x02)#define b00000011((U8)0x03)#define b00000100((U8)0x04)#define b00000101((U8)0x05)
信号の送信
どのタスクも、アプリケーション内の他のタスクにシグナルを送信できます。信号の送信には、1つまたは複数の信号フラグの設定が含まれます。これは、以前に設定されたフラグに影響を与えないOR操作です。
信号を送信するためのNucleusRTOSAPI呼び出し
サービスコールプロトタイプ:
STATUS NU_Send_Signals(NU_TASK * task、UNSIGNED signal);
パラメータ:
タスク –設定する信号旗を所有するタスクの制御ブロックへのポインター
シグナル –設定する信号旗の値
返品:
NU_SUCCESS –通話は正常に完了しました
NU_INVALID_TASK –タスクポインタが無効です
信号を送信するためのNucleusSEAPI呼び出し
このAPI呼び出しは、Nucleus RTOSAPIの主要な機能をサポートしています。
サービスコールプロトタイプ:
STATUS NUSE_Signals_Send(NUSE_TASKタスク、U8シグナル);
パラメータ:
タスク –設定する信号旗を所有するタスクのインデックス(ID)
シグナル –設定する信号旗の値
返品:
NUSE_SUCCESS –通話は正常に完了しました
NUSE_INVALID_TASK –タスクインデックスが無効です
送信信号のNucleusSE実装</ em>
NUSE_Signals_Send()の完全なコードは次のとおりです。 機能:
STATUS NUSE_Signals_Send(NUSE_TASK task、U8 signal){#if NUSE_API_PARAMETER_CHECKING if(task> =NUSE_TASK_NUMBER){return NUSE_INVALID_TASK; } #endif NUSE_CS_Enter(); NUSE_Task_Signal_Flags [task] | =シグナル; NUSE_CS_Exit(); NUSE_SUCCESSを返す;}
コードは非常に単純です。パラメータチェックの後、信号値は指定されたタスクの信号旗にOR演算されます。タスクのブロックはシグナルとは関係ありません。
信号の受信
タスクは、それ自体の信号フラグのセットのみを読み取ることができます。それらを読むプロセスは破壊的です。つまり、フラグもクリアされます。
信号を受信するためのNucleusRTOSAPI呼び出し
サービスコールプロトタイプ:
UNSIGNED NU_Receive_Signals(VOID);
パラメータ:なし
戻り値:シグナルフラグ値
信号を受信するためのNucleusSEAPI呼び出し
このAPI呼び出しは、Nucleus RTOSAPIの主要な機能をサポートしています。
サービスコールプロトタイプ:
U8 NUSE_Signals_Receive(void);
パラメータ:なし
戻り値:信号旗の値
受信信号のNucleusSE実装</ em>
NUSE_Signals_Receive()の完全なコードは次のとおりです。 機能:
U8 NUSE_Signals_Receive(void){U8シグナル; NUSE_CS_Enter();シグナル=NUSE_Task_Signal_Flags [NUSE_Task_Active]; NUSE_Task_Signal_Flags [NUSE_Task_Active] =0; NUSE_CS_Exit();リターンシグナル;}
コードは非常に単純です。フラグ値がコピーされ、元の値がクリアされ、API関数によってコピーが返されます。タスクのブロックはシグナルとは関係ありません。
埋め込み
- 信号
- Rutronik:RedpineSignalsの超低電力ワイヤレスMCU
- Rutronik:RedpineSignalsのマルチプロトコルワイヤレスSoCおよびモジュール
- 単一の原子核の磁性を検出する
- 人工ニューラルネットワークは無線通信を強化することができます
- 新しいフレキシブルデバイスはWiFi信号を電気に変換できます
- 新しい回路は、量子力学によって許可された最も弱い無線信号を検出します
- レーザーはマイクロ波を放射し、外部無線周波数信号を受信できるようになりました
- 新しいアルゴリズムは、任意の2つのオーディオ信号をシームレスにブレンドします
- RFおよびマイクロ波設計のガイドライン
- 無線信号画像隠しおよびスピード違反のオブジェクト