|
|
mempfix.c説明を見る。00001 /* 00002 * TOPPERS/JSP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Just Standard Profile Kernel 00005 * 00006 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory 00007 * Toyohashi Univ. of Technology, JAPAN 00008 * Copyright (C) 2005 by Embedded and Real-Time Systems Laboratory 00009 * Graduate School of Information Science, Nagoya Univ., JAPAN 00010 * 00011 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 00012 * によって公表されている GNU General Public License の Version 2 に記 00013 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 00014 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 00015 * 利用と呼ぶ)することを無償で許諾する. 00016 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00017 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00018 * スコード中に含まれていること. 00019 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00020 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00021 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00022 * の無保証規定を掲載すること. 00023 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00024 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00025 * と. 00026 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00027 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00028 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00029 * 報告すること. 00030 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00031 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00032 * 00033 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00034 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 00035 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 00036 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 00037 * 00038 * @(#) $Id: mempfix.c,v 1.12 2005/11/12 14:55:23 hiro Exp $ 00039 */ 00040 00041 /* 00042 * 固定長メモリプール機能 00043 */ 00044 00045 #include "jsp_kernel.h" 00046 #include "check.h" 00047 #include "task.h" 00048 #include "wait.h" 00049 #include "mempfix.h" 00050 00051 /* 00052 * 固定長メモリプールIDの最大値(kernel_cfg.c) 00053 */ 00054 extern const ID tmax_mpfid; 00055 00056 /* 00057 * 固定長メモリプール初期化ブロックのエリア(kernel_cfg.c) 00058 */ 00059 extern const MPFINIB mpfinib_table[]; 00060 00061 /* 00062 * 固定長メモリプール管理ブロックのエリア(kernel_cfg.c) 00063 */ 00064 extern MPFCB mpfcb_table[]; 00065 00066 /* 00067 * 固定長メモリプールの数 00068 */ 00069 #define TNUM_MPF ((UINT)(tmax_mpfid - TMIN_MPFID + 1)) 00070 00071 /* 00072 * 固定長メモリプールIDから固定長メモリプール管理ブロックを取り出すた 00073 * めのマクロ 00074 */ 00075 #define INDEX_MPF(mpfid) ((UINT)((mpfid) - TMIN_MPFID)) 00076 #define get_mpfcb(mpfid) (&(mpfcb_table[INDEX_MPF(mpfid)])) 00077 00078 /* 00079 * 固定長メモリプール待ち情報ブロックの定義 00080 */ 00081 typedef struct fixed_memorypool_waiting_information { 00082 WINFO winfo; /* 標準の待ち情報ブロック */ 00083 WOBJCB *wobjcb; /* 待ちオブジェクトの管理ブロック */ 00084 VP blk; /* 獲得したメモリブロック */ 00085 } WINFO_MPF; 00086 00087 /* 00088 * 固定長メモリプール機能の初期化 00089 */ 00090 #ifdef __mpfini 00091 00092 void 00093 mempfix_initialize() 00094 { 00095 UINT i; 00096 MPFCB *mpfcb; 00097 00098 for (mpfcb = mpfcb_table, i = 0; i < TNUM_MPF; mpfcb++, i++) { 00099 queue_initialize(&(mpfcb->wait_queue)); 00100 mpfcb->mpfinib = &(mpfinib_table[i]); 00101 mpfcb->unused = mpfcb->mpfinib->mpf; 00102 mpfcb->freelist = NULL; 00103 } 00104 } 00105 00106 #endif /* __mpfini */ 00107 00108 /* 00109 * 固定長メモリプールからブロックを獲得 00110 */ 00111 #ifdef __mpfget 00112 00113 BOOL 00114 mempfix_get_block(MPFCB *mpfcb, VP *p_blk) 00115 { 00116 FREEL *free; 00117 00118 if (mpfcb->freelist != NULL) { 00119 free = mpfcb->freelist; 00120 mpfcb->freelist = free->next; 00121 *p_blk = (VP) free; 00122 return(TRUE); 00123 } 00124 else if (mpfcb->unused < mpfcb->mpfinib->limit) { 00125 *p_blk = mpfcb->unused; 00126 mpfcb->unused = (VP)((char *)(mpfcb->unused) 00127 + mpfcb->mpfinib->blksz); 00128 return(TRUE); 00129 } 00130 return(FALSE); 00131 } 00132 00133 #endif /* __mpfget */ 00134 00135 /* 00136 * 固定長メモリブロックの獲得 00137 */ 00138 #ifdef __get_mpf 00139 00140 SYSCALL ER 00141 get_mpf(ID mpfid, VP *p_blk) 00142 { 00143 MPFCB *mpfcb; 00144 WINFO_MPF winfo; 00145 ER ercd; 00146 00147 LOG_GET_MPF_ENTER(mpfid, p_blk); 00148 CHECK_DISPATCH(); 00149 CHECK_MPFID(mpfid); 00150 mpfcb = get_mpfcb(mpfid); 00151 00152 t_lock_cpu(); 00153 if (mempfix_get_block(mpfcb, p_blk)) { 00154 ercd = E_OK; 00155 } 00156 else { 00157 wobj_make_wait((WOBJCB *) mpfcb, (WINFO_WOBJ *) &winfo); 00158 dispatch(); 00159 ercd = winfo.winfo.wercd; 00160 if (ercd == E_OK) { 00161 *p_blk = winfo.blk; 00162 } 00163 } 00164 t_unlock_cpu(); 00165 00166 exit: 00167 LOG_GET_MPF_LEAVE(ercd, *p_blk); 00168 return(ercd); 00169 } 00170 00171 #endif /* __get_mpf */ 00172 00173 /* 00174 * 固定長メモリブロックの獲得(ポーリング) 00175 */ 00176 #ifdef __pget_mpf 00177 00178 SYSCALL ER 00179 pget_mpf(ID mpfid, VP *p_blk) 00180 { 00181 MPFCB *mpfcb; 00182 ER ercd; 00183 00184 LOG_PGET_MPF_ENTER(mpfid, p_blk); 00185 CHECK_TSKCTX_UNL(); 00186 CHECK_MPFID(mpfid); 00187 mpfcb = get_mpfcb(mpfid); 00188 00189 t_lock_cpu(); 00190 if (mempfix_get_block(mpfcb, p_blk)) { 00191 ercd = E_OK; 00192 } 00193 else { 00194 ercd = E_TMOUT; 00195 } 00196 t_unlock_cpu(); 00197 00198 exit: 00199 LOG_PGET_MPF_LEAVE(ercd, *p_blk); 00200 return(ercd); 00201 } 00202 00203 #endif /* __pget_mpf */ 00204 00205 /* 00206 * 固定長メモリブロックの獲得(タイムアウトあり) 00207 */ 00208 #ifdef __tget_mpf 00209 00210 SYSCALL ER 00211 tget_mpf(ID mpfid, VP *p_blk, TMO tmout) 00212 { 00213 MPFCB *mpfcb; 00214 WINFO_MPF winfo; 00215 TMEVTB tmevtb; 00216 ER ercd; 00217 00218 LOG_TGET_MPF_ENTER(mpfid, p_blk, tmout); 00219 CHECK_DISPATCH(); 00220 CHECK_MPFID(mpfid); 00221 CHECK_TMOUT(tmout); 00222 mpfcb = get_mpfcb(mpfid); 00223 00224 t_lock_cpu(); 00225 if (mempfix_get_block(mpfcb, p_blk)) { 00226 ercd = E_OK; 00227 } 00228 else if (tmout == TMO_POL) { 00229 ercd = E_TMOUT; 00230 } 00231 else { 00232 wobj_make_wait_tmout((WOBJCB *) mpfcb, (WINFO_WOBJ *) &winfo, 00233 &tmevtb, tmout); 00234 dispatch(); 00235 ercd = winfo.winfo.wercd; 00236 if (ercd == E_OK) { 00237 *p_blk = winfo.blk; 00238 } 00239 } 00240 t_unlock_cpu(); 00241 00242 exit: 00243 LOG_TGET_MPF_LEAVE(ercd, *p_blk); 00244 return(ercd); 00245 } 00246 00247 #endif /* __tget_mpf */ 00248 00249 /* 00250 * 固定長メモリブロックの返却 00251 */ 00252 #ifdef __rel_mpf 00253 00254 SYSCALL ER 00255 rel_mpf(ID mpfid, VP blk) 00256 { 00257 MPFCB *mpfcb; 00258 TCB *tcb; 00259 FREEL *free; 00260 ER ercd; 00261 00262 LOG_REL_MPF_ENTER(mpfid, blk); 00263 CHECK_TSKCTX_UNL(); 00264 CHECK_MPFID(mpfid); 00265 mpfcb = get_mpfcb(mpfid); 00266 CHECK_PAR(mpfcb->mpfinib->mpf <= blk 00267 && blk < mpfcb->mpfinib->limit 00268 && ((char *)(blk) - (char *)(mpfcb->mpfinib->mpf)) 00269 % mpfcb->mpfinib->blksz == 0); 00270 00271 t_lock_cpu(); 00272 if (!(queue_empty(&(mpfcb->wait_queue)))) { 00273 tcb = (TCB *) queue_delete_next(&(mpfcb->wait_queue)); 00274 ((WINFO_MPF *)(tcb->winfo))->blk = blk; 00275 if (wait_complete(tcb)) { 00276 dispatch(); 00277 } 00278 ercd = E_OK; 00279 } 00280 else { 00281 free = (FREEL *) blk; 00282 free->next = mpfcb->freelist; 00283 mpfcb->freelist = free; 00284 ercd = E_OK; 00285 } 00286 t_unlock_cpu(); 00287 00288 exit: 00289 LOG_REL_MPF_LEAVE(ercd); 00290 return(ercd); 00291 } 00292 00293 #endif /* __rel_mpf */ 00294 Copyright © 2006 by TAKAGI Nobuhisa. Copyright © 2006 by Kijineko Inc.. このページは Mon Dec 18 17:18:40 2006 に Doxygen によって生成されました。 データ入力からプログラム開発まで!様々なスキルを持ったメンバーが登録しています【@SOHO】 |