| 1 |
/* ------------------------------------------------------------------------ */ |
| 2 |
/* Hyper Operating System V4 μITRON4.0仕様 Real-Time OS */ |
| 3 |
/* ITRONカーネル 可変長メモリプール */ |
| 4 |
/* */ |
| 5 |
/* Copyright (C) 1998-2003 by Project HOS */ |
| 6 |
/* http://sourceforge.jp/projects/hos/ */ |
| 7 |
/* ------------------------------------------------------------------------ */ |
| 8 |
|
| 9 |
|
| 10 |
#include "knl_mpl.h" |
| 11 |
#include "knl_mem.h" |
| 12 |
|
| 13 |
|
| 14 |
/* 可変長メモリプール コントロールブロック(動的生成用) */ |
| 15 |
typedef struct t_kernel_mplcb |
| 16 |
{ |
| 17 |
T_KERNEL_MPLCB_RAM mplcb_ram; /* 可変長メモリプール コントロールブロック(RAM部) */ |
| 18 |
T_KERNEL_MPLCB_ROM mplcb_rom; /* 可変長メモリプール コントロールブロック(ROM部) */ |
| 19 |
} T_KERNEL_MPLCB; |
| 20 |
|
| 21 |
/* 可変長メモリプール コントロールブロック(動的生成、カーネルメモリ用) */ |
| 22 |
typedef struct t_kernel_mplcb_with_blk |
| 23 |
{ |
| 24 |
T_KERNEL_MPLCB_RAM mplcb_ram; /* 可変長メモリプール コントロールブロック(RAM部) */ |
| 25 |
T_KERNEL_MPLCB_ROM mplcb_rom; /* 可変長メモリプール コントロールブロック(ROM部) */ |
| 26 |
VP blk[1]; /* メモリブロックダミー */ |
| 27 |
} T_KERNEL_MPLCB_WBLK; |
| 28 |
|
| 29 |
|
| 30 |
|
| 31 |
/* 可変長メモリプールの生成(カーネル内部関数) */ |
| 32 |
ER kernel_cre_mpl( |
| 33 |
ID mplid, /* 生成対象の可変長メモリプールのID番号 */ |
| 34 |
const T_CMPL *pk_cmpl) /* 可変長メモリプール生成情報を入れたパケットへのポインタ */ |
| 35 |
{ |
| 36 |
T_KERNEL_MPLCB *mplcb; |
| 37 |
T_KERNEL_MPLCB_RAM *mplcb_ram; |
| 38 |
T_KERNEL_MPLCB_ROM *mplcb_rom; |
| 39 |
VP mpl; |
| 40 |
|
| 41 |
/* パラメーターチェック */ |
| 42 |
#ifdef HOS_ERCHK_E_RSATR |
| 43 |
if ( pk_cmpl->mplatr & ~(TA_TFIFO | TA_TPRI) ) |
| 44 |
{ |
| 45 |
return E_RSATR; |
| 46 |
} |
| 47 |
#endif |
| 48 |
|
| 49 |
/* パラメータチェック */ |
| 50 |
#ifdef HOS_ERCHK_E_PAR |
| 51 |
if ( pk_cmpl->mplsz == 0 ) |
| 52 |
{ |
| 53 |
return E_PAR; /* パラメータ不正 */ |
| 54 |
} |
| 55 |
#endif |
| 56 |
|
| 57 |
/* 可変長メモリプール用メモリの確保 */ |
| 58 |
mplcb = (T_KERNEL_MPLCB *)kernel_alc_mem( |
| 59 |
pk_cmpl->mpl != NULL ? sizeof(T_KERNEL_MPLCB) : |
| 60 |
sizeof(T_KERNEL_MPLCB_WBLK) - sizeof(VP) |
| 61 |
+ pk_cmpl->mplsz |
| 62 |
); |
| 63 |
if ( mplcb == NULL ) |
| 64 |
{ |
| 65 |
return E_NOMEM; /* メモリ不足 */ |
| 66 |
} |
| 67 |
|
| 68 |
/* メモリプール先頭番地セット */ |
| 69 |
if ( pk_cmpl->mpl == NULL ) |
| 70 |
{ |
| 71 |
mpl = ((T_KERNEL_MPLCB_WBLK *)mplcb)->blk; |
| 72 |
} |
| 73 |
else |
| 74 |
{ |
| 75 |
mpl = pk_cmpl->mpl; |
| 76 |
} |
| 77 |
|
| 78 |
/* 可変長メモリプールの設定 */ |
| 79 |
mplcb_ram = &mplcb->mplcb_ram; |
| 80 |
mplcb_rom = &mplcb->mplcb_rom; |
| 81 |
mknl_ini_que(&mplcb_ram->que); |
| 82 |
mplcb_ram->mplcb_rom = mplcb_rom; |
| 83 |
mplcb_rom->mplatr = pk_cmpl->mplatr; |
| 84 |
mplcb_rom->mplsz = pk_cmpl->mplsz; |
| 85 |
mplcb_rom->mpl = mpl; |
| 86 |
|
| 87 |
/* ヒープ生成 */ |
| 88 |
kernel_cre_hep(&mplcb_ram->hep, mplcb_rom->mpl, mplcb_rom->mplsz); |
| 89 |
|
| 90 |
/* 管理テーブルへ追加 */ |
| 91 |
KERNEL_MPLID_TO_MPLCB_RAM(mplid) = mplcb_ram; |
| 92 |
|
| 93 |
return E_OK; |
| 94 |
} |
| 95 |
|
| 96 |
|
| 97 |
/* ------------------------------------------------------------------------ */ |
| 98 |
/* Copyright (C) 1998-2003 by Project HOS */ |
| 99 |
/* ------------------------------------------------------------------------ */ |