7.2 固定長メモリ・プール
RI600V4では,処理プログラムから動的なメモリ操作要求が行われた際に利用するメモリ領域として“固定長メモリ・プール”を提供しています。

なお,固定長メモリ・プールに対する動的なメモリ操作は,固定サイズの固定長メモリ・ブロックを単位として行われます。

7.2.1 固定長メモリ・プールの生成

RI600V4では,固定長メモリ・プールの静的な生成のみサポートしています。処理プログラムからサービス・コールを発行して動的に生成することはできません。

固定長メモリ・プールの静的生成とは,システム・コンフィギュレーション・ファイルで静的API“memorypool[]”を使用して固定長メモリ・プールを定義することをいいます。

静的API“memorypool[]”の詳細は,「19.14 固定長メモリ・プール情報(memorypool[])」を参照してください。

7.2.2 固定長メモリ・ブロックの獲得

固定長メモリ・ブロックの獲得は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。

RI600V4では,固定長メモリ・ブロックを獲得する際,メモリ・クリア処理を行っていません。したがって,獲得された固定長メモリ・ブロックの内容は不定となります。

- get_mpf(待つ)

- pget_mpfipget_mpf(ポーリング)

- tget_mpf(タイムアウト付きで待つ)

- get_mpf(待つ)
パラメータmpfidで指定された固定長メモリ・プールから固定長メモリ・ブロックを獲得し,その先頭アドレスをパラメータp_blkで指定された領域に格納します。
ただし,本サービス・コールを発行した際,対象固定長メモリ・プールから固定長メモリ・ブロックを獲得することができなかった(空き固定長メモリ・ブロックが存在しなかった)場合には,固定長メモリ・ブロックの獲得は行わず,自タスクを対象固定長メモリ・プールの待ちキューにキューイングしたのち,RUNNING状態からWAITING状態(固定長メモリ・ブロック獲得待ち状態)へと遷移させます。
なお,固定長メモリ・ブロック獲得待ち状態の解除は,以下の場合に行われます。




 
固定長メモリ・ブロック獲得待ち状態の解除操作

戻り値

rel_mpfの発行により,対象固定長メモリ・プールに固定長メモリ・ブロックが返却された。

E_OK

irel_mpfの発行により,対象固定長メモリ・プールに固定長メモリ・ブロックが返却された。

E_OK

rel_waiの発行により,待ち状態を強制的に解除された。

E_RLWAI

irel_waiの発行により,待ち状態を強制的に解除された。

E_RLWAI

vrst_mpfの発行により,対象固定長メモリ・プールがリセットされた。

EV_RST



以下に,本サービス・コールの記述例を示します。

 #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です。これより大きいアライメント数のメモリ・ブロックを獲得したい場合は,以下を守ってください。

- 固定長メモリ・プール情報(memorypool[])固定長メモリ・ブロック・サイズ(siz_block)を,目的のアライメント数の倍数とする。

- 固定長メモリ・プール情報(memorypool[])メモリ・プール領域に付与するセクション名(section)を個別のセクションとし,リンク時にそのセクションを目的のアライメント数のアドレスに配置する。

- pget_mpfipget_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です。これより大きいアライメント数のメモリ・ブロックを獲得したい場合は,以下を守ってください。

- 固定長メモリ・プール情報(memorypool[])固定長メモリ・ブロック・サイズ(siz_block)を,目的のアライメント数の倍数とする。

- 固定長メモリ・プール情報(memorypool[])メモリ・プール領域に付与するセクション名(section)を個別のセクションとし,リンク時にそのセクションを目的のアライメント数のアドレスに配置する。

- tget_mpf(タイムアウト付きで待つ)
パラメータmpfidで指定された固定長メモリ・プールから固定長メモリ・ブロックを獲得し,その先頭アドレスをパラメータp_blkで指定された領域に格納します。
ただし,本サービス・コールを発行した際,対象固定長メモリ・プールから固定長メモリ・ブロックを獲得することができなかった(空き固定長メモリ・ブロックが存在しなかった)場合には,固定長メモリ・ブロックの獲得は行わず,自タスクを対象固定長メモリ・プールの待ちキューにキューイングしたのち,RUNNING状態からタイムアウト付きのWAITING状態(固定長メモリ・ブロック獲得待ち状態)へと遷移させます。
なお,固定長メモリ・ブロック獲得待ち状態の解除は,以下の場合に行われます。




 
固定長メモリ・ブロック獲得待ち状態の解除操作

戻り値

rel_mpfの発行により,対象固定長メモリ・プールに固定長メモリ・ブロックが返却された。

E_OK

irel_mpfの発行により,対象固定長メモリ・プールに固定長メモリ・ブロックが返却された。

E_OK

rel_waiの発行により,待ち状態を強制的に解除された。

E_RLWAI

irel_waiの発行により,待ち状態を強制的に解除された。

E_RLWAI

vrst_mpfの発行により,対象固定長メモリ・プールがリセットされた。

EV_RST

パラメータtmoutで指定された待ち時間が経過した。

E_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です。これより大きいアライメント数のメモリ・ブロックを獲得したい場合は,以下を守ってください。

- 固定長メモリ・プール情報(memorypool[])固定長メモリ・ブロック・サイズ(siz_block)を,目的のアライメント数の倍数とする。

- 固定長メモリ・プール情報(memorypool[])メモリ・プール領域に付与するセクション名(section)を個別のセクションとし,リンク時にそのセクションを目的のアライメント数のアドレスに配置する。

備考4 待ち時間tmoutTMO_FEVRが指定された際には“get_mpfと同等の処理”を,TMO_POLが指定された際には“pget_mpfと同等の処理”を実行します。

7.2.3 固定長メモリ・ブロックの返却

固定長メモリ・ブロックの返却は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。

- rel_mpfirel_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 ) {
                 ............            /*強制終了処理*/
                 ............
         }
 
         ............
         ............
 }


7.2.4 固定長メモリ・プール詳細情報の参照

固定長メモリ・プール詳細情報の参照は,以下に示したサービス・コールを処理プログラムから発行することにより実現されます。

- ref_mpfiref_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;      /*空き固定長メモリ・ブロックの総数の獲得*/
 
         ............
         ............
 }


備考 固定長メモリ・プール詳細情報T_RMPFについての詳細は,「【 固定長メモリ・プール詳細情報T_RMPFの構造 】」を参照してください。