3 * Toyohashi Open Platform for Embedded Real-Time Systems/
4 * Advanced Standard Profile Kernel
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2005-2008 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
11 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
12 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
13 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
31 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
34 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
35 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
36 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
37 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
40 * @(#) $Id: cyclic.c 1358 2008-09-21 09:16:57Z ertl-hiro $
47 #include "kernel_impl.h"
55 #define LOG_CYC_ENTER(p_cyccb)
56 #endif /* LOG_CYC_ENTER */
59 #define LOG_CYC_LEAVE(p_cyccb)
60 #endif /* LOG_CYC_LEAVE */
62 #ifndef LOG_STA_CYC_ENTER
63 #define LOG_STA_CYC_ENTER(cycid)
64 #endif /* LOG_STA_CYC_ENTER */
66 #ifndef LOG_STA_CYC_LEAVE
67 #define LOG_STA_CYC_LEAVE(ercd)
68 #endif /* LOG_STA_CYC_LEAVE */
70 #ifndef LOG_STP_CYC_ENTER
71 #define LOG_STP_CYC_ENTER(cycid)
72 #endif /* LOG_STP_CYC_ENTER */
74 #ifndef LOG_STP_CYC_LEAVE
75 #define LOG_STP_CYC_LEAVE(ercd)
76 #endif /* LOG_STP_CYC_LEAVE */
78 #ifndef LOG_REF_CYC_ENTER
79 #define LOG_REF_CYC_ENTER(cycid, pk_rcyc)
80 #endif /* LOG_REF_CYC_ENTER */
82 #ifndef LOG_REF_CYC_LEAVE
83 #define LOG_REF_CYC_LEAVE(ercd, pk_rcyc)
84 #endif /* LOG_REF_CYC_LEAVE */
89 #define tnum_cyc ((uint_t)(tmax_cycid - TMIN_CYCID + 1))
92 * 周期ハンドラIDから周期ハンドラ管理ブロックを取り出すためのマクロ
94 #define INDEX_CYC(cycid) ((uint_t)((cycid) - TMIN_CYCID))
95 #define get_cyccb(cycid) (&(cyccb_table[INDEX_CYC(cycid)]))
98 * 周期ハンドラ起動のためのタイムイベントブロックの登録
101 tmevtb_enqueue_cyc(CYCCB *p_cyccb, EVTTIM evttim)
103 tmevtb_enqueue_evttim(&(p_cyccb->tmevtb), evttim,
104 (CBACK) call_cychdr, (void *) p_cyccb);
105 p_cyccb->evttim = evttim;
111 #ifdef TOPPERS_cycini
114 initialize_cyclic(void)
119 for (p_cyccb = cyccb_table, i = 0; i < tnum_cyc; p_cyccb++, i++) {
120 p_cyccb->p_cycinib = &(cycinib_table[i]);
121 if ((p_cyccb->p_cycinib->cycatr & TA_STA) != 0U) {
122 p_cyccb->cycsta = true;
123 tmevtb_enqueue_cyc(p_cyccb, (EVTTIM)(p_cyccb->p_cycinib->cycphs));
126 p_cyccb->cycsta = false;
131 #endif /* TOPPERS_cycini */
136 #ifdef TOPPERS_sta_cyc
144 LOG_STA_CYC_ENTER(cycid);
147 p_cyccb = get_cyccb(cycid);
150 if (p_cyccb->cycsta) {
151 tmevtb_dequeue(&(p_cyccb->tmevtb));
154 p_cyccb->cycsta = true;
156 tmevtb_enqueue_cyc(p_cyccb, base_time + p_cyccb->p_cycinib->cycphs);
161 LOG_STA_CYC_LEAVE(ercd);
165 #endif /* TOPPERS_sta_cyc */
170 #ifdef TOPPERS_stp_cyc
178 LOG_STP_CYC_ENTER(cycid);
181 p_cyccb = get_cyccb(cycid);
184 if (p_cyccb->cycsta) {
185 p_cyccb->cycsta = false;
186 tmevtb_dequeue(&(p_cyccb->tmevtb));
192 LOG_STP_CYC_LEAVE(ercd);
196 #endif /* TOPPERS_stp_cyc */
201 #ifdef TOPPERS_ref_cyc
204 ref_cyc(ID cycid, T_RCYC *pk_rcyc)
209 LOG_REF_CYC_ENTER(cycid, pk_rcyc);
212 p_cyccb = get_cyccb(cycid);
215 if (p_cyccb->cycsta) {
216 pk_rcyc->cycstat = TCYC_STA;
217 pk_rcyc->lefttim = tmevt_lefttim(&(p_cyccb->tmevtb));
220 pk_rcyc->cycstat = TCYC_STP;
226 LOG_REF_CYC_LEAVE(ercd, pk_rcyc);
230 #endif /* TOPPERS_ref_cyc */
235 #ifdef TOPPERS_cyccal
238 call_cychdr(CYCCB *p_cyccb)
243 * 次回の起動のためのタイムイベントブロックを登録する.
245 * 同じタイムティックで周期ハンドラを再度起動すべき場合には,この
246 * 関数からsignal_timeに戻った後に,再度この関数が呼ばれることにな
249 tmevtb_enqueue_cyc(p_cyccb, p_cyccb->evttim + p_cyccb->p_cycinib->cyctim);
252 * 周期ハンドラを,CPUロック解除状態で呼び出す.
254 saved_ipm = i_get_ipm();
257 LOG_CYC_ENTER(p_cyccb);
258 (*((CYCHDR)(p_cyccb->p_cycinib->cychdr)))(p_cyccb->p_cycinib->exinf);
259 LOG_CYC_LEAVE(p_cyccb);
261 if (!i_sense_lock()) {
264 i_set_ipm(saved_ipm);
267 #endif /* TOPPERS_cyccal */