7.2 固定長メモリ・プール
RI600V4では,処理プログラムから動的なメモリ操作要求が行われた際に利用するメモリ領域として“固定長メモリ・プール”を提供しています。
なお,固定長メモリ・プールに対する動的なメモリ操作は,固定サイズの固定長メモリ・ブロックを単位として行われます。
RI600V4では,固定長メモリ・プールの静的な生成のみサポートしています。処理プログラムからサービス・コールを発行して動的に生成することはできません。
固定長メモリ・プールの静的生成とは,システム・コンフィギュレーション・ファイルで静的API“memorypool[]”を使用して固定長メモリ・プールを定義することをいいます。
固定長メモリ・ブロックの獲得は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
RI600V4では,固定長メモリ・ブロックを獲得する際,メモリ・クリア処理を行っていません。したがって,獲得された固定長メモリ・ブロックの内容は不定となります。
-
get_mpf(待つ)
パラメータ
mpfidで指定された固定長メモリ・プールから固定長メモリ・ブロックを獲得し,その先頭アドレスをパラメータ
p_blkで指定された領域に格納します。
ただし,本サービス・コールを発行した際,対象固定長メモリ・プールから固定長メモリ・ブロックを獲得することができなかった(空き固定長メモリ・ブロックが存在しなかった)場合には,固定長メモリ・ブロックの獲得は行わず,自タスクを対象固定長メモリ・プールの待ちキューにキューイングしたのち,RUNNING状態からWAITING状態(固定長メモリ・ブロック獲得待ち状態)へと遷移させます。
なお,固定長メモリ・ブロック獲得待ち状態の解除は,以下の場合に行われます。
|
|
rel_mpfの発行により,対象固定長メモリ・プールに固定長メモリ・ブロックが返却された。
|
|
irel_mpfの発行により,対象固定長メモリ・プールに固定長メモリ・ブロックが返却された。
|
|
|
|
|
|
|
|
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/
#include "kernel_id.h" /*cfg600が出力するヘッダ・ファイルの定義*/
void task ( VP_INT exinf )
{
ER ercd; /*変数の宣言*/
ID mpfid = 1; /*変数の宣言,初期化*/
VP p_blk; /*変数の宣言*/
............
............
/*固定長メモリ・ブロックの獲得*/
ercd = get_mpf ( mpfid, &p_blk );
if ( ercd == E_OK ) {
............ /*正常終了処理*/
............
/*固定長メモリ・ブロックの返却*/
rel_mpf ( mpfid, p_blk );
} else if ( ercd == E_RLWAI ) {
............ /*強制終了処理*/
............
}
............
............
}
|
備考1 自タスクを対象固定長メモリ・プールの待ちキューにキューイングする際のキューイング方式は,コンフィギュレーション時に定義された順(FIFO順または現在優先度順)に行われます。
備考2 獲得したメモリ・ブロックの内容は不定です。
備考3 メモリ・ブロックのアライメント数は1です。これより大きいアライメント数のメモリ・ブロックを獲得したい場合は,以下を守ってください。
-
pget_mpf,
ipget_mpf(ポーリング)
パラメータ
mpfidで指定された固定長メモリ・プールから固定長メモリ・ブロックを獲得し,その先頭アドレスをパラメータ
p_blkで指定された領域に格納します。
ただし,本サービス・コールを発行した際,対象固定長メモリ・プールから固定長メモリ・ブロックを獲得することができなかった(空き固定長メモリ・ブロックが存在しなかった)場合には,固定長メモリ・ブロックの獲得は行わず,戻り値としてE_TMOUTを返します。
以下に,本サービス・コールの記述例を示します。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/
#include "kernel_id.h" /*cfg600が出力するヘッダ・ファイルの定義*/
void task ( VP_INT exinf )
{
ER ercd; /*変数の宣言*/
ID mpfid = 1; /*変数の宣言,初期化*/
VP p_blk; /*変数の宣言*/
............
............
/*固定長メモリ・ブロックの獲得*/
ercd = pget_mpf ( mpfid, &p_blk );
if ( ercd == E_OK ) {
............ /*ポーリング成功処理*/
............
/*固定長メモリ・ブロックの返却*/
rel_mpf ( mpfid, p_blk );
} else if ( ercd == E_TMOUT ) {
............ /*ポーリング失敗処理*/
............
}
............
............
}
|
備考1 獲得したメモリ・ブロックの内容は不定です。
備考2 メモリ・ブロックのアライメント数は1です。これより大きいアライメント数のメモリ・ブロックを獲得したい場合は,以下を守ってください。
-
tget_mpf(タイムアウト付きで待つ)
パラメータ
mpfidで指定された固定長メモリ・プールから固定長メモリ・ブロックを獲得し,その先頭アドレスをパラメータ
p_blkで指定された領域に格納します。
ただし,本サービス・コールを発行した際,対象固定長メモリ・プールから固定長メモリ・ブロックを獲得することができなかった(空き固定長メモリ・ブロックが存在しなかった)場合には,固定長メモリ・ブロックの獲得は行わず,自タスクを対象固定長メモリ・プールの待ちキューにキューイングしたのち,RUNNING状態からタイムアウト付きのWAITING状態(固定長メモリ・ブロック獲得待ち状態)へと遷移させます。
なお,固定長メモリ・ブロック獲得待ち状態の解除は,以下の場合に行われます。
|
|
rel_mpfの発行により,対象固定長メモリ・プールに固定長メモリ・ブロックが返却された。
|
|
irel_mpfの発行により,対象固定長メモリ・プールに固定長メモリ・ブロックが返却された。
|
|
|
|
|
|
|
|
パラメータ tmoutで指定された待ち時間が経過した。
|
|
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/
#include "kernel_id.h" /*cfg600が出力するヘッダ・ファイルの定義*/
void task ( VP_INT exinf )
{
ER ercd; /*変数の宣言*/
ID mpfid = 1; /*変数の宣言,初期化*/
VP p_blk; /*変数の宣言*/
TMO tmout = 3600; /*変数の宣言,初期化*/
............
............
/*固定長メモリ・ブロックの獲得*/
ercd = tget_mpf ( mpfid, &p_blk, tmout );
if ( ercd == E_OK ) {
............ /*正常終了処理*/
............
/*固定長メモリ・ブロックの返却*/
rel_mpf ( mpfid, p_blk );
} else if ( ercd == E_RLWAI ) {
............ /*強制終了処理*/
............
} else if ( ercd == E_TMOUT ) {
............ /*タイムアウト処理*/
............
}
............
............
}
|
備考1 自タスクを対象固定長メモリ・プールの待ちキューにキューイングする際のキューイング方式は,コンフィギュレーション時に定義された順(FIFO順または現在優先度順)に行われます。
備考2 獲得したメモリ・ブロックの内容は不定です。
備考3 メモリ・ブロックのアライメント数は1です。これより大きいアライメント数のメモリ・ブロックを獲得したい場合は,以下を守ってください。
固定長メモリ・ブロックの返却は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
-
rel_mpf,
irel_mpf
パラメータ
mpfidで指定された固定長メモリ・プールにパラメータ
blkで指定された固定長メモリ・ブロックを返却します。
ただし,本サービス・コールを発行した際,対象固定長メモリ・プールの待ちキューにタスクがキューイングされていた場合には,固定長メモリ・ブロックの返却は行わず,該当タスク(待ちキューの先頭タスク)に固定長メモリ・ブロックを渡します。これにより,該当タスクは,待ちキューから外れ,WAITING状態(固定長メモリ・ブロック獲得待ち状態)からREADY状態へ,またはWAITING-SUSPENDED状態からSUSPENDED状態へと遷移します。
以下に,本サービス・コールの記述例を示します。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/
#include "kernel_id.h" /*cfg600が出力するヘッダ・ファイルの定義*/
void task ( VP_INT exinf )
{
ER ercd; /*変数の宣言*/
ID mpfid = 1; /*変数の宣言,初期化*/
VP blk; /*変数の宣言*/
............
............
ercd = get_mpf ( mpfid, &blk ); /*固定長メモリ・ブロックの獲得*/
if ( ercd == E_OK ) {
............ /*正常終了処理*/
............
rel_mpf ( mpfid, blk ); /*固定長メモリ・ブロックの返却*/
} else if ( ercd == E_RLWAI ) {
............ /*強制終了処理*/
............
}
............
............
}
|
固定長メモリ・プール詳細情報の参照は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。
-
ref_mpf,
iref_mpf
パラメータ
mpfidで指定された固定長メモリ・プールの固定長メモリ・プール詳細情報(待ちタスクの有無,空き固定長メモリ・ブロックの総数など)をパラメータ
pk_rmpfで指定された領域に格納します。
以下に,本サービス・コールの記述例を示します。
#include "kernel.h" /*標準ヘッダ・ファイルの定義*/
#include "kernel_id.h" /*cfg600が出力するヘッダ・ファイルの定義*/
void task ( VP_INT exinf )
{
ID mpfid = 1; /*変数の宣言,初期化*/
T_RMPF pk_rmpf; /*データ構造体の宣言*/
ID wtskid; /*変数の宣言*/
UINT fblkcnt; /*変数の宣言*/
............
............
ref_mpf ( mpfid, &pk_rmpf ); /*固定長メモリ・プール詳細情報の参照*/
wtskid = pk_rmpf.wtskid; /*待ちタスクの有無の獲得*/
fblkcnt = pk_rmpf.fblkcnt; /*空き固定長メモリ・ブロックの総数の獲得*/
............
............
}
|