9.3 可変長メモリ・プール
現在のRI600PXの実装では,実際に獲得されるメモリ・ブロックのサイズは,最大で12種類のバリエーションから選択されます。このバリエーションは,可変長メモリ・プール生成時に指定した最大メモリ・ブロック・サイズを元に,あらかじめ規定された24種類のサイズの中から選択されます。表9-1に,メモリ・ブロックサイズのバリエーションを示します。ただし,この振る舞いは将来変更される可能性があります。
1 ) システム・コンフィギュレーション・ファイルによる生成
システム・コンフィギュレーション・ファイルで静的API“variable_memorypool[]”を使用して可変長メモリ・プールを生成します。
静的API“variable_memorypool[]”の詳細は,「20.18 可変長メモリ・プール情報(variable_memorypool[])」を参照してください。
システム・コンフィギュレーション・ファイルで静的API“variable_memorypool[]”を使用して可変長メモリ・プールを生成します。
静的API“variable_memorypool[]”の詳細は,「20.18 可変長メモリ・プール情報(variable_memorypool[])」を参照してください。
2 ) cre_mplまたはacre_mplサービスコールによる生成
cre_mplは,パラメータpk_cmplが指す領域に設定された可変長メモリ・プール生成情報にしたがって,パラメータmplidで指定された可変長メモリ・プールIDの可変長メモリ・プールを生成します。
acre_mplは,パラメータpk_cmplが指す領域に設定された可変長メモリ・プール生成情報にしたがって可変長メモリ・プールを生成し,生成された可変長メモリ・プールIDを返します。
指定する可変長メモリ・プール生成情報は,以下の通りです。
cre_mplは,パラメータpk_cmplが指す領域に設定された可変長メモリ・プール生成情報にしたがって,パラメータmplidで指定された可変長メモリ・プールIDの可変長メモリ・プールを生成します。
acre_mplは,パラメータpk_cmplが指す領域に設定された可変長メモリ・プール生成情報にしたがって可変長メモリ・プールを生成し,生成された可変長メモリ・プールIDを返します。
指定する可変長メモリ・プール生成情報は,以下の通りです。
- 可変長メモリ・プール領域のサイズ(バイト数)(mplsz),可変長メモリ・プール領域の先頭アドレス(mpl)
可変長メモリ・プールの先頭アドレスは,4バイト境界でなければなりません。
可変長メモリ・プール領域は,メモリ・ブロックにアクセスするタスクがアクセス可能なメモリオブジェクト内としてください。
可変長メモリ・プールの先頭アドレスは,4バイト境界でなければなりません。
可変長メモリ・プール領域は,メモリ・ブロックにアクセスするタスクがアクセス可能なメモリオブジェクト内としてください。
- 最大メモリ・ブロック・サイズ(バイト数)(maxblksz)
可変長メモリ・プールから獲得するメモリ・ブロックの最大サイズを指定します。「9.3.1 可変長メモリ・ブロックのサイズ」も参照してください。
可変長メモリ・プールから獲得するメモリ・ブロックの最大サイズを指定します。「9.3.1 可変長メモリ・ブロックのサイズ」も参照してください。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ #define MPLSZ 1024 /*可変長メモリ・プール領域のサイズ(バイト数)*/ #define MAXBLKSZ 128 /*最大メモリ・ブロック・サイズ(バイト数)*/ #pragma section B BU_SH /*可変長メモリ・プール領域のセクション*/ static UW mpl_area[ MPLSZ/sizeof(UW)]; /* 可変長メモリ・プール領域*/ #pragma section #pragma task Task1 /*備考参照*/ void Task1 ( VP_INT exinf ); /*備考参照*/ void Task1 ( VP_INT exinf ) { ID mplid; /*変数の宣言*/ T_CMPL pk_cmpl = { /*変数の宣言,初期化*/ TA_TFIFO, /*可変長メモリ・プール属性(mplatr)*/ MPLSZ, /*可変長メモリ・プール領域のサイズ(バイト数)(mplsz)*/ (VP)mpl_area, /*可変長メモリ・プール領域の先頭アドレス(mpl)*/ MAXBLKSZ /*最大メモリ・ブロック・サイズ(バイト数)(maxblksz)*/ }; ............ mplid = acre_mpl ( &pk_cmpl ); /*可変長メモリ・プールの生成*/ ............ } |
- del_mpl
パラメータmplidで指定された可変長メモリ・プールを削除します。
対象可変長メモリ・プールでget_mplまたはtget_mplによって待っているタスクがある場合は,そのタスク待ち状態を解除し,get_mplまたはtget_mplの戻り値としてE_DLTを返します。
本サービス・コールは,信頼されたドメインに所属するタスクだけが呼び出せます。
以下に,本サービス・コールの記述例を示します。
パラメータmplidで指定された可変長メモリ・プールを削除します。
対象可変長メモリ・プールでget_mplまたはtget_mplによって待っているタスクがある場合は,そのタスク待ち状態を解除し,get_mplまたはtget_mplの戻り値としてE_DLTを返します。
本サービス・コールは,信頼されたドメインに所属するタスクだけが呼び出せます。
以下に,本サービス・コールの記述例を示します。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ #pragma task Task1 /*備考参照*/ void Task1 ( VP_INT exinf ); /*備考参照*/ void Task1 ( VP_INT exinf ) { ID mplid = 8; /*変数の宣言,初期化*/ ............ ............ del_mpl( mplid ); /*可変長メモリ・プールの削除*/ } |
- get_mpl(待つ)
パラメータmplidで指定された可変長メモリ・プールからパラメータblkszで指定されたサイズの可変長メモリ・ブロックを獲得し,その先頭アドレスをパラメータp_blkで指定された領域に格納します。
ただし,本サービス・コールを発行した際,対象可変長メモリ・プールから可変長メモリ・ブロックを獲得することができなかった(要求サイズ分の連続する空き領域が存在しなかった)場合には,可変長メモリ・ブロックの獲得は行わず,自タスクを対象可変長メモリ・プールの待ちキューにキューイングしたのち,RUNNING状態からWAITING状態(可変長メモリ・ブロック獲得待ち状態)へと遷移させます。
なお,可変長メモリ・ブロック獲得待ち状態の解除は,以下の場合に行われます。
パラメータmplidで指定された可変長メモリ・プールからパラメータblkszで指定されたサイズの可変長メモリ・ブロックを獲得し,その先頭アドレスをパラメータp_blkで指定された領域に格納します。
ただし,本サービス・コールを発行した際,対象可変長メモリ・プールから可変長メモリ・ブロックを獲得することができなかった(要求サイズ分の連続する空き領域が存在しなかった)場合には,可変長メモリ・ブロックの獲得は行わず,自タスクを対象可変長メモリ・プールの待ちキューにキューイングしたのち,RUNNING状態からWAITING状態(可変長メモリ・ブロック獲得待ち状態)へと遷移させます。
なお,可変長メモリ・ブロック獲得待ち状態の解除は,以下の場合に行われます。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ #pragma task Task1 /*備考5参照*/ void Task1 ( VP_INT exinf ); /*備考5参照*/ void Task1 ( VP_INT exinf ) { ER ercd; /*変数の宣言*/ ID mplid = 1; /*変数の宣言,初期化*/ UINT blksz = 256; /*変数の宣言,初期化*/ VP p_blk; /*変数の宣言*/ ............ ............ /*可変長メモリ・ブロックの獲得*/ ercd = get_mpl ( mplid, blksz, &p_blk ); if ( ercd == E_OK ) { ............ /*正常終了処理*/ ............ /*可変長メモリ・ブロックの返却*/ rel_mpl ( mplid, p_blk ); } else if ( ercd == E_RLWAI ) { ............ /*強制終了処理*/ ............ } ............ ............ } |
- システム・コンフィギュレーション・ファイルで静的に生成した場合
獲得するメモリ・ブロックのアライメント数は1です。アライメント数を4とするには,可変長メモリ・プール情報(variable_memorypool[])のメモリ・プール領域に付与するセクション名(mpl_section)に個別のセクション名を指定し,リンク時にそのセクションを4バイト境界アドレスに配置してください。
獲得するメモリ・ブロックのアライメント数は1です。アライメント数を4とするには,可変長メモリ・プール情報(variable_memorypool[])のメモリ・プール領域に付与するセクション名(mpl_section)に個別のセクション名を指定し,リンク時にそのセクションを4バイト境界アドレスに配置してください。
- pget_mpl,ipget_mpl(ポーリング)
パラメータmplidで指定された可変長メモリ・プールからパラメータblkszで指定されたサイズの可変長メモリ・ブロックを獲得し,その先頭アドレスをパラメータp_blkで指定された領域に格納します。
ただし,本サービス・コールを発行した際,対象可変長メモリ・プールから可変長メモリ・ブロックを獲得することができなかった(要求サイズ分の連続する空き領域が存在しなかった)場合には,可変長メモリ・ブロックの獲得は行わず,戻り値としてE_TMOUTを返します。
以下に,本サービス・コールの記述例を示します。
パラメータmplidで指定された可変長メモリ・プールからパラメータblkszで指定されたサイズの可変長メモリ・ブロックを獲得し,その先頭アドレスをパラメータp_blkで指定された領域に格納します。
ただし,本サービス・コールを発行した際,対象可変長メモリ・プールから可変長メモリ・ブロックを獲得することができなかった(要求サイズ分の連続する空き領域が存在しなかった)場合には,可変長メモリ・ブロックの獲得は行わず,戻り値としてE_TMOUTを返します。
以下に,本サービス・コールの記述例を示します。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ #pragma task Task1 /*備考4参照*/ void Task1 ( VP_INT exinf ); /*備考4参照*/ void Task1 ( VP_INT exinf ) { ER ercd; /*変数の宣言*/ ID mplid = 1; /*変数の宣言,初期化*/ UINT blksz = 256; /*変数の宣言,初期化*/ VP p_blk; /*変数の宣言*/ ............ ............ /*可変長メモリ・ブロックの獲得*/ ercd = pget_mpl ( mplid, blksz, &p_blk ); if ( ercd == E_OK ) { ............ /*ポーリング成功処理*/ ............ /*可変長メモリ・ブロックの返却*/ rel_mpl ( mplid, p_blk ); } else if ( ercd == E_TMOUT ) { ............ /*ポーリング失敗処理*/ ............ } ............ ............ } |
- システム・コンフィギュレーション・ファイルで静的に生成した場合
獲得するメモリ・ブロックのアライメント数は1です。アライメント数を4とするには,可変長メモリ・プール情報(variable_memorypool[])のメモリ・プール領域に付与するセクション名(mpl_section)に個別のセクション名を指定し,リンク時にそのセクションを4バイト境界アドレスに配置してください。
獲得するメモリ・ブロックのアライメント数は1です。アライメント数を4とするには,可変長メモリ・プール情報(variable_memorypool[])のメモリ・プール領域に付与するセクション名(mpl_section)に個別のセクション名を指定し,リンク時にそのセクションを4バイト境界アドレスに配置してください。
- tget_mpl(タイムアウト付きで待つ)
パラメータmplidで指定された可変長メモリ・プールからパラメータblkszで指定されたサイズの可変長メモリ・ブロックを獲得し,その先頭アドレスをパラメータp_blkで指定された領域に格納します。
ただし,本サービス・コールを発行した際,対象可変長メモリ・プールから可変長メモリ・ブロックを獲得することができなかった(要求サイズ分の連続する空き領域が存在しなかった)場合には,可変長メモリ・ブロックの獲得は行わず,自タスクを対象可変長メモリ・プールの待ちキューにキューイングしたのち,RUNNING状態からタイムアウト付きのWAITING状態(可変長メモリ・ブロック獲得待ち状態)へと遷移させます。
なお,可変長メモリ・ブロック獲得待ち状態の解除は,以下の場合に行われます。
パラメータmplidで指定された可変長メモリ・プールからパラメータblkszで指定されたサイズの可変長メモリ・ブロックを獲得し,その先頭アドレスをパラメータp_blkで指定された領域に格納します。
ただし,本サービス・コールを発行した際,対象可変長メモリ・プールから可変長メモリ・ブロックを獲得することができなかった(要求サイズ分の連続する空き領域が存在しなかった)場合には,可変長メモリ・ブロックの獲得は行わず,自タスクを対象可変長メモリ・プールの待ちキューにキューイングしたのち,RUNNING状態からタイムアウト付きのWAITING状態(可変長メモリ・ブロック獲得待ち状態)へと遷移させます。
なお,可変長メモリ・ブロック獲得待ち状態の解除は,以下の場合に行われます。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ #pragma task Task1 /*備考6参照*/ void Task1 ( VP_INT exinf ); /*備考6参照*/ void Task1 ( VP_INT exinf ) { ER ercd; /*変数の宣言*/ ID mplid = 1; /*変数の宣言,初期化*/ UINT blksz = 256; /*変数の宣言,初期化*/ VP p_blk; /*変数の宣言*/ TMO tmout = 3600; /*変数の宣言,初期化*/ ............ ............ /*可変長メモリ・ブロックの獲得*/ ercd = tget_mpl ( mplid, blksz, &p_blk, tmout ); if ( ercd == E_OK ) { ............ /*正常終了処理*/ ............ /*可変長メモリ・ブロックの返却*/ rel_mpl ( mplid, p_blk ); } else if ( ercd == E_RLWAI ) { ............ /*強制終了処理*/ ............ } else if ( ercd == E_TMOUT ) { ............ /*タイムアウト処理*/ ............ } ............ ............ } |
- システム・コンフィギュレーション・ファイルで静的に生成した場合
獲得するメモリ・ブロックのアライメント数は1です。アライメント数を4とするには,可変長メモリ・プール情報(variable_memorypool[])のメモリ・プール領域に付与するセクション名(mpl_section)に個別のセクション名を指定し,リンク時にそのセクションを4バイト境界アドレスに配置してください。
獲得するメモリ・ブロックのアライメント数は1です。アライメント数を4とするには,可変長メモリ・プール情報(variable_memorypool[])のメモリ・プール領域に付与するセクション名(mpl_section)に個別のセクション名を指定し,リンク時にそのセクションを4バイト境界アドレスに配置してください。
- rel_mpl
パラメータmplidで指定された可変長メモリ・プールにパラメータblkで指定された可変長メモリ・ブロックを返却します。
可変長メモリ・ブロックを返却したあと,対象可変長メモリ・プールの待ちキューにキューイングされているタスクをキューの先頭から調べていき,待ちタスクが要求するサイズのメモリを割り当てられる場合はメモリを割り当てます。この動作を待ちキューにタスクがなくなるか,メモリが割り当てられなくなるまで繰り返します。これにより,メモリを獲得できたタスクは,待ちキューから外れ,WAITING状態(可変長メモリ・ブロック獲得待ち状態)からREADY状態へ,またはWAITING-SUSPENDED状態からSUSPENDED状態へと遷移します。
以下に,本サービス・コールの記述例を示します。
パラメータmplidで指定された可変長メモリ・プールにパラメータblkで指定された可変長メモリ・ブロックを返却します。
可変長メモリ・ブロックを返却したあと,対象可変長メモリ・プールの待ちキューにキューイングされているタスクをキューの先頭から調べていき,待ちタスクが要求するサイズのメモリを割り当てられる場合はメモリを割り当てます。この動作を待ちキューにタスクがなくなるか,メモリが割り当てられなくなるまで繰り返します。これにより,メモリを獲得できたタスクは,待ちキューから外れ,WAITING状態(可変長メモリ・ブロック獲得待ち状態)からREADY状態へ,またはWAITING-SUSPENDED状態からSUSPENDED状態へと遷移します。
以下に,本サービス・コールの記述例を示します。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ #pragma task Task1 /*備考2参照*/ void Task1 ( VP_INT exinf ); /*備考2参照*/ void Task1 ( VP_INT exinf ) { ER ercd; /*変数の宣言*/ ID mplid = 1; /*変数の宣言,初期化*/ UINT blksz = 256; /*変数の宣言,初期化*/ VP blk; /*変数の宣言*/ ............ ............ /*可変長メモリ・ブロックの獲得*/ ercd = get_mpl ( mplid, blksz, &blk ); if ( ercd == E_OK ) { ............ /*正常終了処理*/ ............ rel_mpl ( mplid, blk ); /*可変長メモリ・ブロックの返却*/ } else if ( ercd == E_RLWAI ) { ............ /*強制終了処理*/ ............ } ............ ............ } |
- ref_mpl,iref_mpl
パラメータmplidで指定された可変長メモリ・プールの可変長メモリ・プール詳細情報(待ちタスクの有無,空き可変長メモリ・ブロックの合計サイズなど)をパラメータpk_rmplで指定された領域に格納します。
以下に,本サービス・コールの記述例を示します。
パラメータmplidで指定された可変長メモリ・プールの可変長メモリ・プール詳細情報(待ちタスクの有無,空き可変長メモリ・ブロックの合計サイズなど)をパラメータpk_rmplで指定された領域に格納します。
以下に,本サービス・コールの記述例を示します。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/ #include "kernel_id.h" /*cfg600pxが出力するヘッダ・ファイルの定義*/ #pragma task Task1 /*備考2参照*/ void Task1 ( VP_INT exinf ); /*備考2参照*/ void Task1 ( VP_INT exinf ) { ID mplid = 1; /*変数の宣言,初期化*/ T_RMPL pk_rmpl; /*データ構造体の宣言*/ ID wtskid; /*変数の宣言*/ SIZE fmplsz; /*変数の宣言*/ UINT fblksz; /*変数の宣言*/ ............ ............ ref_mpl ( mplid, &pk_rmpl ); /*可変定長メモリ・プール詳細情報の参照*/ wtskid = pk_rmpl.wtskid; /*待ちタスクの有無の獲得*/ fmplsz = pk_rmpl.fmplsz; /*空き領域の合計サイズの獲得*/ fblksz = pk_rmpl.fblksz; /*獲得可能なメモリ・ブロックの最大サイズの獲得*/ ............ ............ } |