|
|
cyclic.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 * 00009 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 00010 * によって公表されている GNU General Public License の Version 2 に記 00011 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア 00012 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下, 00013 * 利用と呼ぶ)することを無償で許諾する. 00014 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作 00015 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー 00016 * スコード中に含まれていること. 00017 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使 00018 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用 00019 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記 00020 * の無保証規定を掲載すること. 00021 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使 00022 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ 00023 * と. 00024 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著 00025 * 作権表示,この利用条件および下記の無保証規定を掲載すること. 00026 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに 00027 * 報告すること. 00028 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損 00029 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 00030 * 00031 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お 00032 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も 00033 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直 00034 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない. 00035 * 00036 * @(#) $Id: cyclic.c,v 1.10 2003/06/04 01:46:16 hiro Exp $ 00037 */ 00038 00039 /* 00040 * 周期ハンドラ機能 00041 */ 00042 00043 #include "jsp_kernel.h" 00044 #include "check.h" 00045 #include "cyclic.h" 00046 00047 /* 00048 * 周期ハンドラIDの最大値(kernel_cfg.c) 00049 */ 00050 extern const ID tmax_cycid; 00051 00052 /* 00053 * 周期ハンドラ初期化ブロックのエリア(kernel_cfg.c) 00054 */ 00055 extern const CYCINIB cycinib_table[]; 00056 00057 /* 00058 * 周期ハンドラ管理ブロックのエリア(kernel_cfg.c) 00059 */ 00060 extern CYCCB cyccb_table[]; 00061 00062 /* 00063 * 周期ハンドラの数 00064 */ 00065 #define TNUM_CYC ((UINT)(tmax_cycid - TMIN_CYCID + 1)) 00066 00067 /* 00068 * 周期ハンドラIDから周期ハンドラ管理ブロックを取り出すためのマクロ 00069 */ 00070 #define INDEX_CYC(cycid) ((UINT)((cycid) - TMIN_CYCID)) 00071 #define get_cyccb(cycid) (&(cyccb_table[INDEX_CYC(cycid)])) 00072 00073 /* 00074 * 引数まで定義した周期ハンドラの型 00075 */ 00076 typedef void (*CYCHDR)(VP_INT exinf); 00077 00078 /* 00079 * 周期ハンドラ機能の初期化 00080 */ 00081 #ifdef __cycini 00082 00083 void 00084 cyclic_initialize() 00085 { 00086 UINT i; 00087 CYCCB *cyccb; 00088 00089 for (cyccb = cyccb_table, i = 0; i < TNUM_CYC; cyccb++, i++) { 00090 cyccb->cycinib = &(cycinib_table[i]); 00091 if ((cyccb->cycinib->cycatr & TA_STA) != 0) { 00092 cyccb->cycsta = TRUE; 00093 tmevtb_enqueue_cyc(cyccb, cyccb->cycinib->cycphs); 00094 } 00095 else { 00096 cyccb->cycsta = FALSE; 00097 } 00098 } 00099 } 00100 00101 #endif /* __cycini */ 00102 00103 /* 00104 * 周期ハンドラ起動のためのタイムイベントブロックの登録 00105 */ 00106 #ifdef __cycenq 00107 00108 void 00109 tmevtb_enqueue_cyc(CYCCB *cyccb, EVTTIM evttim) 00110 { 00111 tmevtb_enqueue_evttim(&(cyccb->tmevtb), evttim, 00112 (CBACK) call_cychdr, (VP) cyccb); 00113 cyccb->evttim = evttim; 00114 } 00115 00116 #endif /* __cycenq */ 00117 00118 /* 00119 * 周期ハンドラの動作開始 00120 */ 00121 #ifdef __sta_cyc 00122 00123 SYSCALL ER 00124 sta_cyc(ID cycid) 00125 { 00126 CYCCB *cyccb; 00127 ER ercd; 00128 00129 LOG_STA_CYC_ENTER(cycid); 00130 CHECK_TSKCTX_UNL(); 00131 CHECK_CYCID(cycid); 00132 cyccb = get_cyccb(cycid); 00133 00134 t_lock_cpu(); 00135 if (cyccb->cycsta) { 00136 tmevtb_dequeue(&(cyccb->tmevtb)); 00137 } 00138 else { 00139 cyccb->cycsta = TRUE; 00140 } 00141 tmevtb_enqueue_cyc(cyccb, base_time + cyccb->cycinib->cyctim); 00142 ercd = E_OK; 00143 t_unlock_cpu(); 00144 00145 exit: 00146 LOG_STA_CYC_LEAVE(ercd); 00147 return(ercd); 00148 } 00149 00150 #endif /* __sta_cyc */ 00151 00152 /* 00153 * 周期ハンドラの動作停止 00154 */ 00155 #ifdef __stp_cyc 00156 00157 SYSCALL ER 00158 stp_cyc(ID cycid) 00159 { 00160 CYCCB *cyccb; 00161 ER ercd; 00162 00163 LOG_STP_CYC_ENTER(cycid); 00164 CHECK_TSKCTX_UNL(); 00165 CHECK_CYCID(cycid); 00166 cyccb = get_cyccb(cycid); 00167 00168 t_lock_cpu(); 00169 if (cyccb->cycsta) { 00170 cyccb->cycsta = FALSE; 00171 tmevtb_dequeue(&(cyccb->tmevtb)); 00172 } 00173 ercd = E_OK; 00174 t_unlock_cpu(); 00175 00176 exit: 00177 LOG_STP_CYC_LEAVE(ercd); 00178 return(ercd); 00179 } 00180 00181 #endif /* __stp_cyc */ 00182 00183 /* 00184 * 周期ハンドラ起動ルーチン 00185 */ 00186 #ifdef __cyccal 00187 00188 void 00189 call_cychdr(CYCCB *cyccb) 00190 { 00191 /* 00192 * 次回の起動のためのタイムイベントブロックを登録する. 00193 * 00194 * 同じタイムティックで周期ハンドラを再度起動すべき場合には, 00195 * この関数から isig_tim に戻った後に,再度この関数が呼ばれる 00196 * ことになる. 00197 */ 00198 tmevtb_enqueue_cyc(cyccb, cyccb->evttim + cyccb->cycinib->cyctim); 00199 00200 /* 00201 * 周期ハンドラを,CPUロック解除状態で呼び出す. 00202 */ 00203 i_unlock_cpu(); 00204 LOG_CYC_ENTER(cyccb); 00205 ((CYCHDR)(*cyccb->cycinib->cychdr))(cyccb->cycinib->exinf); 00206 LOG_CYC_LEAVE(cyccb); 00207 i_lock_cpu(); 00208 } 00209 00210 #endif /* __cyccal */ 00211 Copyright © 2006 by TAKAGI Nobuhisa. Copyright © 2006 by Kijineko Inc.. このページは Mon Dec 18 17:18:39 2006 に Doxygen によって生成されました。 データ入力からプログラム開発まで!様々なスキルを持ったメンバーが登録しています【@SOHO】 |