Nucleus SEシグナルによる効率的なタスク間通信
このRTOS Revealedシリーズでは、Nucleus SEにおける最もシンプルで低コストなタスク間通信手段であるシグナルを探ります。シグナルはタスク間での軽量で信頼性の高いメッセージパッシングを可能にします。
シグナルの使用
他のカーネルオブジェクトとは異なり、シグナルは自律的ではなく、タスクに固有にリンクし、そのタスクのコンテキスト内でのみ存在します。シグナルがアプリケーションで有効化されると、すべてのタスクが自動的に8つのバイナリシグナルフラグのセットを受け取ります。
任意のタスクが別のタスクのシグナルフラグを設定できます。しかし、それらのフラグを読み取りクリアできるのは所有タスクのみであり、読み取りは破壊的で、読み取り操作中にフラグがリセットされます。他のタスクはタスクのシグナル状態を検査または変更できません。
Nucleus RTOSには、別のタスクが自分のシグナルフラグの1つを設定したときに実行されるコールバックをタスクが指名できる機能があります。これは割り込みサービスルーチンに類似しています。残念ながらこの機能はNucleus SEにはなく、タスクは明示的に自身のシグナルフラグをポーリングする必要があります。
シグナルの設定
シグナルは主にnuse_config.h内の#define指令で設定されます。鍵マクロはNUSE_SIGNAL_SUPPORTで、TRUEに設定するとアプリケーション全体でシグナルサポートが活性化されます。タスクあたりのシグナル数は8つで固定、追加設定は不要です。
シグナルを有効化すると必要なデータ構造が作成され、関連API呼び出しが活性化されます。Nucleus SEの各API関数には独自の有効化マクロがあります。シグナルでは以下の有効化が定義されています:
NUSE_SIGNALS_SEND NUSE_SIGNALS_RECEIVE
デフォルトでは両方FALSEで、対応するサービスコールを無効化し、実装コードを省略します。シグナルを使用するには、目的の有効化をTRUEに設定します。APIを有効化せずに呼び出すとコンパイルエラー、未実装APIを使用するとリンクエラーになります。
nuse_config.hからの抜粋:
#define NUSE_SIGNAL_SUPPORT FALSE /* シグナルサポートを有効化 */ #define NUSE_SIGNALS_SEND FALSE /* サービスコール有効化 */ #define NUSE_SIGNALS_RECEIVE FALSE /* サービスコール有効化 */
シグナルサービスコール
Nucleus SEにはシグナル関連の4つの主要サービスコールがあります。SEで実装されているのは2つのみ、他はRTOS向けでSEでは予約済み。:
- 指定タスクへシグナル送信 – NUSE_Signals_Send()
- シグナル受信 – NUSE_Signals_Receive()
- シグナルハンドラ登録 – SEでは未実装
- シグナル有効/無効 – SEでは未実装
送信と受信操作
シグナルフラグはビットであり、バイナリ数として視覚化するのが最適です。標準Cにバイナリリテラルがないため、Nucleus SEにはnuse_binary.hが含まれ、すべての256通りの8ビット値に対してb01010101のようなマクロを定義しています。
#define b00000000 ((U8)0x00) #define b00000001 ((U8)0x01) #define b00000010 ((U8)0x02) #define b00000011 ((U8)0x03) #define b00000100 ((U8)0x04) #define b00000101 ((U8)0x05)
シグナル送信
任意のタスクがOR演算で別のタスクの1つ以上のシグナルフラグを設定可能 – 以前に設定されたフラグは変更されません。
Nucleus RTOS API呼び出し
STATUS NU_Send_Signals(NU_TASK *task, UNSIGNED signals);
パラメータ:
- task – 対象タスクの制御ブロックへのポインタ
- signals – 設定するシグナルフラグの値
戻り値:
- NU_SUCCESS – 呼び出し成功
- NU_INVALID_TASK – 無効なタスクポインタ
Nucleus SE API呼び出し
STATUS NUSE_Signals_Send(NUSE_TASK task, U8 signals);
パラメータ:
- task – 対象タスクのインデックス(ID)
- signals – 設定するシグナルフラグの値
戻り値:
- NUSE_SUCCESS – 呼び出し成功
- NUSE_INVALID_TASK – 無効なタスクインデックス
NUSE_Signals_Send()の実装
STATUS NUSE_Signals_Send(NUSE_TASK task, U8 signals){ #if NUSE_API_PARAMETER_CHECKING if (task >= NUSE_TASK_NUMBER){ return NUSE_INVALID_TASK; } #endif NUSE_CS_Enter(); NUSE_Task_Signal_Flags[task] |= signals; NUSE_CS_Exit(); return NUSE_SUCCESS; }
シグナル受信
タスクは自身のシグナルフラグのみ読み取り可能で、操作は破壊的 – 読み取り時にフラグがクリアされます。
Nucleus RTOS API呼び出し
UNSIGNED NU_Receive_Signals(VOID);
現在のシグナルフラグ値を返す。
Nucleus SE API呼び出し
U8 NUSE_Signals_Receive(void);
現在のシグナルフラグ値を返す。
NUSE_Signals_Receive()の実装
U8 NUSE_Signals_Receive(void){ U8 signals; NUSE_CS_Enter(); signals = NUSE_Task_Signal_Flags[NUSE_Task_Active]; NUSE_Task_Signal_Flags[NUSE_Task_Active] = 0; NUSE_CS_Exit(); return signals; }
これらのシンプルな関数は、Nucleus SEがタスクブロッキングやスケジューリングに影響を与えずにシグナルを効率的に管理する様子を示しています。
埋め込み
- 人工ニューラルネットワークが無線通信性能を向上
- フレキシブルなレクテナでWi-Fi電波を電力に変換、微小デバイス駆動へ道
- 量子回路で最弱ラジオ信号(単一光子)を検出、NMR・電波天文学へ応用期待
- 半導体レーザーでマイクロ波発信・無線受信実現、超高速Wi-Fiへの道筋
- リアルタイムポルタメントアルゴリズムで任意2音声信号シームレス融合
- RF・マイクロ波PCB設計の必須原則:信頼性の高い性能を実現
- Nucleus SEシグナルによる効率的なタスク間通信
- Rutronik、Redpine Signals RS14100を販売:超低消費電力、マルチプロトコル、セキュア無線MCU
- Rutronik、Redpine Signalsの超低消費電力マルチプロトコルSoCを提供
- 電波リアルタイムイメージング「m-Widar」─ 壁越し・コーナー裏・超高速物体を遠隔撮像
- 単一原子核の磁気シグネチャーの測定