RTOSに぀いおの真実。 蚘事15。 メモリパヌティションサヌビスずデヌタ構造



この蚘事では、RTOSのメモリセクションを匕き続き確認したす。

Nucleus RTOSには、メモリパヌティションプヌルに関連するナヌティリティ機胜を提䟛する3぀のAPIコヌルがありたす。パヌティションプヌルに関する情報を返す、アプリケヌション内のパヌティションプヌルの数を返す、アプリケヌション内のすべおのパヌティションプヌルぞのポむンタを返す。 最初の2぀の課題はNucleus SEに実装されおいたす。

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

パヌティションプヌル情報の取埗


このサヌビス呌び出しは、パヌティションプヌルに関する郚分的な情報を提䟛したす。 Nucleus SEの実装は、オブゞェクトの呜名ず䞀時停止芁求がサポヌトされおおらず、タスクを䞀時停止できないため、返される情報が少ないずいう点でNucleus RTOSず異なりたす。

Nucleus RTOSでのパヌティションプヌル情報の呌び出し


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

STATUS NU_Partition_Pool_InformationNU_PARTITION_POOL * pool、CHAR * name、VOID ** start_address、UNSIGNED * pool_size、UNSIGNED * partition_size、UNSIGNED * available、UNSIGNED * allocateed、OPTION * suspend_type、UNSIGNED * tasks_waiting ** first_task;最初

パラメヌタ

pool-情報が芁求されるパヌティションプヌルぞのポむンタ。
name-パヌティションプヌルの名前の8文字の宛先領域ぞのポむンタヌ。 れロを終了する堎所が含たれたす。
start_address-パヌティションプヌルのデヌタ領域の先頭ぞのポむンタヌを受け取る倉数ぞのポむンタヌ。
pool_size-パヌティションプヌルのサむズバむト単䜍を受け取る倉数ぞのポむンタヌ。
partition_size-特定のプヌル内のパヌティションのサむズを取埗する倉数ぞのポむンタヌ。
available-特定のプヌルで珟圚䜿甚可胜なパヌティションの数を受け取る倉数ぞのポむンタヌ。
割り圓お -特定のプヌルで珟圚䜿甚されおいるパヌティションの数を受け取る倉数ぞのポむンタ。
suspend_type-タスク䞭断のタむプを取埗する倉数ぞのポむンタヌ。 有効なサスペンションタむプ NU_FIFOおよびNU_PRIORITY ;
tasks_waiting-このパヌティションプヌル内の䞭断されたタスクの数を受け取る倉数ぞのポむンタヌ。
first_task-最初に䞭断されたタスクのポむンタヌが配眮されおいるタスクポむンタヌぞのポむンタヌ。

戻り倀

NU_SUCCESS-呌び出しは正垞に完了したした。
NU_INVALID_POOL-パヌティションプヌルぞの無効なポむンタヌ。

Nucleus SEでのパヌティションプヌル情報の呌び出し


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

STATUS NUSE_Partition_Pool_InformationNUSE_PARTITION_POOLプヌル、ADDR * start_address、U32 * pool_size、U16 * partition_size、U8 * available、U8 *割り圓お枈み、U8 * tasks_waiting、NUSE_TASK * first_task

パラメヌタ

pool-情報が芁求されるパヌティションプヌルのむンデックス。
start_address-パヌティションプヌルのデヌタ領域の先頭ぞのポむンタヌを受け取る倉数ぞのポむンタヌ。
pool_size-パヌティションプヌルのサむズバむト単䜍を受け取る倉数ぞのポむンタヌ。
partition_size-特定のプヌル内のパヌティションのサむズを取埗する倉数ぞのポむンタヌ。
available-特定のプヌルで珟圚䜿甚可胜なパヌティションの数を受け取る倉数ぞのポむンタヌ。
割り圓お -特定のプヌルで珟圚䜿甚されおいるパヌティションの数を受け取る倉数ぞのポむンタ。
tasks_waiting-このパヌティションプヌルで䞭断されたタスクの数を受け取る倉数ぞのポむンタヌタスクの䞭断が無効になっおいる堎合、0が返されたす。
first_task-最初に䞭断されたタスクのむンデックスを受け取るNUSE_TASK型の倉数ぞのポむンタヌタスクの䞭断が無効な堎合、0が返されたす。

戻り倀

NUSE_SUCCESS-呌び出しは正垞に完了したした。
NUSE_INVALID_POOL-無効なパヌティションプヌルむンデックス。
NUSE_INVALID_POINTER-枡された 1぀以䞊のポむンタヌが無効です。

Nucleus SEでの情報怜玢ずパヌティションプヌリングの実装


このようなAPI呌び出しの実装は簡単に実行できたす。



この関数は、パヌティションプヌルのステヌタスを返したす。 次に、APIコヌルブロッキングが有効になっおいる堎合、保留䞭のタスクの数ず最初のタスクのむンデックスが返されたすそれ以倖の堎合、これらのパラメヌタヌは0に蚭定されたす。

パヌティションプヌルの数を取埗する


この呌び出しは、アプリケヌションで構成されおいるパヌティションプヌルの数に関する情報を返したす。 Nucleus RTOSではこの数は時間ずずもに倉化し、戻り倀は珟圚のプヌル数を衚したすが、Nucleus SEでは戻り倀はアセンブリ䞭に蚭定され、倉曎されたせん。

Nucleus RTOSでパヌティションプヌルの数を取埗する課題


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

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

UNSIGNED NU_Established_Partition_PoolsVOID;

パラメヌタ

欠垭しおいたす。

戻り倀

アプリケヌションで䜜成されたパヌティションプヌルの数。

Nucleus SEでパヌティションプヌルの数を取埗するずいう課題


このナヌティリティ呌び出しは、Nucleus RTOS APIのコア機胜をサポヌトしおいたす。

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

U8 NUSE_Partition_Pool_Countvoid;

パラメヌタ

欠垭

戻り倀

アプリケヌションで䜜成されたパヌティションプヌルの数。

実装


このAPI呌び出しの実装は非垞に簡単です。NUSE_PARTITION_POOL_NUMBERシンボルの#define倀が返されたす。

デヌタ構造


他のすべおのNucleus SEオブゞェクトず同様に、パヌティションプヌルはROMずRAMの䞡方で構造配列を䜿甚したす。その数は、蚭定で指定されたプヌルの数に䟝存したす。

アプリケヌションコヌドは、盎接ではなく、API関数を介しおこのようなデヌタ構造にアクセスするこずを匷くお勧めしたす。 これにより、Nucleus SEの将来のバヌゞョンずの非互換性や望たしくない副䜜甚が回避され、Nucleus RTOSぞのアプリケヌションの移怍も簡玠化されたす。 以䞋は、サヌビス呌び出しコヌドずデバッグの理解を容易にするためのデヌタ構造の詳现な説明です。

RAMに配眮されたカヌネルデヌタの構造


そのようなデヌタ構造には以䞋が含たれたす。

NUSE_Partition_Pool_Partition_Used [] -珟圚䜿甚されおいるプヌルのカりンタヌを含む、構成されたパヌティションプヌルごずに1぀の゚ントリを持぀、タむプU8の配列。
NUSE_Partition_Pool_Blocking_Count [] -各パヌティションプヌルでブロックされたタスクのカりンタヌを含むU8型の配列。 この配列は、API呌び出しをブロックできる堎合に存圚したす。

このようなデヌタ構造は、Nucleus SEの起動時にNUSE_Init_ Partition_Poolを䜿甚しおれロに初期化されたす。 これは、各プヌルの各パヌティションを未䜿甚無料にするため、論理的です。 次の蚘事では、Nucleus SEの起動手順に぀いお詳しく説明したす。

以䞋は、 nuse_init.cファむル内のデヌタ構造の説明です。



RAMナヌザヌデヌタ


ナヌザヌは、各パヌティションプヌルのデヌタを保存するために、RAMに領域を割り圓おる必芁がありたす。 RAMのスペヌスの量は、構成されたパヌティションのボリュヌムに察応する必芁があり以䞋の「ROMのデヌタ」を参照、プヌル内の各パヌティションに远加のバむトが必芁です。 デヌタ領域の各セクションの前には、ステヌタスバむトが1぀ありたす。

ROMデヌタ


これらには以䞋が含たれたす。

NUSE_Partition_Pool_Data_Address []-ADDRタむプの配列。構成されたパヌティションプヌルごずに1぀の゚ントリがあり、デヌタストレヌゞ領域の先頭のアドレスが含たれたす。
NUSE_Partition_Pool_Partition_Number [] -構成されたパヌティションプヌルごずに1぀の゚ントリを持぀タむプU8の配列。プヌル内のパヌティションの数に関する情報が含たれたす。
NUSE_Partition_Pool_Partition_Size [] -構成されたパヌティションプヌルごずに1぀の゚ントリを持ち、プヌルのパヌティションのサむズを含むU16型の配列。

このようなデヌタ構造は、 nuse_config.cで 静的に宣蚀および初期化されたす 。



パヌティションプヌルのデヌタフットプリント


Nucleus SEのすべおのコアオブゞェクトず同様に、パヌティションプヌルに必芁なメモリ量は予枬可胜です。

すべおのアプリケヌションパヌティションプヌルのROMサむズバむト単䜍は、次のように蚈算できたす。

NUSE_PARTITION_POOL_NUMBER *sizeofADDR+ 2

API呌び出しのブロックがアクティブになっおいる堎合、すべおのアプリケヌションパヌティションプヌルのRAM内のカヌネルデヌタの量は、パヌティションプヌルごずに2バむトのみで、ブロックがアクティブになっおいない堎合は1バむトです。

RAMにナヌザヌデヌタを栌玍するためのメモリの量はパヌティションプヌルごずに異なりたすが、既に述べたように、むンデックスnのプヌルでは次のように蚈算できたす。

NUSE_Partition_Pool_Partition_Number [n] *
NUSE_Partition_Pool_Partition_Size [n] + 1

未実珟のAPI呌び出し


Nucleus RTOSに実装されおいるパヌティションプヌルの3぀のAPI呌び出しは、Nucleus SEではサポヌトされおいたせん。

パヌティションプヌルを䜜成する


このAPI呌び出しは、パヌティションプヌルを䜜成したす。 タスクは静的に䜜成されるため、Nucleus SEでは必芁ありたせん。

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

STATUS NU_Create_Partition_PoolNU_PARTITION_POOL * pool、CHAR * name、VOID * start_address、UNSIGNED pool_size、UNSIGNED partition_size、OPTION suspend_type;

パラメヌタ

pool-パヌティションプヌルを管理するためのナヌザヌナニットぞのポむンタ。 他のAPI呌び出しでパヌティションプヌルぞのハンドルずしお䜿甚されたす。
name-パヌティションプヌルの名前ぞのポむンタ、終了れロを含む7文字の文字列。
start_address-パヌティションプヌルのメモリ領域の開始アドレスを蚭定したす。
pool_size-バむト単䜍のメモリ領域の合蚈量。
partition_sizeは、プヌル内の各パヌティションのバむト単䜍のメモリ量です。 さらに、各セクションに関連付けられた远加の少量のメモリが割り圓おられたす。これは、䜿甚される2぀のデヌタポむンタのおかげで実珟されたす。
suspend_type-パヌティションプヌルでタスクを䞀時停止する方法を決定したす。 有効なパラメヌタヌオプションはNU_FIFOおよびNU_PRIORITYです。

戻り倀

NU_SUCCESS-呌び出しが正垞に完了したこずを瀺したす。
NU_INVALID_POOL-パヌティションプヌルコントロヌルナニットのれロ倀 NULL を瀺したす。
NU_INVALID_MEMORY - start_ address  NULL で定矩されたメモリ領域のれロ倀を瀺したす 。
NU_INVALID_SIZE-パヌティションサむズが0たたはパヌティションに割り圓おられたメモリより倧きいこずを瀺したす。
NU_INVALID_SUSPEND-無効なsuspend_type倀。

パヌティションプヌルの削陀


このAPI呌び出しは、以前に䜜成されたパヌティションプヌルを削陀したす。 オブゞェクトは静的に䜜成され、削陀できないため、Nucleus SEでは必芁ありたせん。

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

STATUS NU_Delete_Partition_PoolNU_PARTITION_POOL *プヌル;

パラメヌタ

pool-パヌティションプヌルコントロヌルナニットぞのポむンタ。

戻り倀

NU_SUCCESS-呌び出しが正垞に完了したこずを瀺したす。
NU_INVALID_POOL-パヌティションプヌルポむンタヌの無効な倀を瀺したす。

パヌティションプヌルポむンタヌ


このAPI呌び出しは、システム内のすべおのパヌティションプヌルぞのポむンタヌの順次リストを䜜成したす。 オブゞェクトはポむンタヌではなくむンデックスによっお識別されるため、Nucleus SEではこれは必芁ありたせん。

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

UNSIGNED NU_Partition_Pool_PointersNU_PARTITION_POOL ** pointer_list、UNSIGNED maximum_pointers;

パラメヌタ

pointer_list-ポむンタヌの配列ぞのポむンタヌNU_PARTITION_POOL ; 配列には、システム内の構成枈みプヌルぞのポむンタヌが入りたす。
maximum_pointers-配列に配眮できるポむンタヌの最倧数。

戻り倀

配列に配眮されたNU_PARTITION_POOLポむンタヌの数。

Nucleus RTOS互換


Nucleus SEを開発する際の䞻なタスクの1぀は、Nucleus RTOSずの高レベルのコヌド互換性を確保するこずでした。 パヌティションプヌルも䟋倖ではなく、開発者の芳点からは、Nucleus RTOSずほが同じ方法で実装されおいたす。 互換性のない既存の領域も受け入れられたすが、最終的なコヌドの方が理解しやすく、メモリの面でより効率的であるこずを考慮する䟡倀がありたす。 ただし、Nucleus RTOS API呌び出しは、Nucleus SE呌び出しずしおほが盎接䜿甚できたす。 将来、Nucleus RTOSのナヌザヌによるNucleus SEの䜿甚に関する情報を含む蚘事が蚈画されたす。

オブゞェクト識別子


Nucleus RTOSでは、すべおのオブゞェクトは特定のタむプのデヌタ構造コントロヌルナニットによっお蚘述されたす。 この制埡ブロックぞのポむンタヌは、パヌティションプヌルの識別子ずしお䜿甚されたす。 Nucleus SEでは、メモリをより効率的に䜿甚するために別のアプロヌチが必芁であるず刀断したした。 すべおのカヌネルオブゞェクトは、RAMおよび/たたはROMのいく぀かのテヌブルで蚘述されたす。 これらのテヌブルのサむズは、すべおのオブゞェクトの構成可胜なタむプの数によっお決たりたす。 特定のオブゞェクトの識別子は、これらのテヌブルのむンデックスです。 したがっお、 NUSE_PARTITION_POOLはU8 ず同等であるず刀断したした。その埌、このタむプの倉数ポむンタヌではないがタスクの識別子ずしお機胜したす。 このわずかな非互換性は、コヌドがNucleus RTOSずの間で移怍されおいるかどうかを簡単に把握できたす。 通垞、オブゞェクト識別子は倉曎されずに保存および送信されたす。

Nucleus RTOSは、パヌティションプヌルの呜名もサポヌトしおいたす。 これらの名前は、デバッグにのみ䜿甚されたす。 メモリを節玄するために、Nucleus SEからそれらを陀倖したした。

セクションの数ずそのボリュヌム


Nucleus RTOSでは、プヌルの合蚈ボリュヌムずパヌティションのボリュヌムさらに2぀のポむンタヌを運ぶに基づいお、パヌティションプヌルが構成されたす。 これらのパラメヌタヌは、UNSIGNED玄32ビットずしお定矩されたす。 Nucleus SEでは、パヌティションのサむズ远加バむトが远加されおいるずパヌティションの総数に基づいお、パヌティションプヌルが構成されたす。 これらのパラメヌタヌは、それぞれU16およびU8ずしお定矩されおいたす。

未実珟のAPI呌び出し


Nucleus RTOSは、パヌティションプヌルを操䜜するための7぀の呌び出しをサポヌトしおいたすが、そのうち3぀はNucleus SEには実装されおいたせん。 これらの課題の詳现ず陀倖の理由に぀いおは、䞊蚘で抂説しおいたす。

次の蚘事はシグナルに぀いおです。

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

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


All Articles