source: target/macosx_gcc/target_timer.c

このファイルの最終更新内容7 で kominami が 2015/09/12 9:22:12 に更新しました

TOPPERS/ASP 1.9.1

ファイルサイズ: 11.1 KB
Rev 
[7]1/*
2 *  TOPPERS/ASP Kernel
3 *      Toyohashi Open Platform for Embedded Real-Time Systems/
4 *      Advanced Standard Profile Kernel
5 *
6 *  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
7 *              Graduate School of Information Science, Nagoya Univ., JAPAN
8 *
9 *  Ÿåµ­Ãøºîž¢ŒÔ€Ï¡€°Ê²Œ€Î(1)¡Á(4)€ÎŸò·ï€òËþ€¿€¹Ÿì¹ç€ËžÂ€ê¡€ËÜ¥œ¥Õ¥È¥Š¥§
10 *  ¥¢¡ÊËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò²þÊÑ€·€¿€â€Î€òŽÞ€à¡¥°Ê²ŒÆ±€ž¡Ë€ò»ÈÍÑ¡ŠÊ£Àœ¡Š²þ
11 *  ÊÑ¡ŠºÆÇÛÉۡʰʲŒ¡€ÍøÍрȞƀ֡ˀ¹€ë€³€È€ò̵œþ€ÇµöÂú€¹€ë¡¥
12 *  (1) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¥œ¡Œ¥¹¥³¡Œ¥É€Î·Á€ÇÍøÍÑ€¹€ëŸì¹ç€Ë€Ï¡€Ÿåµ­€ÎÃøºî
13 *      ž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äꀬ¡€€œ€Î€Þ€Þ€Î·Á€Ç¥œ¡Œ
14 *      ¥¹¥³¡Œ¥ÉÃæ€ËŽÞ€Þ€ì€Æ€€€ë€³€È¡¥
15 *  (2) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€¥é¥€¥Ö¥é¥ê·ÁŒ°€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
16 *      Íрǀ­€ë·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍÑ
17 *      ŒÔ¥Þ¥Ë¥å¥¢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃøºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­
18 *      €Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
19 *  (3) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ò¡€µ¡Žï€ËÁȀ߹þ€à€Ê€É¡€ÂŸ€Î¥œ¥Õ¥È¥Š¥§¥¢³«È¯€Ë»È
20 *      Íрǀ­€Ê€€·Á€ÇºÆÇÛÉÛ€¹€ëŸì¹ç€Ë€Ï¡€Œ¡€Î€€€º€ì€«€ÎŸò·ï€òËþ€¿€¹€³
21 *      €È¡¥
22 *    (a) ºÆÇÛÉÛ€ËÈŒ€Š¥É¥­¥å¥á¥ó¥È¡ÊÍøÍьԥޥ˥奢¥ë€Ê€É¡Ë€Ë¡€Ÿåµ­€ÎÃø
23 *        ºîž¢ÉœŒš¡€€³€ÎÍøÍÑŸò·ï€ª€è€Ó²Œµ­€Î̵ÊÝŸÚµ¬Äê€ò·ÇºÜ€¹€ë€³€È¡¥
24 *    (b) ºÆÇÛÉۀηÁÂÖ€ò¡€ÊÌ€ËÄê€á€ëÊýË¡€Ë€è€Ã€Æ¡€TOPPERS¥×¥í¥ž¥§¥¯¥È€Ë
25 *        Êó¹ð€¹€ë€³€È¡¥
26 *  (4) ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€ë€€€«€Ê€ë»
27 *      ³²€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€òÌÈÀÕ€¹€ë€³€È¡¥
28 *      €Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Î¥æ¡Œ¥¶€Þ€¿€Ï¥š¥ó¥É¥æ¡Œ¥¶€«€é€Î€€€«€Ê€ëÍý
29 *      ͳ€ËŽð€Å€¯ÀÁµá€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€ò
30 *      ÌÈÀÕ€¹€ë€³€È¡¥
31 *
32 *  ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Ï¡€ÌµÊÝŸÚ€ÇÄó¶¡€µ€ì€Æ€€€ë€â€Î€Ç€¢€ë¡¥Ÿåµ­Ãøºîž¢ŒÔ€ª
33 *  €è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€Ï¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ËŽØ€·€Æ¡€ÆÃÄê€Î»ÈÍÑÌÜŪ
34 *  €ËÂЀ¹€ëŬ¹çÀ­€âŽÞ€á€Æ¡€€€€«€Ê€ëÊÝŸÚ€â¹Ô€ï€Ê€€¡¥€Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§
35 *  ¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€¿€€€«€Ê€ë»³²€ËŽØ€·€Æ€â¡€€œ
36 *  €ÎÀÕÇ€€òÉé€ï€Ê€€¡¥
37 *
38 *  $Id$
39 */
40
41/*
42 *              ¥¿¥€¥Þ¥É¥é¥€¥Ð¡ÊMac OS XÍÑ¡Ë
43 */
44
45#include "kernel_impl.h"
46#include "time_event.h"
47#include "target_timer.h"
48#include <sys/time.h>
49
50#ifndef TOPPERS_SUPPORT_OVRHDR
51
52/*
53 *              ¥ª¡Œ¥Ð¥é¥ó¥Ï¥ó¥É¥éµ¡Çœ€ò¥µ¥Ý¡Œ¥È€·€Ê€€Ÿì¹ç
54 */
55
56#if 0
57/*
58 *              ¥€¥ó¥¿¡Œ¥Ð¥ë¥¿¥€¥Þ€òŒþŽü¥¿¥€¥Þ€È€·€Æ»ÈÍÑ€¹€ëÊýË¡
59 *
60 *  ¥€¥ó¥¿¡Œ¥Ð¥ë¥¿¥€¥Þ€òŒþŽü¥¿¥€¥Þ€È€·€Æ»ÈÍÑ€¹€ë€Î€¬ÁÇÄŸ€Ç€¢€ë€¬¡€žœºß
61 *  €ÎMac OS X€Ç€Ï¡€SIGALRM€ÎÇÛÁ÷€¬Ãٱ䀹€ë€³€È€¬€¢€ë€¿€á€«¡€¥¿¥€¥Þ€¬Œ¡
62 *  €ÎŒþŽü€Ë¿Ê€ó€À€Ë€â€«€«€ï€é€º¡€SIGALRM€ÎÇÛÁ÷€¬sigpending€Çž¡œÐ€Ç€­€Ê
63 *  €€Ÿì¹ç€¬€¢€ë¡¥€³€ì€Ë€è€ê¡€À­ÇœÉŸ²ÁÍÑ¥·¥¹¥Æ¥à»þ¹ï€Î»²ŸÈ€¬Àµ€·€¯Æ°ºî
64 *  €·€Ê€€€¿€á¡€€³€Î¥³¡Œ¥É€Ï»ÈÍÑ€·€Æ€€€Ê€€¡¥
65 */
66
67/*
68 *  ¥¿¥€¥Þ€Îµ¯Æ°œèÍý
69 */
70void
71target_timer_initialize(intptr_t exinf)
72{
73        CLOCK   cyc = TO_CLOCK(TIC_NUME, TIC_DENO);
74        struct itimerval        val;
75
76        /*
77         *  ¥¿¥€¥ÞŒþŽü€òÀßÄꀷ¡€¥¿¥€¥Þ€Îưºî€ò³«»Ï€¹€ë¡¥
78         */
79        assert(cyc <= MAX_CLOCK);
80        val.it_interval.tv_sec = 0;
81        val.it_interval.tv_usec = cyc;
82        val.it_value = val.it_interval;
83        setitimer(ITIMER_REAL, &val, NULL);
84}
85
86/*
87 *  ¥¿¥€¥Þ€ÎÄä»ßœèÍý
88 */
89void
90target_timer_terminate(intptr_t exinf)
91{
92        struct itimerval        val;
93
94        /*
95         *  ¥¿¥€¥Þ€Îưºî€òÄä»ß€¹€ë¡¥
96         */
97        val.it_interval.tv_sec = 0;
98        val.it_interval.tv_usec = 0;
99        val.it_value = val.it_interval;
100        setitimer(ITIMER_REAL, &val, NULL);
101}
102
103/*
104 *  ¥¿¥€¥Þ€ÎžœºßÃÍ€ÎÆÉœÐ€·
105 */
106CLOCK
107target_timer_get_current(void)
108{
109        struct itimerval        val;
110
111        getitimer(ITIMER_REAL, &val);
112        return(TO_CLOCK(TIC_NUME, TIC_DENO) - val.it_value.tv_usec);
113}
114
115/*
116 *  ¥¿¥€¥Þ³ä¹þ€ßÍ×µá€Î¥Á¥§¥Ã¥¯
117 */
118bool_t
119target_timer_probe_int(void)
120{
121        return(x_probe_int(INTNO_TIMER));
122}
123
124/*
125 *  ¥¿¥€¥Þ³ä¹þ€ß¥Ï¥ó¥É¥é
126 */
127void
128target_timer_handler(void)
129{
130        i_begin_int(INTNO_TIMER);
131        signal_time();                                  /* ¥¿¥€¥à¥Æ¥£¥Ã¥¯€Î¶¡µë */
132        i_end_int(INTNO_TIMER);
133}
134
135#else /* 0 */
136/*
137 *              ¥€¥ó¥¿¡Œ¥Ð¥ë¥¿¥€¥Þ€ò¥ï¥ó¥·¥ç¥Ã¥È¥¿¥€¥Þ€È€·€Æ»ÈÍÑ€¹€ëÊýË¡
138 */
139
140/*
141 *  ¥¿¥€¥Þ€Îưºî³«»Ï
142 */
143Inline void
144itimer_start(void)
145{
146        CLOCK   cyc = TO_CLOCK(TIC_NUME, TIC_DENO);
147        struct itimerval        val;
148
149        /*
150         *  ¥¿¥€¥ÞŒþŽü€òÀßÄꀷ¡€¥¿¥€¥Þ€Îưºî€ò³«»Ï€¹€ë¡¥
151         */
152        assert(cyc <= MAX_CLOCK);
153        val.it_interval.tv_sec = 0;
154        val.it_interval.tv_usec = 0;
155        val.it_value.tv_sec = 0;
156        val.it_value.tv_usec = cyc;
157        setitimer(ITIMER_REAL, &val, NULL);
158}
159
160/*
161 *  ¥¿¥€¥Þ€Îµ¯Æ°œèÍý
162 */
163void
164target_timer_initialize(intptr_t exinf)
165{
166        itimer_start();
167}
168
169/*
170 *  ¥¿¥€¥Þ€ÎÄä»ßœèÍý
171 */
172void
173target_timer_terminate(intptr_t exinf)
174{
175        struct itimerval        val;
176
177        /*
178         *  ¥¿¥€¥Þ€Îưºî€òÄä»ß€¹€ë¡¥
179         */
180        val.it_interval.tv_sec = 0;
181        val.it_interval.tv_usec = 0;
182        val.it_value = val.it_interval;
183        setitimer(ITIMER_REAL, &val, NULL);
184}
185
186/*
187 *  ¥¿¥€¥Þ€ÎžœºßÃÍ€ÎÆÉœÐ€·
188 */
189CLOCK
190target_timer_get_current(void)
191{
192        struct itimerval        val;
193
194        getitimer(ITIMER_REAL, &val);
195        return(TO_CLOCK(TIC_NUME, TIC_DENO) - val.it_value.tv_usec);
196}
197
198/*
199 *  ¥¿¥€¥Þ³ä¹þ€ßÍ×µá€Î¥Á¥§¥Ã¥¯
200 */
201bool_t
202target_timer_probe_int(void)
203{
204        return(false);
205}
206
207/*
208 *  ¥¿¥€¥Þ³ä¹þ€ß¥Ï¥ó¥É¥é
209 */
210void
211target_timer_handler(void)
212{
213        i_begin_int(INTNO_TIMER);
214        i_lock_cpu();
215        itimer_start();
216        i_unlock_cpu();
217        signal_time();                                  /* ¥¿¥€¥à¥Æ¥£¥Ã¥¯€Î¶¡µë */
218        i_end_int(INTNO_TIMER);
219}
220
221#endif /* 0 */
222#else /* TOPPERS_SUPPORT_OVRHDR */
223
224/*
225 *              ¥ª¡Œ¥Ð¥é¥ó¥Ï¥ó¥É¥éµ¡Çœ€ò¥µ¥Ý¡Œ¥È€¹€ëŸì¹ç
226 *
227 *  ¥¿¥€¥à¥Æ¥£¥Ã¥¯¶¡µë€Î€¿€á€Î¥¿¥€¥Þ¡Ê¥Æ¥£¥Ã¥¯¥¿¥€¥Þ¡Ë€È¥ª¡Œ¥Ð¥é¥ó¥Ï¥ó
228 *  ¥É¥éµ¡Çœ€Î€¿€á€Î¥¿¥€¥Þ¡Ê¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ¡Ë€ò¡€1€Ä€Î¥€¥ó¥¿¡Œ¥Ð¥ë¥¿¥€
229 *  ¥Þ€ò¿œÅ²œ€·€ÆŒÂžœ€·€Æ€€€ë¡¥€³€ÎÊýË¡€Ï¡€¥Æ¥£¥Ã¥¯€ÎŒþŽü€¬€º€ì€ë€¿€á
230 *  €Ë¿äŸ©€Ç€­€Ê€€€¬¡€¥Þ¥€¥¯¥íÉÃÀºÅـΥ¿¥€¥Þ€¬1€Ä€·€«€Ê€¯¡€¥·¥ß¥å¥ì¡Œ¥·¥ç
231 *  ¥óŽÄ¶­€Ç¥Æ¥£¥Ã¥¯ŒþŽü€Î€º€ì€ÏÂ瀭€€ÌäÂê€Ç€Ï€Ê€€€¿€á¡€€³€ÎÊýË¡€òºÎÍÑ
232 *  €·€Æ€€€ë¡¥
233 */
234#include "task.h"
235#include "overrun.h"
236
237static CLOCK    ticktimer_cyc;          /* ¥Æ¥£¥Ã¥¯¥¿¥€¥Þ€ÎŒþŽü */
238
239static bool_t   itimer_ticktimer;       /* ¥€¥ó¥¿¡Œ¥Ð¥ë¥¿¥€¥Þ€Ë
240                                                                                        ¥Æ¥£¥Ã¥¯¥¿¥€¥Þ€¬ÀßÄꀵ€ì€Æ€€€ë */
241static CLOCK    ticktimer_left;         /* ¥Æ¥£¥Ã¥¯¥¿¥€¥Þ€Î»Ä€ê»þŽÖ */
242static bool_t   ovrtimer_active;        /* ¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€¬Í­žú */
243static OVRTIM   ovrtimer_left;          /* ¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€Î»Ä€ê»þŽÖ */
244
245#define CLOCK_TO_OVRTIM(clock)          ((OVRTIM) clock)
246#define OVRTIM_TO_CLOCK(ovrtim)         ((CLOCK) ovrtim)
247
248static const struct itimerval           itimerval_stop = {{ 0, 0 }, { 0, 0 }};
249
250/*
251 *  ¥¿¥€¥Þ€Îưºî³«»Ï
252 */
253Inline void
254itimer_start(void)
255{
256        struct itimerval        val;
257
258        /*
259         *  ¥¿¥€¥Þ€òÀßÄꀷ¡€¥¿¥€¥Þ€Îưºî€ò³«»Ï€¹€ë¡¥
260         */
261        if (!ovrtimer_active || CLOCK_TO_OVRTIM(ticktimer_left) <= ovrtimer_left) {
262                val.it_value.tv_sec = 0;
263                val.it_value.tv_usec = ticktimer_left;
264                itimer_ticktimer = true;
265        }
266        else {
267                val.it_value.tv_sec = 0;
268                val.it_value.tv_usec = OVRTIM_TO_CLOCK(ovrtimer_left);
269                itimer_ticktimer = false;
270        }
271        val.it_interval.tv_sec = 0;
272        val.it_interval.tv_usec = 0;
273        setitimer(ITIMER_REAL, &val, NULL);
274}
275
276/*
277 *  ¥¿¥€¥Þ€ÎưºîÄä»ß
278 */
279Inline void
280itimer_stop(void)
281{
282        struct itimerval        val;
283        CLOCK                           left;
284
285        /*
286         *  ¥¿¥€¥Þ€Îưºî€òÄä»ß€·¡€€œ€Î»þÅÀ€Î»Ä€ê»þŽÖ€òleft€ËŒè€êœÐ€¹¡¥»Ä€ê
287         *  »þŽÖ€¬0€Ë€Ê€Ã€Æ€€€ì€Ð1€ËÆÉ€ß޹€š€ë¡¥€³€Î»þ€Ë¡€¥¹¥×¥ê¥¢¥¹³ä¹þ€ß
288         *  €òȯÀž€µ€»€ë²ÄÇœÀ­€¬€¢€ë¡¥
289         */
290        setitimer(ITIMER_REAL, &itimerval_stop, &val);
291        left = val.it_value.tv_usec;
292        if (left == 0) {
293                left = 1;
294        }
295
296        /*
297         *  ¥¿¥€¥Þ€Î»Ä€ê»þŽÖ€«€é¡€¥Æ¥£¥Ã¥¯¥¿¥€¥Þ€È¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€Î»Ä€ê»þ
298         *  ŽÖ€òÀßÄꀷğ€¹¡¥
299         */
300        if (itimer_ticktimer) {
301                if (ovrtimer_active) {
302                        ovrtimer_left -= CLOCK_TO_OVRTIM(ticktimer_left - left);
303                }
304                ticktimer_left = left;
305        }
306        else {
307                ticktimer_left -= (OVRTIM_TO_CLOCK(ovrtimer_left) - left);
308                ovrtimer_left = CLOCK_TO_OVRTIM(left);
309        }
310}
311
312/*
313 *  ¥¿¥€¥Þ€Îµ¯Æ°œèÍý
314 */
315void
316target_timer_initialize(intptr_t exinf)
317{
318        ticktimer_cyc = TO_CLOCK(TIC_NUME, TIC_DENO);
319        assert(ticktimer_cyc <= MAX_CLOCK);
320
321        ticktimer_left = ticktimer_cyc;
322        ovrtimer_active = false;
323        itimer_start();
324}
325
326/*
327 *  ¥¿¥€¥Þ€ÎÄä»ßœèÍý
328 */
329void
330target_timer_terminate(intptr_t exinf)
331{
332        /*
333         *  ¥¿¥€¥Þ€Îưºî€òÄä»ß€¹€ë¡¥
334         */
335        setitimer(ITIMER_REAL, &itimerval_stop, NULL);
336}
337
338/*
339 *  ¥¿¥€¥Þ€ÎžœºßÃÍ€ÎÆÉœÐ€·
340 */
341CLOCK
342target_timer_get_current(void)
343{
344        struct itimerval        val;
345
346        if (itimer_ticktimer) {
347                getitimer(ITIMER_REAL, &val);
348                if (val.it_value.tv_usec == 0) {
349                        return(0);
350                }
351                else {
352                        return(TO_CLOCK(TIC_NUME, TIC_DENO) - val.it_value.tv_usec);
353                }
354        }
355        else {
356                getitimer(ITIMER_REAL, &val);
357                return(ticktimer_left - (OVRTIM_TO_CLOCK(ovrtimer_left)
358                                                                                                - val.it_value.tv_usec));
359        }
360}
361
362/*
363 *  ¥¿¥€¥Þ³ä¹þ€ßÍ×µá€Î¥Á¥§¥Ã¥¯
364 */
365bool_t
366target_timer_probe_int(void)
367{
368        struct itimerval        val;
369
370        if (itimer_ticktimer) {
371                getitimer(ITIMER_REAL, &val);
372                return(val.it_value.tv_usec == 0);
373        }
374        else {
375                return(false);
376        }
377}
378
379/*
380 *  ¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€ÎœéŽü²œœèÍý
381 *
382 *  ɬÍ׀ʜèÍý€ò€¹€Ù€Ætarget_timer_initialize€Ç¹Ô€Ã€Æ€€€ë€Î€Ç¡€€³€Á€é€Ç
383 *  €Ï²¿€â€·€Ê€€¡¥
384 */
385void
386target_ovrtimer_initialize(intptr_t exinf)
387{
388}
389
390/*
391 *  ¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€ÎÄä»ßœèÍý
392 *
393 *  ɬÍ׀ʜèÍý€ò€¹€Ù€Ætarget_timer_terminate€Ç¹Ô€Ã€Æ€€€ë€Î€Ç¡€€³€Á€é€Ç
394 *  €Ï²¿€â€·€Ê€€¡¥
395 */
396void
397target_ovrtimer_terminate(intptr_t exinf)
398{
399}
400
401/*
402 *  ¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€Îưºî³«»Ï
403 */
404void
405target_ovrtimer_start(OVRTIM ovrtim)
406{
407        assert(!ovrtimer_active);
408        itimer_stop();
409        ovrtimer_active = true;
410        ovrtimer_left = ovrtim;
411        itimer_start();
412}
413
414/*
415 *  ¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€ÎÄä»ß
416 */
417OVRTIM
418target_ovrtimer_stop(void)
419{
420        struct itimerval        val;
421
422        assert(ovrtimer_active);
423        if (itimer_ticktimer) {
424                getitimer(ITIMER_REAL, &val);
425                ovrtimer_left -= CLOCK_TO_OVRTIM(ticktimer_left
426                                                                                                - val.it_value.tv_usec);
427                if (ovrtimer_left == 0) {
428                        ovrtimer_left = 1;
429                }
430                ovrtimer_active = false;
431        }
432        else {
433                itimer_stop();
434                ovrtimer_active = false;
435                itimer_start();
436        }
437        return(ovrtimer_left);
438}
439
440/*
441 *  ¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€ÎžœºßÃÍ€ÎÆÉœÐ€·
442 */
443OVRTIM
444target_ovrtimer_get_current(void)
445{
446        struct itimerval        val;
447        OVRTIM                          ovrtimer_current;
448
449        assert(ovrtimer_active);
450        if (itimer_ticktimer) {
451                getitimer(ITIMER_REAL, &val);
452                ovrtimer_current = ovrtimer_left
453                                        - CLOCK_TO_OVRTIM(ticktimer_left - val.it_value.tv_usec);
454        }
455        else {
456                getitimer(ITIMER_REAL, &val);
457                ovrtimer_current = CLOCK_TO_OVRTIM(val.it_value.tv_usec);
458        }
459        return(ovrtimer_current);
460}
461
462/*
463 *  ¥¿¥€¥Þ³ä¹þ€ß¥Ï¥ó¥É¥é
464 *
465 *  ¥¿¥€¥Þ³ä¹þ€ß¥Ï¥ó¥É¥é€ÎÆþžýœèÍý€Ç¡€ovrtimer_stop€¬žÆ€ÓœÐ€µ€ì€ë¡¥¥ª¡Œ
466 *  ¥Ð¥é¥ó¥¿¥€¥Þ€¬Æ°ºî€·€Æ€€€¿Ÿì¹ç€Ë€Ï¡€€œ€³€«€étarget_ovrtimer_stop€¬
467 *  žÆ€ÓœÐ€µ€ì€ë¡¥¥€¥ó¥¿¡Œ¥Ð¥ë¥¿¥€¥Þ€Ë¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€¬ÀßÄꀵ€ì€Æ€€€¿
468 *  Ÿì¹ç€Ë€Ï¡€€œ€³€«€éitimer_stop€Èitimer_start€¬žÆ€ÓœÐ€µ€ì€Æ¡€¥€¥ó¥¿¡Œ
469 *  ¥Ð¥ë¥¿¥€¥Þ€Ë¥Æ¥£¥Ã¥¯¥¿¥€¥Þ€¬ÀßÄꀵ€ì¡€¥€¥ó¥¿¡Œ¥Ð¥ë¥¿¥€¥Þ€¬Æ°ºî³«»Ï
470 *  €µ€ì€ë¡¥µÕ€Ë¡€¥€¥ó¥¿¡Œ¥Ð¥ë¥¿¥€¥Þ€Ë¥Æ¥£¥Ã¥¯¥¿¥€¥Þ€¬ÀßÄꀵ€ì€Æ€€€¿Ÿì
471 *  ¹ç€Ë€Ï¡€¥€¥ó¥¿¡Œ¥Ð¥ë¥¿¥€¥Þ€ÏÄä»ß€·€¿€Þ€Þ€È€Ê€Ã€Æ€€€ë¡¥
472 */
473void
474target_timer_handler(void)
475{
476        struct itimerval                        val;
477
478        i_begin_int(INTNO_TIMER);
479        i_lock_cpu();
480        getitimer(ITIMER_REAL, &val);
481        if (val.it_value.tv_usec == 0) {
482                /*
483                 *  ¥€¥ó¥¿¡Œ¥Ð¥ë¥¿¥€¥Þ€¬Ää»ß€·€Æ€€€ë€Î€Ï¡€¥€¥ó¥¿¡Œ¥Ð¥ë¥¿¥€¥Þ€Ë
484                 *  ¥Æ¥£¥Ã¥¯¥¿¥€¥Þ€¬ÀßÄꀵ€ì€Æ€€€¿Ÿì¹ç€Ç€¢€ë¡¥
485                 */
486                ticktimer_left = ticktimer_cyc;
487
488                val.it_value.tv_sec = 0;
489                val.it_value.tv_usec = ticktimer_left;
490                val.it_interval.tv_sec = 0;
491                val.it_interval.tv_usec = 0;
492                setitimer(ITIMER_REAL, &val, NULL);
493
494                i_unlock_cpu();
495                signal_time();                          /* ¥¿¥€¥à¥Æ¥£¥Ã¥¯€Î¶¡µë */
496        }
497        else {
498                /*
499                 *  ¥€¥ó¥¿¡Œ¥Ð¥ë¥¿¥€¥Þ€¬Æ°ºî€·€Æ€€€ë€Î€Ï¡€¥€¥ó¥¿¡Œ¥Ð¥ë¥¿¥€¥Þ€Ë
500                 *  ¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€¬ÀßÄꀵ€ì€Æ€€€¿Ÿì¹ç€Ç€¢€ë¡¥
501                 */
502                if (p_runtsk->leftotm == 1) {
503                        /*
504                         *  ¥¹¥×¥ê¥¢¥¹³ä¹þ€ß€Ç€Ê€€Ÿì¹ç€Ë¡€¥ª¡Œ¥Ð¥é¥ó¥¿¥€¥Þ€òµ¯Æ°€¹
505                         *  €ë¡¥
506                         */
507                        i_unlock_cpu();
508                        call_ovrhdr();                  /* ¥ª¡Œ¥Ð¥é¥ó¥Ï¥ó¥É¥é€Îµ¯Æ° */
509                }
510                else {
511                        i_unlock_cpu();
512                }
513        }
514        i_end_int(INTNO_TIMER);
515}
516
517#endif /* TOPPERS_SUPPORT_OVRHDR */
詳しい使い方は TracBrowser を参照してください。