パーティションメモリ–導入と基本サービス
RTOSRevealedシリーズを表示する
メモリパーティションは前回の記事で紹介されました。ここでは、標準のC malloc()との比較が行われました。 機能が作られました。パーティションは、パーティションプールから取得したメモリ領域です。これにより、タスクが決定論的で信頼性の高い方法でデータストレージを取得および解放するための柔軟な手段が提供されます。
パーティションの使用
Nucleus SEでは、パーティションプールはビルド時に設定されます。アプリケーションには、最大16のパーティションプールを構成できます。パーティションプールが構成されていない場合、パーティションプールに関連するデータ構造またはサービス呼び出しコードはアプリケーションに含まれません。
パーティションプールは、特定の数の固定サイズのパーティションに分割された単なるメモリ領域です。ユーザーは、各プールのパーティションのサイズと数を完全に制御できます。タスクは、メモリパーティションの割り当てを要求し、ストレージ領域へのポインタを受け取る場合があります。パーティションの外部にデータを書き込まないのはタスクの責任です。パーティションは、API関数へのポインターを渡すことにより、任意のタスクによって割り当てを解除できます。使用可能なパーティションがなくなったときにパーティションの割り当てを要求すると、API呼び出しとNucleus SE構成で選択されたオプションによっては、エラーまたはタスクの中断が発生する可能性があります。
メモリパーティションの構成
パーティションプールの数
Nucleus SEのほとんどの側面と同様に、パーティションプールの構成は主に #define によって制御されます。 nuse_config.h のステートメント 。キー設定は NUSE_PARTITION_POOL_NUMBER です。 、アプリケーションに構成されているパーティションプールの数を決定します。デフォルト設定は0(つまり、パーティションプールは使用されていません)で、16までの任意の値に設定できます。値が間違っていると、コンパイル時エラーが発生し、 nuse_config_check.hでのテストによって生成されます。 (これは nuse_config.c に含まれています したがって、このモジュールでコンパイルされます)結果として #error コンパイル中のステートメント。
ゼロ以外の値を選択することは、パーティションプールの「マスターイネーブル」です。これにより、一部のデータ構造がそれに応じて定義およびサイズ設定されます。 ROM内のデータ構造は、各パーティションプールを特徴付ける適切な値に初期化する必要があります。データ構造の詳細については、次の記事をご覧ください。また、APIを有効にする設定をアクティブにします。
APIの有効化
Nucleus SEのすべてのAPI関数(サービス呼び出し)には、有効な #define があります。 nuse_config.h の記号 。パーティションプールの場合、これらは次のとおりです。
NUSE_PARTITION_ALLOCATE
NUSE_PARTITION_DEALLOCATE
NUSE_PARTITION_POOL_INFORMATION
NUSE_PARTITION_POOL_COUNT
デフォルトでは、これらはすべて FALSE に設定されています 、したがって、各サービスコールを無効にし、実装コードを含めることを禁止します。アプリケーションのパーティションプールを構成するには、使用するAPI呼び出しを選択し、それらの有効化記号を TRUE に設定する必要があります。 。
これは、デフォルトの nuse_config.h からの抜粋です。 ファイル:
パーティションプールAPI関数が有効で、パーティションプールが構成されていない場合( NUSE_Partition_Pool_Count()を除く)、コンパイル時エラーが発生します。 これは常に許可されています)。コードで有効にされていないAPI呼び出しを使用すると、アプリケーションに実装コードが含まれていないため、リンク時間エラーが発生します。
パーティションプールサービス呼び出し
Nucleus RTOSは、次の機能を提供するパーティションプールに関連する7つのサービス呼び出しをサポートしています。
-
パーティションを割り当てる: NU_Allocate_Partition() 。 NUSE_Partition_Allocate()によって実装されます NucleusSEで。
-
パーティションの割り当てを解除します: NU_Deallocate_Partition() 。 NUSE_Partition_Deallocate()によって実装されます NucleusSEで。
-
指定されたパーティションプールに関する情報を提供します: NU_Partition_Pool_Information() 。 NUSE_Partition_Pool_Information()によって実装されます NucleusSEで。
-
アプリケーション用に(現在)構成されているパーティションプールの数を返します: NU_Established_Partition_Pools() 。 NUSE_Partition_Pool_Count()によって実装されます NucleusSEで。
-
アプリケーションに新しいパーティションプールを追加(作成): NU_Create_Partition_Pool() 。 NucleusSEには実装されていません。
-
アプリケーションからパーティションプールを削除(削除): NU_Delete_Partition_Pool() 。 NucleusSEには実装されていません。
-
アプリケーション内の(現在)すべてのパーティションプールへのポインタを返します: NU_Partition_Pool_Pointers() 。 NucleusSEには実装されていません。
これらの各サービス呼び出しの実装について詳しく調べます。
(NucleusRTOSまたはNucleusSEのいずれかで)リセット機能が提供されていないことに注意してください。これは意図的なものです。あるタスクがパーティションを割り当て、別のタスクにポインターを渡すことは非常に一般的な方法です(おそらく後で割り当てを解除します)。パーティションプールがリセットされた場合、すべてのパーティションが未使用としてマークされますが、パーティションを使用している可能性のあるすべてのタスクを追跡して通知する手段はありません。
パーティションの割り当てと割り当て解除サービス
パーティションプールで実行できる基本的な操作は、パーティションの割り当て(つまり、パーティションを使用済みとしてマークし、そのアドレスを返す)と、パーティションの割り当て解除(つまり、パーティションを未使用としてマークする)です。 NucleusRTOSとNucleusSEはそれぞれ、これらの操作のための2つの基本的なAPI呼び出しを提供します。これについては、ここで説明します。
パーティションの割り当て
パーティションを割り当てるためのNucleusRTOS API呼び出しは非常に柔軟であり、操作をすぐに完了できない場合は、無期限に、またはタイムアウトで一時停止することができます。つまり、すべてのパーティションが現在割り当てられているプールからパーティションを割り当てようとします。 Nucleus SEは、タスクの一時停止がオプションであり、タイムアウトが実装されていないことを除いて、同じサービスを提供します。
パーティション割り当てのためのNucleusRTOSAPI呼び出し
サービスコールプロトタイプ:
STATUS NU_Allocate_Partition(NU_PARTITION_POOL * pool、
VOID ** return_pointer、UNSIGNED suspend);
返品:
NU_SUCCESS –通話は正常に完了しました
NU_NO_PARTITION –使用可能なパーティションはありません
NU_INVALID_POOL –パーティションプールポインタが無効です
NU_INVALID_POINTER –データ戻りポインタは NULL
NU_INVALID_SUSPEND –非タスクスレッドからサスペンドが試行されました
NU_TIMEOUT –指定されたタイムアウト期間中断した後でも使用可能なパーティションはありません
NU_POOL_DELETED –タスクの一時停止中にパーティションプールが削除されました
割り当てのためのNucleusSEAPI呼び出し
このAPI呼び出しは、Nucleus RTOSAPIの主要な機能をサポートしています。
サービスコールプロトタイプ:
STATUS NUSE_Partition_Allocate(NUSE_PARTITION_POOL pool、ADDR * return_pointer、U8 suspend);
パラメータ:
プール –使用するパーティションプールのインデックス(ID)
return_pointer –タイプ ADDR の変数へのポインタ 割り当てられたパーティションのアドレスを受け取ります
サスペンド –タスクサスペンドの仕様。 NUSE_NO_SUSPEND の可能性があります または NUSE_SUSPEND
返品:
NUSE_SUCCESS –通話は正常に完了しました
NUSE_NO_PARTITION –使用可能なパーティションはありません
NUSE_INVALID_POOL –パーティションプールインデックスが無効です
NUSE_INVALID_POINTER –データ戻りポインタは NULL
NUSE_INVALID_SUSPEND –非タスクスレッドから、またはAPI呼び出しのブロックが有効になっていないときにサスペンドが試行されました
埋め込み