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
9 * 上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation
10 * によって公表されている GNU General Public License の Version 2 に記
11 * 述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12 * を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
14 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
17 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
21 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
24 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
26 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
28 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
31 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33 * 含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34 * 接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
36 * @(#) $Id: time_event.h,v 1.1 2009/01/31 05:27:37 suikan Exp $
43 #ifndef _TIME_EVENT_H_
44 #define _TIME_EVENT_H_
49 * EVTTIM は,RELTIM として指定できる範囲よりも広い範囲を表現できる必
50 * 要がある.スタンダードプロファイルでは,RELTIM が 16bit 以上でなけ
51 * ればならないため,EVTTIM は 17bit 以上であることが必要である.その
52 * ため,16bit の場合がある UINT ではなく,UW に定義している.
57 * 相対時間(RELTIM)に指定できる最大値
59 #define TMAX_RELTIM ((((EVTTIM) 1) << (sizeof(EVTTIM) * CHAR_BIT - 1)) - 1)
64 typedef void (*CBACK)(VP); /* コールバック関数の型 */
66 typedef struct time_event_block {
67 UINT index; /* タイムイベントヒープ中での位置 */
68 CBACK callback; /* コールバック関数 */
69 VP arg; /* コールバック関数へ渡す引数 */
73 * タイムイベントヒープ中のノードのデータ型の定義
75 typedef struct time_event_node {
76 EVTTIM time; /* イベント発生時刻 */
77 TMEVTB *tmevtb; /* 対応するタイムイベントブロック */
81 * タイムイベントヒープ(kernel_cfg.c)
83 extern TMEVTN tmevt_heap[];
88 extern SYSTIM systim_offset;
93 * システム起動時に 0 に初期化され,以降,isig_tim が呼ばれる度に単調
94 * に増加する.set_tim によって変更されない.
96 extern SYSTIM current_time;
99 * 次のタイムティックのシステム時刻(単位: 1ミリ秒)
101 extern SYSTIM next_time;
104 * システム時刻積算用変数(単位: 1/TIM_DENOミリ秒)
106 * 次のタイムティックのシステム時刻の下位桁を示す(上位桁は next_time).
107 * TIC_DENO が 1 の時は,下位桁は常に 0 であるため,この変数は必要ない.
110 extern UINT next_subtime;
111 #endif /* TIC_DENO != 1 */
114 * 相対時間のベース時刻(単位: 1ミリ秒)
116 * 次のタイムティックのシステム時刻を切り上げた時刻.TIC_DENO が 1 の
117 * 時は,next_time を EVTTIM に変換したものに一致する.
120 #define base_time ((EVTTIM) next_time)
121 #else /* TIC_DENO == 1 */
122 #define base_time ((EVTTIM)(next_time + (next_subtime > 0 ? 1 : 0)))
123 #endif /* TIC_DENO == 1 */
126 * タイムイベントヒープの最後の使用領域のインデックス
128 * タイムイベントヒープに登録されているタイムイベントの数に一致する.
130 extern UINT last_index;
135 extern void tmevt_initialize(void);
140 extern UINT tmevt_up(UINT index, EVTTIM time);
141 extern UINT tmevt_down(UINT index, EVTTIM time);
146 extern void tmevtb_insert(TMEVTB *tmevtb, EVTTIM time);
147 extern void tmevtb_delete(TMEVTB *tmevtb);
150 * タイムイベントブロックの登録(相対時間指定)
152 * time で指定した相対時間が経過後に,arg を引数として callback が呼
153 * び出されるように,タイムイベントブロック tmevtb を登録する.
156 tmevtb_enqueue(TMEVTB *tmevtb, RELTIM time, CBACK callback, VP arg)
158 assert(time <= TMAX_RELTIM);
160 tmevtb->callback = callback;
162 tmevtb_insert(tmevtb, base_time + time);
166 * タイムイベントブロックの登録(イベント発生時刻指定)
168 * time で指定したイベント発生時刻に,arg を引数として callback が呼
169 * び出されるように,タイムイベントブロック tmevtb を登録する.
172 tmevtb_enqueue_evttim(TMEVTB *tmevtb, EVTTIM time, CBACK callback, VP arg)
174 tmevtb->callback = callback;
176 tmevtb_insert(tmevtb, time);
183 tmevtb_dequeue(TMEVTB *tmevtb)
185 tmevtb_delete(tmevtb);
188 #endif /* _TIME_EVENT_H_ */