OSDN Git Service

5f9eb4e936e0d180d35253f9b2de4bee519d7ef7
[trx-305dsp/dsp.git] / trx305 / kernel / kernel / time_event.h
1 /*
2  *  TOPPERS/JSP Kernel
3  *      Toyohashi Open Platform for Embedded Real-Time Systems/
4  *      Just Standard Profile Kernel
5  * 
6  *  Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7  *                              Toyohashi Univ. of Technology, JAPAN
8  * 
9  *  上記著作権者は,以下の (1)〜(4) の条件か,Free Software Foundation 
10  *  によって公表されている GNU General Public License の Version 2 に記
11  *  述されている条件を満たす場合に限り,本ソフトウェア(本ソフトウェア
12  *  を改変したものを含む.以下同じ)を使用・複製・改変・再配布(以下,
13  *  利用と呼ぶ)することを無償で許諾する.
14  *  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
15  *      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
16  *      スコード中に含まれていること.
17  *  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
18  *      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
19  *      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
20  *      の無保証規定を掲載すること.
21  *  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
22  *      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
23  *      と.
24  *    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
25  *        作権表示,この利用条件および下記の無保証規定を掲載すること.
26  *    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
27  *        報告すること.
28  *  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
29  *      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
30  * 
31  *  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
32  *  よびTOPPERSプロジェクトは,本ソフトウェアに関して,その適用可能性も
33  *  含めて,いかなる保証も行わない.また,本ソフトウェアの利用により直
34  *  接的または間接的に生じたいかなる損害に関しても,その責任を負わない.
35  * 
36  *  @(#) $Id: time_event.h,v 1.1 2009/01/31 05:27:37 suikan Exp $
37  */
38
39 /*
40  *  タイムイベント管理モジュール
41  */
42
43 #ifndef _TIME_EVENT_H_
44 #define _TIME_EVENT_H_
45
46 /*
47  *  イベント発生時刻のデータ型の定義
48  *
49  *  EVTTIM は,RELTIM として指定できる範囲よりも広い範囲を表現できる必
50  *  要がある.スタンダードプロファイルでは,RELTIM が 16bit 以上でなけ
51  *  ればならないため,EVTTIM は 17bit 以上であることが必要である.その
52  *  ため,16bit の場合がある UINT ではなく,UW に定義している.
53  */
54 typedef UW  EVTTIM;
55
56 /*
57  *  相対時間(RELTIM)に指定できる最大値
58  */
59 #define TMAX_RELTIM ((((EVTTIM) 1) << (sizeof(EVTTIM) * CHAR_BIT - 1)) - 1)
60
61 /* 
62  *  タイムイベントブロックのデータ型の定義
63  */
64 typedef void    (*CBACK)(VP);   /* コールバック関数の型 */
65
66 typedef struct time_event_block {
67     UINT    index;      /* タイムイベントヒープ中での位置 */
68     CBACK   callback;   /* コールバック関数 */
69     VP  arg;        /* コールバック関数へ渡す引数 */
70 } TMEVTB;
71
72 /*
73  *  タイムイベントヒープ中のノードのデータ型の定義
74  */
75 typedef struct time_event_node {
76     EVTTIM  time;       /* イベント発生時刻 */
77     TMEVTB  *tmevtb;    /* 対応するタイムイベントブロック */
78 } TMEVTN;
79
80 /*
81  *  タイムイベントヒープ(kernel_cfg.c)
82  */
83 extern TMEVTN   tmevt_heap[];
84
85 /*
86  *  システム時刻のオフセット
87  */
88 extern SYSTIM   systim_offset;
89
90 /*
91  *  現在のシステム時刻(単位: ミリ秒)
92  *
93  *  システム起動時に 0 に初期化され,以降,isig_tim が呼ばれる度に単調
94  *  に増加する.set_tim によって変更されない.
95  */
96 extern SYSTIM   current_time;
97
98 /*
99  *  次のタイムティックのシステム時刻(単位: 1ミリ秒)
100  */
101 extern SYSTIM   next_time;
102
103 /*
104  *  システム時刻積算用変数(単位: 1/TIM_DENOミリ秒)
105  *
106  *  次のタイムティックのシステム時刻の下位桁を示す(上位桁は next_time).
107  *  TIC_DENO が 1 の時は,下位桁は常に 0 であるため,この変数は必要ない.
108  */
109 #if TIC_DENO != 1
110 extern UINT next_subtime;
111 #endif /* TIC_DENO != 1 */
112
113 /*
114  *  相対時間のベース時刻(単位: 1ミリ秒)
115  *
116  *  次のタイムティックのシステム時刻を切り上げた時刻.TIC_DENO が 1 の
117  *  時は,next_time を EVTTIM に変換したものに一致する.
118  */
119 #if TIC_DENO == 1
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 */
124
125 /*
126  *  タイムイベントヒープの最後の使用領域のインデックス
127  *
128  *  タイムイベントヒープに登録されているタイムイベントの数に一致する.
129  */
130 extern UINT last_index;
131
132 /*
133  *  タイムイベント管理モジュールの初期化
134  */
135 extern void tmevt_initialize(void);
136
137 /*
138  *  タイムイベントの挿入位置の探索
139  */
140 extern UINT tmevt_up(UINT index, EVTTIM time);
141 extern UINT tmevt_down(UINT index, EVTTIM time);
142
143 /*
144  *  タイムイベントヒープへの登録と削除
145  */
146 extern void tmevtb_insert(TMEVTB *tmevtb, EVTTIM time);
147 extern void tmevtb_delete(TMEVTB *tmevtb);
148
149 /*
150  *  タイムイベントブロックの登録(相対時間指定)
151  *
152  *  time で指定した相対時間が経過後に,arg を引数として callback が呼
153  *  び出されるように,タイムイベントブロック tmevtb を登録する.
154  */
155 Inline void
156 tmevtb_enqueue(TMEVTB *tmevtb, RELTIM time, CBACK callback, VP arg)
157 {
158     assert(time <= TMAX_RELTIM);
159
160     tmevtb->callback = callback;
161     tmevtb->arg = arg;
162     tmevtb_insert(tmevtb, base_time + time);
163 }
164
165 /*
166  *  タイムイベントブロックの登録(イベント発生時刻指定)
167  *
168  *  time で指定したイベント発生時刻に,arg を引数として callback が呼
169  *  び出されるように,タイムイベントブロック tmevtb を登録する.
170  */
171 Inline void
172 tmevtb_enqueue_evttim(TMEVTB *tmevtb, EVTTIM time, CBACK callback, VP arg)
173 {
174     tmevtb->callback = callback;
175     tmevtb->arg = arg;
176     tmevtb_insert(tmevtb, time);
177 }
178
179 /*
180  *  タイムイベントブロックの登録解除
181  */
182 Inline void
183 tmevtb_dequeue(TMEVTB *tmevtb)
184 {
185     tmevtb_delete(tmevtb);
186 }
187
188 #endif /* _TIME_EVENT_H_ */