Nucleus SEのメールボックス:設定と使用の実践ガイド
RTOS Revealedシリーズを表示
メールボックスは、シグナルに次いでNucleus SEで最もシンプルなタスク間通信メカニズムとして、以前の記事で紹介されました。タスク間でシンプルなデータを転送するための低コストで高柔軟な手段を提供します。
メールボックスの使用
Nucleus SEでは、メールボックスはビルド時に定義されます。アプリケーションあたり最大16個のメールボックスを設定可能。0個に設定すると、コンパイラは関連するすべてのデータ構造とAPIコードを省略し、バイナリをスリムに保ちます。
メールボックスは本質的に、ADDR型の単一変数を保持するストレージスロットです。一度に1つのタスクのみがメールボックスへ書き込み可能。一旦満杯になると、読み取りまたはリセットされるまで後続の書き込みは失敗します。APIオプションにより、満杯メールボックスへの書き込み試行はエラーを返すか、スペースが空くまでタスクをサスペンドします。
メールボックス vs キュー
一部のOSはメールボックスを単一エントリキューで置き換えます。キューはメールボックスの振る舞いを模倣できますが、ヘッド/テイルポインタ、より大きなデータ構造、より多くのコードパスといったオーバーヘッドを伴い、メモリ使用量と実行時間が増大します。
Nucleus SEではメールボックスかキューを選択可能。設計で多くのキューと少数のメールボックスを使う場合、メールボックスをキューに置き換えるとデータサイズはわずかに増えますが、メールボックス固有のAPIコードが削除されメンテナンスが簡素化されます。両設定を簡単にテストしてメモリフットプリントと性能を比較できます。
キューについては今後の記事で扱います。
メールボックスの設定
メールボックス数
nuse_config.hの鍵となるマクロはNUSE_MAILBOX_NUMBERです。デフォルト値は0で、メールボックスが無効です。1から16の整数を設定可能。nuse_config_check.hのコンパイル時チェックで範囲外ならエラーになります。
非ゼロ値を設定するとメールボックスサブシステムが有効化:データ構造がサイズ設定され、API有効化シンボルが処理されます。
API有効化
各メールボックスAPI呼び出しには、nuse_config.hに対応する#defineがあります:
NUSE_MAILBOX_SENDNUSE_MAILBOX_RECEIVENUSE_MAILBOX_RESETNUSE_MAILBOX_INFORMATIONNUSE_MAILBOX_COUNT
デフォルトではすべてFALSEで、呼び出しと実装が無効化されます。APIを使用するには、対応するマクロをTRUEに設定します。メールボックスが設定されていないのにAPIを有効化するとコンパイルエラー(NUSE_Mailbox_Count()は常に利用可能)が発生します。無効なAPIを呼び出すとリンクエラーになります。
/* システム内のメールボックス数 – 0-16 */ #define NUSE_MAILBOX_NUMBER 0 /* サービスコール有効化: */ #define NUSE_MAILBOX_SEND FALSE #define NUSE_MAILBOX_RECEIVE FALSE #define NUSE_MAILBOX_RESET FALSE #define NUSE_MAILBOX_INFORMATION FALSE #define NUSE_MAILBOX_COUNT FALSE
メールボックスサービスコール
Nucleus SEには9つのメールボックス関連サービスコールがあります。SEで実装されているのは:
- NUSE_Mailbox_Send() – メールボックスへメッセージを書き込む。
- NUSE_Mailbox_Receive() – メールボックスからメッセージを読み取る。
- NUSE_Mailbox_Reset() – タスクをサスペンドせずにメールボックスをクリア。
- NUSE_Mailbox_Information() – メールボックスのステータスを照会。
- NUSE_Mailbox_Count() – 設定されたメールボックス数を返す。
作成、削除、一括取得、ブロードキャストなどの他機能はSEには実装されていません。
書き込みと読み取り操作
メールボックスは送信(書き込み)と受信(読み取り)の2つの基本操作をサポートします。両APIはNucleus RTOSとNucleus SEの両方で利用可能ですが、柔軟性とエラーハンドリングに違いがあります。
メールボックスへの送信
Nucleus RTOSのNU_Send_To_Mailboxは、メールボックスが満杯の場合に無期限またはタイムアウト付きサスペンドをサポートします。Nucleus SEは簡易版を提供:サスペンドはオプションでタイムアウトは非サポート。
Nucleus SEのプロトタイプ例:
STATUS NUSE_Mailbox_Send(NUSE_MAILBOX mailbox, ADDR *message, U8 suspend);
パラメータ:
mailbox– メールボックスインデックス。message–ADDR変数へのポインタ。suspend–NUSE_NO_SUSPENDまたはNUSE_SUSPEND。
戻り値にはNUSE_SUCCESS、NUSE_INVALID_MAILBOX、NUSE_MAILBOX_FULL、NUSE_MAILBOX_WAS_RESETが含まれます。
実装概要
ブロッキング無効時、ルーチンはメールボックスステータスフラグをチェック。空ならデータを書き込みフルマークを付け、そうでなければNUSE_MAILBOX_FULLを返します。
ブロッキング有効時、メッセージが正常に投稿されるか、受信操作でタスクがウェイクアップされるまでループします。タスクがメールボックスでサスペンドされている場合、正常な送信直後に即座にレジュームされます。
ブロッキング有効時のコアロジックを簡略化して示します:
do { if (!NUSE_Mailbox_Status[mailbox]) { // メールボックス空 – データ格納し、待機タスクがあればウェイクアップ } else if (suspend == NUSE_NO_SUSPEND) { return NUSE_MAILBOX_FULL; } else { // メールボックスが空になるまでタスクをサスペンド } } while (suspend == NUSE_SUSPEND);
要約すると、メールボックスAPIはシンプルさと柔軟性を両立し、アプリケーションのタイミング要件に基づいて即時失敗かタスクサスペンドかを選択可能にします。
埋め込み
- カムロック完全解説:キャビネットを目立たず確実に施錠する仕組み
- アイボルト(アイスクリュー)とは:設計と用途のプロフェッショナルガイド
- グロメット完全ガイド:種類・用途・機器保護の仕組み
- ステンレス鋼解説:組成・製造プロセス・グローバルインパクト
- Nucleus RTOSのセマフォ:ユーティリティサービスとデータ構造
- Nucleus SEのセマフォ:概要、設定、API要点
- イベントフラググループの習得:Nucleus RTOS/SEのユーティリティサービスとデータ構造
- Nucleus SEのイベントフラググループ:設定とAPI使用の入門ガイド
- Nucleus SEのキュー:導入とコアサービスコール
- COVID-19とクラウド:主要プロバイダーがパンデミック中にビジネスを支援した方法
- C# 入出力の基礎:ユーザー入力と出力の基本をマスター