source: uKadecot/trunk/ssp/extension/time_event.c@ 108

Last change on this file since 108 was 108, checked in by coas-nagasima, 9 years ago

MIMEプロパティの変更

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-chdr; charset=SHIFT_JIS
File size: 4.0 KB
Line 
1/*
2 * TOPPERS/SSP Kernel
3 * Smallest Set Profile Kernel
4 *
5 * Copyright (C) 2011 by Meika Sugimoto
6 *
7 * 上記著作権者は,以下の (1)〜(4) の条件を満たす場合に限り,本ソフトウェ
8 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改変・
9 * 再配布(以下,利用と呼ぶ)することを無償で許諾する.
10 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作権
11 * 表示,この利用条件および下記の無保証規定が,そのままの形でソース
12 * コード中に含まれていること.
13 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使用
14 * できる形で再配布する場合には,再配布に伴うドキュメント(利用者マ
15 * ニュアルなど)に,上記の著作権表示,この利用条件および下記の無保
16 * 証規定を掲載すること.
17 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使用
18 * できない形で再配布する場合には,次のいずれかの条件を満たすこと.
19 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著作
20 * 権表示,この利用条件および下記の無保証規定を掲載すること.
21 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに報
22 * 告すること.
23 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損害
24 * からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
25 * 本ソフトウェアのユーザまたはエンドユーザからのいかなる理由に基づ
26 * く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
27 *
28 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者およ
29 * びTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的に対す
30 * る適合性も含めて,いかなる保証も行わない.また,本ソフトウェアの利用
31 * により直接的または間接的に生じたいかなる損害に関しても,その責任を負
32 * わない.
33 *
34 */
35
36#include "kernel_impl.h"
37
38#include "time_event.h"
39
40
41/*
42 * 現在のシステム時刻(単位: 1ミリ秒)
43 *
44 * 厳密には,前のタイムティックのシステム時刻.
45 */
46EVTTIM current_time;
47
48/*
49 * タイムイベントヒープ中で有効な最小のシステム時刻(単位: 1ミリ秒)
50 */
51EVTTIM min_time;
52
53
54/*
55 * タイムイベントキューのキューヘッダ
56 *
57 * タイムイベントキューブロックの終端に確保する.
58 */
59#define TMEVT_HEAD() (tmevt_queue[tnum_tmevt_queue])
60#define TMEVT_NULL ((QUEIDX)tnum_tmevt_queue)
61
62/*
63 * イベント発生時刻比較マクロ
64 *
65 * イベント発生時刻は,min_timeからの相対値で比較する.すなわち,
66 * min_timeを最小値(最も近い時刻),mit_time-1が最大値(最も遠い時刻)
67 * とみなして比較する.
68 */
69#define EVTTIM_LT(t1, t2) (((t1) - min_time) < ((t2) - min_time))
70#define EVTTIM_LE(t1, t2) (((t1) - min_time) <= ((t2) - min_time))
71
72/*
73 * タイムイベントの初期化
74 */
75
76#ifdef TOPPERS_tmevtini
77
78void
79initialize_time_event(void)
80{
81 /* 変数の初期化 */
82 current_time = 0U;
83 min_time = 0U;
84
85 /* タイムイベントキューの初期化 */
86 queue_initialize(&TMEVT_HEAD() , (QUEIDX)tnum_tmevt_queue);
87}
88
89#endif /* TOPPERS_tmevtini */
90
91/*
92 * タイムイベントの登録
93 */
94
95#ifdef TOPPERS_tmevtenq
96
97void
98time_event_enqueue(ID tmevtid , EVTTIM evttim , CBACK callback , uintptr_t arg)
99{
100 QUEIDX pos = TMEVT_HEAD().next;
101
102 /* 挿入位置を検索 */
103 while((pos != TMEVT_NULL)
104 && (EVTTIM_LE(tmevt_time[pos] , evttim))) {
105 pos = tmevt_queue[pos].next;
106 }
107
108 /* キューに挿入 */
109 queue_insert_prev(&(tmevt_queue[0]) , pos , (QUEIDX)tmevtid);
110 tmevt_callback[tmevtid] = (CBACK)callback;
111 tmevt_arg[tmevtid] = arg;
112 tmevt_time[tmevtid] = evttim;
113}
114
115#endif /* TOPPERS_tmevtenq */
116
117/*
118 * タイムイベントの削除
119 */
120
121#ifdef TOPPERS_tmevtdeq
122
123void
124time_event_dequeue(ID tmevtid)
125{
126 /* キューから削除 */
127 (void)queue_delete_next(&(tmevt_queue[0]) , (QUEIDX)tmevtid);
128}
129
130#endif /* TOPPERS_tmevtdeq */
131
132/*
133 * システム時刻の通知
134 */
135
136#ifdef TOPPERS_sig_tim
137
138void
139signal_time(void)
140{
141 QUEIDX pos = TMEVT_HEAD().next , evtid;
142
143 i_lock_cpu();
144
145 /* 現在時刻の更新 */
146 current_time += (EVTTIM)TIC_NUME;
147
148 /* コールバックの実行 */
149 while((pos != TMEVT_NULL)
150 && EVTTIM_LT(tmevt_time[pos] , current_time)) {
151 (void)queue_delete_next(&(tmevt_queue[0]) , pos);
152 evtid = pos;
153 pos = tmevt_queue[pos].next;
154 (*tmevt_callback[evtid])(tmevt_arg[evtid]);
155 }
156
157 /* min_timeの更新 */
158 min_time = current_time;
159
160 i_unlock_cpu();
161}
162
163#endif /* TOPPERS_sig_tim */
Note: See TracBrowser for help on using the repository browser.