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

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

TOPPERS/uKadecotのソースコードを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/plain
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 * ã‹L’˜ìŒ ŽÒ‚́CˆÈ‰º‚Ì (1)`(4) ‚ÌðŒ‚ð–ž‚½‚·ê‡‚ÉŒÀ‚èC–{ƒ\ƒtƒgƒEƒF
8 * ƒAi–{ƒ\ƒtƒgƒEƒFƒA‚ð‰ü•Ï‚µ‚½‚à‚Ì‚ðŠÜ‚ށDˆÈ‰º“¯‚¶j‚ðŽg—pE•¡»E‰ü•ÏE
9 * Ä”z•ziˆÈ‰ºC—˜—p‚ƌĂԁj‚·‚邱‚Ƃ𖳏ž‚Å‹–‘ø‚·‚éD
10 * (1) –{ƒ\ƒtƒgƒEƒFƒA‚ðƒ\[ƒXƒR[ƒh‚ÌŒ`‚Å—˜—p‚·‚éê‡‚ɂ́Cã‹L‚Ì’˜ìŒ 
11 * •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’肪C‚»‚Ì‚Ü‚Ü‚ÌŒ`‚Ń\[ƒX
12 * ƒR[ƒh’†‚ÉŠÜ‚Ü‚ê‚Ä‚¢‚邱‚ƁD
13 * (2) –{ƒ\ƒtƒgƒEƒFƒA‚ðCƒ‰ƒCƒuƒ‰ƒŠŒ`Ž®‚ȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg—p
14 * ‚Å‚«‚éŒ`‚ōĔz•z‚·‚éê‡‚ɂ́CÄ”z•z‚É”º‚¤ƒhƒLƒ…
15ƒƒ“ƒgi—˜—pŽÒƒ}
16 * ƒjƒ…
17ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ìŒ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•Û
18 * Ø‹K’è‚ðŒfÚ‚·‚邱‚ƁD
19 * (3) –{ƒ\ƒtƒgƒEƒFƒA‚ðC‹@Ší‚É‘g‚ݍž‚ނȂǁC‘¼‚̃\ƒtƒgƒEƒFƒAŠJ”­‚ÉŽg—p
20 * ‚Å‚«‚È‚¢Œ`‚ōĔz•z‚·‚éê‡‚ɂ́CŽŸ‚Ì‚¢‚¸‚ê‚©‚ÌðŒ‚ð–ž‚½‚·‚±‚ƁD
21 * (a) Ä”z•z‚É”º‚¤ƒhƒLƒ…
22ƒƒ“ƒgi—˜—pŽÒƒ}ƒjƒ…
23ƒAƒ‹‚Ȃǁj‚ɁCã‹L‚Ì’˜ì
24 * Œ •\Ž¦C‚±‚Ì—˜—pðŒ‚¨‚æ‚щº‹L‚Ì–³•ÛØ‹K’è‚ðŒfÚ‚·‚邱‚ƁD
25 * (b) Ä”z•z‚ÌŒ`‘Ô‚ðC•Ê‚É’è‚ß‚é•û–@‚É‚æ‚Á‚āCTOPPERSƒvƒƒWƒFƒNƒg‚É•ñ
26 * ‚·‚邱‚ƁD
27 * (4) –{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚é‚¢‚©‚Ȃ鑹ŠQ
28 * ‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD‚Ü‚½C
29 * –{ƒ\ƒtƒgƒEƒFƒA‚̃†[ƒU‚Ü‚½‚̓Gƒ“ƒhƒ†[ƒU‚©‚ç‚Ì‚¢‚©‚Ȃ闝—R‚ÉŠî‚Ã
30 * ‚­¿‹‚©‚ç‚àCã‹L’˜ìŒ ŽÒ‚¨‚æ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚ð–Ɛӂ·‚邱‚ƁD
31 *
32 * –{ƒ\ƒtƒgƒEƒFƒA‚́C–³•ÛØ‚Å’ñ‹Ÿ‚³‚ê‚Ä‚¢‚é‚à‚Ì‚Å‚ ‚éDã‹L’˜ìŒ ŽÒ‚¨‚æ
33 * ‚ÑTOPPERSƒvƒƒWƒFƒNƒg‚́C–{ƒ\ƒtƒgƒEƒFƒA‚ÉŠÖ‚µ‚āC“Á’è‚ÌŽg—p–Ú“I‚ɑ΂·
34 * ‚é“K‡«‚àŠÜ‚߂āC‚¢‚©‚È‚é•ÛØ‚às‚í‚È‚¢D‚Ü‚½C–{ƒ\ƒtƒgƒEƒFƒA‚Ì—˜—p
35 * ‚É‚æ‚è’¼Ú“I‚Ü‚½‚͊ԐړI‚ɐ¶‚¶‚½‚¢‚©‚Ȃ鑹ŠQ‚ÉŠÖ‚µ‚Ä‚àC‚»‚̐ӔC‚ð•‰
36 * ‚í‚È‚¢D
37 *
38 */
39
40#include "kernel_impl.h"
41
42#include "time_event.h"
43
44
45/*
46 * Œ»Ý‚̃VƒXƒeƒ€Žži’PˆÊ: 1ƒ~ƒŠ•bj
47 *
48 * Œµ–§‚ɂ́C‘O‚̃^ƒCƒ€ƒeƒBƒbƒN‚̃VƒXƒeƒ€ŽžD
49 */
50EVTTIM current_time;
51
52/*
53 * ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒq[ƒv’†‚Å—LŒø‚ȍŏ¬‚̃VƒXƒeƒ€Žži’PˆÊ: 1ƒ~ƒŠ•bj
54 */
55EVTTIM min_time;
56
57
58/*
59 * ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒLƒ…
60[‚̃Lƒ…
61[ƒwƒbƒ_
62 *
63 * ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒLƒ…
64[ƒuƒƒbƒN‚̏I’[‚ÉŠm•Û‚·‚éD
65 */
66#define TMEVT_HEAD() (tmevt_queue[tnum_tmevt_queue])
67#define TMEVT_NULL ((QUEIDX)tnum_tmevt_queue)
68
69/*
70 * ƒCƒxƒ“ƒg”­¶Žž”äŠrƒ}ƒNƒ
71 *
72 * ƒCƒxƒ“ƒg”­¶Žž‚́Cmin_time‚©‚ç‚Ì‘Š‘Î’l‚Å”äŠr‚·‚éD‚·‚È‚í‚¿C
73 * min_time‚ðÅ¬’liÅ‚à‹ß‚¢ŽžjCmit_time-1‚ªÅ‘å’liÅ‚à‰“‚¢Žžj
74 * ‚Æ‚Ý‚È‚µ‚Ä”äŠr‚·‚éD
75 */
76#define EVTTIM_LT(t1, t2) (((t1) - min_time) < ((t2) - min_time))
77#define EVTTIM_LE(t1, t2) (((t1) - min_time) <= ((t2) - min_time))
78
79/*
80 * ƒ^ƒCƒ€ƒCƒxƒ“ƒg‚̏‰Šú‰»
81 */
82
83#ifdef TOPPERS_tmevtini
84
85void
86initialize_time_event(void)
87{
88 /* •Ï”‚̏‰Šú‰» */
89 current_time = 0U;
90 min_time = 0U;
91
92 /* ƒ^ƒCƒ€ƒCƒxƒ“ƒgƒLƒ…
93[‚̏‰Šú‰» */
94 queue_initialize(&TMEVT_HEAD() , (QUEIDX)tnum_tmevt_queue);
95}
96
97#endif /* TOPPERS_tmevtini */
98
99/*
100 * ƒ^ƒCƒ€ƒCƒxƒ“ƒg‚Ì“o˜^
101 */
102
103#ifdef TOPPERS_tmevtenq
104
105void
106time_event_enqueue(ID tmevtid , EVTTIM evttim , CBACK callback , uintptr_t arg)
107{
108 QUEIDX pos = TMEVT_HEAD().next;
109
110 /* ‘}“üˆÊ’u‚ðŒŸõ */
111 while((pos != TMEVT_NULL)
112 && (EVTTIM_LE(tmevt_time[pos] , evttim))) {
113 pos = tmevt_queue[pos].next;
114 }
115
116 /* ƒLƒ…
117[‚É‘}“ü */
118 queue_insert_prev(&(tmevt_queue[0]) , pos , (QUEIDX)tmevtid);
119 tmevt_callback[tmevtid] = (CBACK)callback;
120 tmevt_arg[tmevtid] = arg;
121 tmevt_time[tmevtid] = evttim;
122}
123
124#endif /* TOPPERS_tmevtenq */
125
126/*
127 * ƒ^ƒCƒ€ƒCƒxƒ“ƒg‚̍폜
128 */
129
130#ifdef TOPPERS_tmevtdeq
131
132void
133time_event_dequeue(ID tmevtid)
134{
135 /* ƒLƒ…
136[‚©‚çíœ */
137 (void)queue_delete_next(&(tmevt_queue[0]) , (QUEIDX)tmevtid);
138}
139
140#endif /* TOPPERS_tmevtdeq */
141
142/*
143 * ƒVƒXƒeƒ€Žž‚Ì’Ê’m
144 */
145
146#ifdef TOPPERS_sig_tim
147
148void
149signal_time(void)
150{
151 QUEIDX pos = TMEVT_HEAD().next , evtid;
152
153 i_lock_cpu();
154
155 /* Œ»ÝŽž‚̍XV */
156 current_time += (EVTTIM)TIC_NUME;
157
158 /* ƒR[ƒ‹ƒoƒbƒN‚ÌŽÀs */
159 while((pos != TMEVT_NULL)
160 && EVTTIM_LT(tmevt_time[pos] , current_time)) {
161 (void)queue_delete_next(&(tmevt_queue[0]) , pos);
162 evtid = pos;
163 pos = tmevt_queue[pos].next;
164 (*tmevt_callback[evtid])(tmevt_arg[evtid]);
165 }
166
167 /* min_time‚̍XV */
168 min_time = current_time;
169
170 i_unlock_cpu();
171}
172
173#endif /* TOPPERS_sig_tim */
Note: See TracBrowser for help on using the repository browser.