|
|
cyclic.c説明を見る。00001 /* 00002 * TOPPERS/FDMP Kernel 00003 * Toyohashi Open Platform for Embedded Real-Time Systems/ 00004 * Function Distributed Multiprocessor Kernel 00005 * 00006 * Copyright (C) 2000-2004 by Embedded and Real-Time Systems Laboratory 00007 * Toyohashi Univ. of Technology, JAPAN 00008 * Copyright (C) 2005-2006 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: cyclic.c,v 1.4 2006/03/14 04:37:54 honda Exp $ 00039 */ 00040 00048 #include "fdmp_kernel.h" 00049 #include "check.h" 00050 #include "cyclic.h" 00051 00052 00056 extern const ID tmax_cycid; 00057 00061 extern const CYCINIB cycinib_table[]; 00062 00066 extern CYCCB cyccb_table[]; 00067 00071 #define TNUM_CYC ((UINT)(tmax_cycid - TMIN_ID + 1)) 00072 00073 /* 00074 * 周期ハンドラIDから周期ハンドラ管理ブロックを取り出すためのマクロ 00075 */ 00076 #define INDEX_CYC(cycid) ((UINT)((cycid) - TMIN_ID)) 00077 #define get_cyccb(ccb, cycid) (&(((CYCCB *)(ccb->cyc.cb_table))[INDEX_CYC(cycid)])) 00078 00082 typedef void (*CYCHDR)(VP_INT exinf); 00083 00087 #ifdef __cycini 00088 00089 void 00090 cyclic_initialize() 00091 { 00092 my_local_exccb->p_call_cychdr = call_cychdr; 00093 00094 my_local_exccb->cyc.cb_table = &cyccb_table[0]; 00095 my_local_exccb->cyc.max_id = tmax_cycid; 00096 } 00097 00098 #endif /* __cycini */ 00099 00105 #ifdef __cycinista 00106 00107 void 00108 cyclic_init_sta(void) 00109 { 00110 UINT i; 00111 CYCCB *cyccb; 00112 00113 for (cyccb = cyccb_table, i = 0; i < TNUM_CYC; cyccb++, i++) { 00114 cyccb->cycinib = &(cycinib_table[i]); 00115 if ((cyccb->cycinib->cycatr & TA_STA) != 0) { 00116 cyccb->cycsta = TRUE; 00117 tmevtb_enqueue_cyc(my_local_ccb, cyccb, cyccb->cycinib->cycphs); 00118 } 00119 else { 00120 cyccb->cycsta = FALSE; 00121 } 00122 } 00123 } 00124 00125 #endif /* __cycinista */ 00126 00130 #ifdef __cycenq 00131 00132 void 00133 tmevtb_enqueue_cyc(CCB *ccb, CYCCB *cyccb, EVTTIM evttim) 00134 { 00135 tmevtb_enqueue_evttim(ccb, &(cyccb->tmevtb), evttim, 00136 (CBACK) ccb->p_call_cychdr, (VP) cyccb); 00137 cyccb->evttim = evttim; 00138 } 00139 00140 #endif /* __cycenq */ 00141 00145 #ifdef __sta_cyc 00146 00147 SYSCALL ER 00148 sta_cyc(ID cycid) 00149 { 00150 CYCCB *cyccb; 00151 ER ercd; 00152 CCB *ccb; 00153 00154 LOG_STA_CYC_ENTER(cycid); 00155 CHECK_TSKCTX_UNL(); 00156 ccb = T_CHECK_CLSID_CCB(cycid); 00157 cycid = remove_clsid(cycid); 00158 CHECK_CYCID(ccb, cycid); 00159 cyccb = get_cyccb(ccb, cycid); 00160 00161 retry: 00162 T_ACQUIRE_LOCK(ccb->tsk_lock); 00163 if (cyccb->cycsta) { 00164 tmevtb_dequeue(ccb, &(cyccb->tmevtb)); 00165 } 00166 else { 00167 cyccb->cycsta = TRUE; 00168 } 00169 tmevtb_enqueue_cyc(ccb, cyccb, base_time + cyccb->cycinib->cyctim); 00170 ercd = E_OK; 00171 T_RELEASE_LOCK(ccb->tsk_lock); 00172 00173 exit: 00174 LOG_STA_CYC_LEAVE(ercd); 00175 return(ercd); 00176 } 00177 00178 #endif /* __sta_cyc */ 00179 00183 #ifdef __stp_cyc 00184 00185 SYSCALL ER 00186 stp_cyc(ID cycid) 00187 { 00188 CYCCB *cyccb; 00189 ER ercd; 00190 CCB *ccb; 00191 00192 LOG_STP_CYC_ENTER(cycid); 00193 CHECK_TSKCTX_UNL(); 00194 ccb = T_CHECK_CLSID_CCB(cycid); 00195 cycid = remove_clsid(cycid); 00196 CHECK_CYCID(ccb, cycid); 00197 cyccb = get_cyccb(ccb, cycid); 00198 00199 retry: 00200 T_ACQUIRE_LOCK(ccb->tsk_lock); 00201 if (cyccb->cycsta) { 00202 cyccb->cycsta = FALSE; 00203 tmevtb_dequeue(ccb, &(cyccb->tmevtb)); 00204 } 00205 ercd = E_OK; 00206 T_RELEASE_LOCK(ccb->tsk_lock); 00207 00208 exit: 00209 LOG_STP_CYC_LEAVE(ercd); 00210 return(ercd); 00211 } 00212 00213 #endif /* __stp_cyc */ 00214 00218 #ifdef __cyccal 00219 00220 void 00221 call_cychdr(CYCCB *cyccb) 00222 { 00223 00224 /* 00225 * 次回の起動のためのタイムイベントブロックを登録する. 00226 * 00227 * 同じタイムティックで周期ハンドラを再度起動すべき場合には, 00228 * この関数から isig_tim に戻った後に,再度この関数が呼ばれる 00229 * ことになる. 00230 */ 00231 tmevtb_enqueue_cyc(my_local_ccb, cyccb, cyccb->evttim + cyccb->cycinib->cyctim); 00232 00233 /* 00234 * 周期ハンドラを,CPUロック解除状態かつタスクロック解放状態 00235 * で呼び出す. 00236 */ 00237 I_RELEASE_LOCK(my_local_ccb->tsk_lock); 00238 LOG_CYC_ENTER(cyccb); 00239 ((CYCHDR)(*cyccb->cycinib->cychdr))(cyccb->cycinib->exinf); 00240 LOG_CYC_LEAVE(cyccb); 00241 retry: 00242 I_ACQUIRE_LOCK(my_local_ccb->tsk_lock); 00243 } 00244 00245 #endif /* __cyccal */ Copyright © 2006 by TAKAGI Nobuhisa. このページは Mon Apr 3 23:49:12 2006 に Doxygen によって生成されました。 |