RTOSに぀いおの真実。 蚘事14。 メモリのセクション玹介ず基本サヌビス



メモリのセクションは、以前の蚘事6のいずれかで以前に蚀及されおおり、C malloc蚀語の暙準機胜ず比范されたした。 パヌティションは、パヌティションプヌルメモリプヌルから取埗したメモリの領域です。 メモリの共有は、メ​​モリを確実か぀決定的に割り圓お、解攟するための柔軟な方法を提䟛したす。

シリヌズの以前の蚘事
蚘事13。 タスクデヌタ構造ずサポヌトされおいないAPI呌び出し
蚘事12。 タスクを操䜜するためのサヌビス
蚘事11。 タスクAPIの構成ず玹介
蚘事10。 スケゞュヌラ高床な機胜ずコンテキストの保存
蚘事9。 スケゞュヌラ実装
蚘事8。 Nucleus SE内郚蚭蚈ず展開
蚘事7。 Nucleus SEはじめに
蚘事6。 その他のRTOSサヌビス
蚘事5。 タスクの盞互䜜甚ず同期
蚘事4。 タスク、コンテキストの切り替え、および割り蟌み
蚘事3。 タスクず蚈画
蚘事2。 RTOS構造ずリアルタむム
蚘事1。 RTOSはじめに。

セクションを䜿甚する


Nucleus SEでは、䜜成時にパヌティションプヌルが蚭定されたす。 1぀のアプリケヌションに最倧16個のパヌティションプヌルを含めるこずができたす。 それらが構成されおいない堎合、これらのプヌルに関連するデヌタ構造ずサヌビス呌び出しはアプリケヌションに含たれたせん。

パヌティションプヌルは、䞀定サむズの䞀定数のブロックに分割されたメモリ領域です。 開発者は、各プヌルのパヌティションのサむズず数を完党に制埡したす。 タスクは、メモリの割り圓おられたセクションを芁求し、ストレヌゞ領域ぞのポむンタを受け取るこずができ、割り圓おられたセクションの倖郚にデヌタを曞き蟌むべきではありたせん。 API関数にポむンタヌを枡すず、どのタスクでもセクションを解攟できたす。 空きパヌティションがないずきにパヌティションを割り圓おる芁求は、遞択したAPI呌び出しパラメヌタヌずNucleus SEの構成によっおは、゚ラヌたたは芁求の䞀時停止に぀ながる可胜性がありたす。

メモリパヌティションのセットアップ


パヌティションプヌルの数


ほずんどのNucleus SEオブゞェクトず同様に、パヌティションプヌルの構成は、䞻にnuse_config.hの #defineディレクティブを䜿甚しお行われたす。 メむンパラメヌタヌはNUSE_PARTITION_POOL_NUMBERで 、これはアプリケヌションで定矩されおいるパヌティションプヌルの数を決定したす。 デフォルト倀は0です぀たり、パヌティションプヌルは䜿甚されたせん。開発者は0〜16の任意の倀を蚭定できたす。その他の倀は、 nuse_config_check.h  nuse_config.cに含たれたすで怜蚌䞭に怜出されたコンパむル゚ラヌに぀ながりたす。 、したがっお、このモゞュヌルでコンパむルしたす、 errorディレクティブのコンパむルに぀ながりたす。

れロ以倖の倀を遞択するこずは、パヌティションプヌルをアクティブにする優先的な方法です。 これにより、デヌタ構造の定矩ず適切なサむズの割り圓おが行われたす。 ROMのデヌタ構造は、各パヌティションプヌルを蚘述する適切な倀で初期化する必芁がありたす。 デヌタ構造の詳现に぀いおは、次の蚘事で説明したす。 この遞択により、API蚭定もアクティブになりたす。

API呌び出しをアクティブにする


Nucleus SEの各API関数ナヌティリティ呌び出しは、 nuse_config.hの #defineディレクティブによっおアクティブにされたす 。 パヌティションプヌルの堎合、次のものが含たれたす。

NUSE_PARTITION_ALLOCATE
NUSE_PARTITION_DEALLOCATE
NUSE_PARTITION_POOL_INFORMATION
NUSE_PARTITION_POOL_COUNT

デフォルトでは、これらはすべおFALSEに蚭定されおいるため、各サヌビス呌び出しが無効になり、実装コヌドが含たれなくなりたす。 アプリケヌションでパヌティションプヌルを構成するには、必芁なAPI呌び出しを遞択し、察応するディレクティブをTRUEに蚭定する必芁がありたす。

以䞋は、デフォルトのnuse_config.hファむルからの抜粋です。



Partition Pools API関数がアクティブになっおいるが、プヌルが構成されおいない堎合、コンパむル゚ラヌが発生したす垞に有効になっおいるNUSE_Partition_Pool_Countを陀く。 アクティブ化されおいないAPI呌び出しをコヌドで䜿甚するず、アプリケヌションに実装コヌドが含たれおいなかったため、レむアりト゚ラヌが発生したす。

パヌティションプヌルナヌティリティの呌び出し


Nucleus RTOSは、パヌティションプヌルに関連する7぀のナヌティリティコヌルをサポヌトし、次の機胜を提䟛したす。

機胜説明Nucleus RTOSNucleus SE
セクション遞択NU_Allocate_PartitionNUSE_Partition_Allocate
セクションリリヌスNU_Deallocate_PartitionNUSE_Partition_Deallocate
情報提䟛
特定のパヌティションプヌルに぀いお
NU_Partition_Pool_InformationNUSE_Partition_Pool_Information
珟圚蚭定されおいる数量の倀を返したす
アプリケヌションプヌル
NU_Established_Partition_PoolsNUSE_Partition_Pool_Count
新しいパヌティションプヌルをアプリケヌションに远加䜜成するNU_Create_Partition_Pool実装されおいたせん。
アプリケヌションからパヌティションプヌルを倉曎削陀するNU_Delete_Partition_Pool実装されおいたせん。
アプリケヌションに珟圚存圚するすべおのパヌティションプヌルぞのポむンタヌを返すNU_Partition_Pool_Pointers実装されおいたせん。

各呌び出しの実装に぀いお詳しく説明したす。

Nucleus RTOSもNucleus SEにも再起動機胜がないこずに泚意しおください。 これは意図的に行われたす。 非垞に倚くの堎合、1぀のタスクがセクションを割り圓お、別のタスクにポむンタヌを枡したす埌で解攟される堎合がありたす。 パヌティションプヌルをリロヌドするず、すべおのパヌティションが未䜿甚ずしおマヌクされたすが、パヌティションを䜿甚できるすべおのタスクを監芖および通知するメカニズムはありたせん。

パヌティションおよび無料サヌビス


パヌティションプヌルの基本的な操䜜は、プヌル内のパヌティションの割り圓お぀たり、パヌティションを䜿甚枈みずしおマヌクし、そのアドレスを返すず、パヌティションを解攟する぀たり、パヌティションが未䜿甚ずしおマヌクされるです。 Nucleus RTOSおよびNucleus SEは、これらの操䜜に察しお2぀の基本的なAPI呌び出しを提䟛したす。これらに぀いおは以䞋で説明したす。

セクション遞択


パヌティションを割り圓おるNucleus RTOS APIコヌルは非垞に柔軟性があり、開発者は、すべおのパヌティションが既に分散されおいるプヌルからパヌティションを割り圓おようずした堎合など、操䜜をすぐに完了できない堎合に、無期限たたはタむムアりトなしでタスクを䞀時停止できたす。 Nucleus SEは同じサヌビスを提䟛し、その䞭のタスクの䞀時停止のみがオプションであり、タむムアりトは実装されおいたせん。

Nucleus RTOS APIのパヌティションぞの呌び出し


プロトタむプを呌び出す

STATUS NU_Allocate_PartitionNU_PARTITION_POOL *プヌル、無効** return_pointer、未眲名の䞀時停止;

戻り倀

NU_SUCCESS-呌び出しは正垞に完了したした。
NU_NO_PARTITION-利甚可胜なセクションはありたせん。
NU_INVALID_POOL-無効なパヌティションプヌルポむンタヌ。
NU_INVALID_POINTER-返されたデヌタにNULLポむンタヌを枡したした NULL 。
NU_INVALID_SUSPEND-タスクに関連付けられおいないスレッドからタスクを䞭断しようずしたした。
NU_TIMEOUT-指定された埅機期間の䞭断の埌でも、䜿甚可胜なパヌティションはありたせん。
NU_POOL_DELETED-タスクが䞭断されたずきにパヌティションプヌルが削陀されたした。

パヌティションを匷調衚瀺するNucleus SE API呌び出し


このAPIコヌルは、Nucleus RTOS APIのコア機胜をサポヌトしおいたす。

プロトタむプを呌び出す

STATUS NUSE_Partition_AllocateNUSE_PARTITION_POOLプヌル、ADDR * return_pointer、U8サスペンド;

パラメヌタ

pool-䜿甚されおいるパヌティションプヌルのむンデックスID。
return_pointer-遞択したセクションのアドレスを取埗するADDR型の倉数ぞのポむンタヌ。
suspend-タスクを䞀時停止するためのパラメヌタヌ;倀はNUSE_NO_SUSPENDたたはNUSE_SUSPENDを取るこずができたす。

戻り倀

NUSE_SUCCESS-呌び出しは正垞に完了したした。
NUSE_NO_PARTITION-利甚可胜なセクションはありたせん。
NUSE_INVALID_POOL-無効なパヌティションプヌルむンデックス。
NUSE_INVALID_POINTER-返されたデヌタにNULLポむンタヌを枡したした NULL 。
NUSE_INVALID_SUSPEND —タスクに関連付けられおいないスレッドから、たたはロックAPIが無効にされたずきに、タスクを䞭断しようずしたした。

Nucleus SEでのパヌティション割り圓おの実装


API関数コヌドNUSE_Partition_Allocateは、ブロックのAPI呌び出しタスクの䞭断がアクティブになっおいるかどうかに応じお、パラメヌタヌを確認した埌、条件付きコンパむルによっお遞択されたす。 以䞋では、これら2぀のオプションを個別に怜蚎したす。

ブロッキング呌び出しが無効になっおいる堎合、API呌び出しは非垞に簡単です。



最初に、空きパヌティションの可甚性がチェックされたす。 そのようなパヌティションがない堎合、゚ラヌが返されたす NUSE_NO_PARTITION 。 次に、セクションの列挙があり、その間に最初のバむトのれロ倀がチェックされたすセクションが䜿甚されおいないこずを瀺したす。 このようなパヌティションが芋぀かるず、パヌティションプヌルのむンデックスを含む「䜿甚枈み」フラグが割り圓おられ以䞋の「パヌティションを解攟する」を参照、次のバむト実デヌタ領域の先頭ぞのポむンタが返されたす。 パヌティションプヌルのデヌタ構造に関する説明は、デヌタ構造セクションの次の蚘事で説明したす。

ロックが有効になっおいる堎合、このAPI呌び出しのコヌドはもう少し耇雑になりたす。



コヌドはdo ... whileルヌプで囲たれおいたす。このルヌプは、pauseパラメヌタヌがNUSE_SUSPENDである限り実行を続けたす。

䜿甚可胜なパヌティションがなく、pauseパラメヌタがNUSE_NO_SUSPENDの堎合、API呌び出しは停止し、 NUSE_NO_PARTITIONを返したす。 pauseパラメヌタヌがNUSE_SUSPENDに蚭定されおいる堎合、タスクは䞀時停止したす。 戻るずきたずえば、タスクが再開するずき、 NUSE_SUCCESSの戻り倀は、メモリセクションが解攟され、コヌドがルヌプの先頭に戻るため、タスクが再開されたこずを瀺したす。 パヌティションプヌルをリロヌドするためのAPI関数はないため、他の理由でタスクを再開するこずはできたせんが、他の皮類のオブゞェクトをブロックする安定性のため、 NUSE_Task_Blocking_Return []チェックプロセスは保存されたす。

セクションリリヌス


Nucleus RTOSおよびNucleus SEのセクションのリリヌスにより、再び利甚可胜になりたした。 リリヌス前は、このセクションがタスクによっお䜿甚されおいるかどうかはチェックされたせん。アプリケヌションプログラマがこれを担圓したす。 セクションを解攟するには、デヌタ領域ぞのポむンタのみが必芁です。

Nucleus RTOS APIコヌルによる空きパヌティション


プロトタむプを呌び出す

STATUS NU_Deallocate_PartitionVOID * partition;

パラメヌタ

partition-解攟されるパヌティションのデヌタ領域 NU_Allocate_Partition関数によっお返されるぞのポむンタ。

戻り倀

NU_SUCCESS-呌び出しは正垞に完了したした。
NU_INVALID_POINTER-セクションポむンタヌがNULLであるか、䜿甚されおいる有効なセクションを瀺しおいたせん。

Nucleus SE APIの無料セクションの呌び出し


このAPIコヌルは、Nucleus RTOS APIのコア機胜をサポヌトしおいたす。

プロトタむプを呌び出す

STATUS NUSE_Partition_DeallocateADDRパヌティション;

パラメヌタ

partition-解攟されるパヌティションのデヌタ領域 NUSE_Partition_Allocate関数によっお返されるぞのポむンタ

戻り倀

NUSE_SUCCESS-呌び出しは正垞に完了したした。
NUSE_INVALID_POINTER-セクションポむンタヌがnull NULL であるか、䜿甚されおいる有効なセクションを瀺しおいない

実装


ブロッキングおよびノンブロッキングAPI関数を䜿甚しお実装する代わりに、 NUSE_Partition_Deallocate関数には、タスクのロック解陀を行う条件付きでコンパむルされたセクションが含たれおいたす。 このコヌドは、セクションの解攟を実装したす。



最初に、セクションむンデックスがステヌタスバむトから取埗されたす。 次に、パヌティションの状態が「未䜿甚」に倉わり、䜿甚枈みパヌティションのカりンタヌが枛少し、関数は操䜜が正垞に完了したこずを報告したす。

ロックがアクティブになっおいる堎合、次のコヌドを䜿甚しお、䜿甚可胜なパヌティションプヌルを埅機しおいるタスクを再開したす。



このプヌルでパヌティションを割り圓おるずきにタスクがブロックされた堎合、最初のテヌブルが再開されたす。

次の蚘事では、メモリパヌティションに関連する远加のAPI呌び出しず、関連するデヌタ構造に焊点を圓おたす。

著者に぀いお Colin Wallsは電子業界で30幎以䞊働いおおり、ほずんどの時間をファヌムりェアに費やしおいたす。 珟圚、Mentor EmbeddedMentor Graphicsの䞀郚門のファヌムりェア゚ンゞニアです。 Colin Wallsは、カンファレンスやセミナヌ、倚くの技術蚘事の著者、ファヌムりェアに関する2冊の本でよく話したす。 英囜に䜏んでいたす。

Source: https://habr.com/ru/post/J426425/


All Articles