3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Just Standard Profile Kernel
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2006 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
11 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
12 * によって公表されている GNU General Public License の Version 2 に記
13 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
14 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
21 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
23 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
24 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
26 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
27 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
28 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
30 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
31 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
33 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
34 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
35 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
36 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
38 * @(#) $Id: cyclic.c,v 1.1 2009/01/31 05:27:37 suikan Exp $
45 #include "jsp_kernel.h"
50 * 周期ハンドラIDの最大値(kernel_cfg.c)
52 extern const ID tmax_cycid;
55 * 周期ハンドラ初期化ブロックのエリア(kernel_cfg.c)
57 extern const CYCINIB cycinib_table[];
60 * 周期ハンドラ管理ブロックのエリア(kernel_cfg.c)
62 extern CYCCB cyccb_table[];
67 #define TNUM_CYC ((UINT)(tmax_cycid - TMIN_CYCID + 1))
70 * 周期ハンドラIDから周期ハンドラ管理ブロックを取り出すためのマクロ
72 #define INDEX_CYC(cycid) ((UINT)((cycid) - TMIN_CYCID))
73 #define get_cyccb(cycid) (&(cyccb_table[INDEX_CYC(cycid)]))
78 typedef void (*CYCHDR)(VP_INT exinf);
91 for (cyccb = cyccb_table, i = 0; i < TNUM_CYC; cyccb++, i++) {
92 cyccb->cycinib = &(cycinib_table[i]);
93 if ((cyccb->cycinib->cycatr & TA_STA) != 0) {
95 tmevtb_enqueue_cyc(cyccb,
96 (EVTTIM)(cyccb->cycinib->cycphs));
99 cyccb->cycsta = FALSE;
104 #endif /* __cycini */
107 * 周期ハンドラ起動のためのタイムイベントブロックの登録
112 tmevtb_enqueue_cyc(CYCCB *cyccb, EVTTIM evttim)
114 tmevtb_enqueue_evttim(&(cyccb->tmevtb), evttim,
115 (CBACK) call_cychdr, (VP) cyccb);
116 cyccb->evttim = evttim;
119 #endif /* __cycenq */
132 LOG_STA_CYC_ENTER(cycid);
135 cyccb = get_cyccb(cycid);
139 tmevtb_dequeue(&(cyccb->tmevtb));
142 cyccb->cycsta = TRUE;
144 tmevtb_enqueue_cyc(cyccb, base_time + cyccb->cycinib->cyctim);
149 LOG_STA_CYC_LEAVE(ercd);
153 #endif /* __sta_cyc */
166 LOG_STP_CYC_ENTER(cycid);
169 cyccb = get_cyccb(cycid);
173 cyccb->cycsta = FALSE;
174 tmevtb_dequeue(&(cyccb->tmevtb));
180 LOG_STP_CYC_LEAVE(ercd);
184 #endif /* __stp_cyc */
192 call_cychdr(CYCCB *cyccb)
195 * 次回の起動のためのタイムイベントブロックを登録する.
197 * 同じタイムティックで周期ハンドラを再度起動すべき場合には,
198 * この関数から isig_tim に戻った後に,再度この関数が呼ばれる
201 tmevtb_enqueue_cyc(cyccb, cyccb->evttim + cyccb->cycinib->cyctim);
204 * 周期ハンドラを,CPUロック解除状態で呼び出す.
207 LOG_CYC_ENTER(cyccb);
208 (*((CYCHDR)(cyccb->cycinib->cychdr)))(cyccb->cycinib->exinf);
209 LOG_CYC_LEAVE(cyccb);
213 #endif /* __cyccal */