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】