AG903ライブラリリファレンス
内容インデックスホーム
前へ上へ次へ
AG903_OSWprGetMplAlign 関数

可変長メモリブロックの獲得(アライン指定)

Syntax
C++
int32_t AG903_OSWprGetMplAlign(int32_t mplid, uint32_t align, uint32_t blksz, void** p_blk);
引数 
説明 
int32_t mplid 
[in] メモリプールID番号 
uint32_t align 
[in] アラインサイズ[byte] (2の累乗で4以上) 
uint32_t blksz 
[in] 獲得するブロックサイズ[byte] 
void** p_blk 
[out] 獲得したメモリブロックの先頭番地 

可変長メモリブロックの獲得結果

返値の詳細 
説明 
正常終了 
-AG903_EINVAL 
引数異常 
-AG903_EPERM 
不正使用(割り込みからのCALLなど) 
-AG903_EFAULT 
処理失敗(メモリ不足) 
-AG903_ECANCELED 
待ち強制解除等 

指定したアラインで可変長メモリブロックを獲得します。

エラーとなった場合p_blkの値は不定です。エラーはエラーコードで確認してください。 

可変長メモリブロックの確保では実際に内部的に確保されるメモリサイズは 管理等の領域を確保するために要求したサイズよりも少し大きくなります。 

ポーティング例を以下に示します。 

 

  • ベースとしてuITRON4.0のget_mplを使用します。 

  • 実際に確保するメモリサイズはアプリが要求したサイズと次の領域の合計になります。 

  • 1 アライン調節のためのメモリ領域 

  • 2 アライン調節済メモリのアドレスから元々get_mplが返したアドレスを知るための AG903_OSWBlkInfo構造体を埋めておくための領域 

  • アプリへ返すアライン調節済アドレスは、get_mplで確保したアドレスに上記1と2のサイズを加え そこから要求されたアラインになるように少し戻ったアドレスになります。 

  • AG903_OSWBlkInfoはさらにそのアドレスから構造体のサイズだけ戻ったアドレスに記憶されます。 

1: int32_t AG903_OSWprGetMplAlign(int32_t mplid, uint32_t align, uint32_t blksz, void** p_blk) 2: { 3: ER ercd; 4: VP getaddr; 5: AG903_OSWBlkInf* blkinf; 6: int32_t retval; 7: uint32_t extsize; 8: void *blk; 9: int bit_count; 10: int ii; 11: 12: if( (NULL == p_blk) || 13: (0 == blksz) ) { 14: return -AG903_EINVAL; 15: } 16: 17: if (align < 4) { 18: return -AG903_EINVAL; 19: } 20: 21: bit_count = 0; 22: for (ii = 0; ii < (int)sizeof(align)*8; ii++) { 23: if (align>>ii & 0x1) { 24: bit_count += 1; 25: } 26: } 27: if (bit_count != 1) { 28: return -AG903_EINVAL; 29: } 30: 31: extsize = OSWBLKINF_SIZE + align-1; 32: 33: ercd = pget_mpl((ID)mplid, (UINT)(blksz+extsize), (VP*)&getaddr); 34: OSW_SetLastErcd(ercd); 35: retval = OSW_ChgErcd(ercd); 36: 37: if(AG903_ENONE == retval) { 38: blk = (void *)(((uintptr_t)getaddr + extsize) & ~(align-1)); 39: *p_blk = blk; 40: 41: blkinf = (AG903_OSWBlkInf*)((uintptr_t)blk - OSWBLKINF_SIZE); 42: blkinf->topaddr = getaddr; 43: } else { 44: *p_blk = NULL; 45: } 46: 47: return retval; 48: }
Copyright (c) 2017-2025 Axell Corporation. All rights reserved.