source: mypx/kernel/time_event.c

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

TOPPERS/ASP 1.9.1

ファイルサイズ: 9.4 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) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 *                              Toyohashi Univ. of Technology, JAPAN
8 *  Copyright (C) 2005-2013 by Embedded and Real-Time Systems Laboratory
9 *              Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 *  Ÿåµ­Ãøºîž¢ŒÔ€Ï¡€°Ê²Œ€Î(1)¡Á(4)€ÎŸò·ï€òËþ€¿€¹Ÿì¹ç€ËžÂ€ê¡€ËÜ¥œ¥Õ¥È¥Š¥§
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 *      ͳ€ËŽð€Å€¯ÀÁµá€«€é€â¡€Ÿåµ­Ãøºîž¢ŒÔ€ª€è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€ò
32 *      ÌÈÀÕ€¹€ë€³€È¡¥
33 *
34 *  ËÜ¥œ¥Õ¥È¥Š¥§¥¢€Ï¡€ÌµÊÝŸÚ€ÇÄó¶¡€µ€ì€Æ€€€ë€â€Î€Ç€¢€ë¡¥Ÿåµ­Ãøºîž¢ŒÔ€ª
35 *  €è€ÓTOPPERS¥×¥í¥ž¥§¥¯¥È€Ï¡€ËÜ¥œ¥Õ¥È¥Š¥§¥¢€ËŽØ€·€Æ¡€ÆÃÄê€Î»ÈÍÑÌÜŪ
36 *  €ËÂЀ¹€ëŬ¹çÀ­€âŽÞ€á€Æ¡€€€€«€Ê€ëÊÝŸÚ€â¹Ô€ï€Ê€€¡¥€Þ€¿¡€ËÜ¥œ¥Õ¥È¥Š¥§
37 *  ¥¢€ÎÍøÍрˀè€êÄŸÀÜŪ€Þ€¿€ÏŽÖÀÜŪ€ËÀž€ž€¿€€€«€Ê€ë»³²€ËŽØ€·€Æ€â¡€€œ
38 *  €ÎÀÕÇ€€òÉé€ï€Ê€€¡¥
39 *
40 *  $Id$
41 */
42
43/*
44 *              ¥¿¥€¥à¥€¥Ù¥ó¥ÈŽÉÍý¥â¥ž¥å¡Œ¥ë
45 */
46
47#include "kernel_impl.h"
48#include "time_event.h"
49
50/*
51 *  ¥¿¥€¥à¥€¥Ù¥ó¥È¥Ò¡Œ¥×Áàºî¥Þ¥¯¥í
52 */
53#define PARENT(index)           ((index) >> 1)          /* ¿Æ¥Î¡Œ¥É€òµá€á€ë */
54#define LCHILD(index)           ((index) << 1)          /* ºž€Î»Ò¥Î¡Œ¥É€òµá€á€ë */
55#define TMEVT_NODE(index)       (tmevt_heap[(index) - 1])
56
57/*
58 *  ¥€¥Ù¥ó¥ÈȯÀž»þ¹ïÈæ³Ó¥Þ¥¯¥í
59 *
60 *  ¥€¥Ù¥ó¥ÈȯÀž»þ¹ï€Ï¡€min_time€«€é€ÎÁêÂÐÃÍ€ÇÈæ³Ó€¹€ë¡¥€¹€Ê€ï€Á¡€
61 *  min_time€òºÇŸ®Ã͡ʺǀâ¶á€€»þ¹ï¡Ë¡€mit_time-1€¬ºÇÂçÃ͡ʺǀâ±ó€€»þ¹ï¡Ë
62 *  €È€ß€Ê€·€ÆÈæ³Ó€¹€ë¡¥
63 */
64#define EVTTIM_LT(t1, t2) (((t1) - min_time) < ((t2) - min_time))
65#define EVTTIM_LE(t1, t2) (((t1) - min_time) <= ((t2) - min_time))
66
67#ifdef TOPPERS_tmeini
68
69/*
70 *  žœºß€Î¥·¥¹¥Æ¥à»þ¹ï¡Êñ°Ì: 1¥ß¥êÉáË
71 *
72 *  ž·Ì©€Ë€Ï¡€Á°€Î¥¿¥€¥à¥Æ¥£¥Ã¥¯€Î¥·¥¹¥Æ¥à»þ¹ï¡¥
73 */
74EVTTIM  current_time;
75
76/*
77 *  ¥¿¥€¥à¥€¥Ù¥ó¥È¥Ò¡Œ¥×Ãæ€ÇÍ­žú€ÊºÇŸ®€Î¥·¥¹¥Æ¥à»þ¹ï¡Êñ°Ì: 1¥ß¥êÉáË
78 */
79EVTTIM  min_time;
80
81/*
82 *  Œ¡€Î¥¿¥€¥à¥Æ¥£¥Ã¥¯€Î¥·¥¹¥Æ¥à»þ¹ï¡Êñ°Ì: 1¥ß¥êÉáË
83 */
84EVTTIM  next_time;
85
86/*
87 *  ¥·¥¹¥Æ¥à»þ¹ïÀÑ»»ÍÑÊÑ¿ô¡Êñ°Ì: 1/TIC_DENO¥ß¥êÉáË
88 */
89#if TIC_DENO != 1U
90uint_t  next_subtime;
91#endif /* TIC_DENO != 1U */
92
93/*
94 *  ¥¿¥€¥à¥€¥Ù¥ó¥È¥Ò¡Œ¥×€ÎºÇžå€Î»ÈÍÑÎΰè€Î¥€¥ó¥Ç¥Ã¥¯¥¹
95 */
96uint_t  last_index;
97
98/*
99 *  ¥¿¥€¥Þ¥â¥ž¥å¡Œ¥ë€ÎœéŽü²œ
100 */
101void
102initialize_tmevt(void)
103{
104        current_time = 0U;
105        min_time = 0U;
106        next_time = current_time + TIC_NUME / TIC_DENO;
107#if TIC_DENO != 1U
108        next_subtime = TIC_NUME % TIC_DENO;
109#endif /* TIC_DENO != 1U */
110        last_index = 0U;
111}
112
113#endif /* TOPPERS_tmeini */
114
115/*
116 *  ¥¿¥€¥à¥€¥Ù¥ó¥È€ÎÁÞÆþ°ÌÃÖ€òŸåžþ€­€Ëõº÷
117 *
118 *  »þ¹ïtime€ËȯÀž€¹€ë¥¿¥€¥à¥€¥Ù¥ó¥È€òÁÞÆþ€¹€ë¥Î¡Œ¥É€ò¶õ€±€ë€¿€á€Ë¡€
119 *  ¥Ò¡Œ¥×€ÎŸå€Ëžþ€«€Ã€Æ¶õ¥Î¡Œ¥É€ò°Üư€µ€»€ë¡¥°ÜưÁ°€Î¶õ¥Î¡Œ¥É€Î°ÌÃÖ€ò
120 *  index€ËÅÏ€¹€È¡€°Üưžå€Î¶õ¥Î¡Œ¥É€Î°ÌÃÖ¡Ê€¹€Ê€ï€ÁÁÞÆþ°ÌÃÖ¡Ë€òÊÖ€¹¡¥
121 */
122#ifdef TOPPERS_tmeup
123
124uint_t
125tmevt_up(uint_t index, EVTTIM time)
126{
127        uint_t  parent;
128
129        while (index > 1) {
130                /*
131                 *  ¿Æ¥Î¡Œ¥É€Î¥€¥Ù¥ó¥ÈȯÀž»þ¹ï€ÎÊý€¬Áက¡Ê€Þ€¿€ÏƱ€ž¡Ë€Ê€é€Ð¡€
132                 *  index€¬ÁÞÆþ°ÌÃրʀ΀ǥ롌¥×€òÈŽ€±€ë¡¥
133                 */
134                parent = PARENT(index);
135                if (EVTTIM_LE(TMEVT_NODE(parent).time, time)) {
136                        break;
137                }
138
139                /*
140                 *  ¿Æ¥Î¡Œ¥É€òindex€Î°ÌÃÖ€Ë°ÜÆ°€µ€»€ë¡¥
141                 */
142                TMEVT_NODE(index) = TMEVT_NODE(parent);
143                TMEVT_NODE(index).p_tmevtb->index = index;
144
145                /*
146                 *  index€ò¿Æ¥Î¡Œ¥É€Î°ÌÃր˹¹¿·¡¥
147                 */
148                index = parent;
149        }
150        return(index);
151}
152
153#endif /* TOPPERS_tmeup */
154
155/*
156 *  ¥¿¥€¥à¥€¥Ù¥ó¥È€ÎÁÞÆþ°ÌÃÖ€ò²Œžþ€­€Ëõº÷
157 *
158 *  »þ¹ïtime€ËȯÀž€¹€ë¥¿¥€¥à¥€¥Ù¥ó¥È€òÁÞÆþ€¹€ë¥Î¡Œ¥É€ò¶õ€±€ë€¿€á€Ë¡€
159 *  ¥Ò¡Œ¥×€Î²Œ€Ëžþ€«€Ã€Æ¶õ¥Î¡Œ¥É€ò°Üư€µ€»€ë¡¥°ÜưÁ°€Î¶õ¥Î¡Œ¥É€Î°ÌÃÖ€ò
160 *  index€ËÅÏ€¹€È¡€°Üưžå€Î¶õ¥Î¡Œ¥É€Î°ÌÃÖ¡Ê€¹€Ê€ï€ÁÁÞÆþ°ÌÃÖ¡Ë€òÊÖ€¹¡¥
161 */
162#ifdef TOPPERS_tmedown
163
164uint_t
165tmevt_down(uint_t index, EVTTIM time)
166{
167        uint_t  child;
168
169        while ((child = LCHILD(index)) <= last_index) {
170                /*
171                 *  ºž±Š€Î»Ò¥Î¡Œ¥É€Î¥€¥Ù¥ó¥ÈȯÀž»þ¹ï€òÈæ³Ó€·¡€ÁကÊý€Î»Ò¥Î¡Œ¥É
172                 *  €Î°ÌÃÖ€òchild€ËÀßÄꀹ€ë¡¥°Ê²Œ€Î»Ò¥Î¡Œ¥É€Ï¡€€³€³€ÇÁª€Ð€ì€¿Êý
173                 *  €Î»Ò¥Î¡Œ¥É€Î€³€È¡¥
174                 */
175                if (child + 1 <= last_index
176                                                && EVTTIM_LT(TMEVT_NODE(child + 1).time,
177                                                                                TMEVT_NODE(child).time)) {
178                        child = child + 1;
179                }
180
181                /*
182                 *  »Ò¥Î¡Œ¥É€Î¥€¥Ù¥ó¥ÈȯÀž»þ¹ï€ÎÊý€¬ÃÙ€€¡Ê€Þ€¿€ÏƱ€ž¡Ë€Ê€é€Ð¡€
183                 *  index€¬ÁÞÆþ°ÌÃրʀ΀ǥ롌¥×€òÈŽ€±€ë¡¥
184                 */
185                if (EVTTIM_LE(time, TMEVT_NODE(child).time)) {
186                        break;
187                }
188
189                /*
190                 *  »Ò¥Î¡Œ¥É€òindex€Î°ÌÃÖ€Ë°ÜÆ°€µ€»€ë¡¥
191                 */
192                TMEVT_NODE(index) = TMEVT_NODE(child);
193                TMEVT_NODE(index).p_tmevtb->index = index;
194
195                /*
196                 *  index€ò»Ò¥Î¡Œ¥É€Î°ÌÃր˹¹¿·¡¥
197                 */
198                index = child;
199        }
200        return(index);
201}
202
203#endif /* TOPPERS_tmedown */
204
205/*
206 *  ¥¿¥€¥à¥€¥Ù¥ó¥È¥Ò¡Œ¥×€Ø€ÎÅÐÏ¿
207 *
208 *  p_tmevtb€Ç»ØÄꀷ€¿¥¿¥€¥à¥€¥Ù¥ó¥È¥Ö¥í¥Ã¥¯€ò¡€time€Ç»ØÄꀷ€¿»þŽÖ€¬·Ð
209 *  ²ážå€Ë¥€¥Ù¥ó¥È€¬È¯Àž€¹€ë€è€Š€Ë¡€¥¿¥€¥à¥€¥Ù¥ó¥È¥Ò¡Œ¥×€ËÅÐÏ¿€¹€ë¡¥
210 */
211#ifdef TOPPERS_tmeins
212
213void
214tmevtb_insert(TMEVTB *p_tmevtb, EVTTIM time)
215{
216        uint_t  index;
217
218        /*
219         *  last_index€ò¥€¥ó¥¯¥ê¥á¥ó¥È€·¡€€œ€³€«€éŸå€ËÁÞÆþ°ÌÃÖ€òõ€¹¡¥
220         */
221        index = tmevt_up(++last_index, time);
222
223        /*
224         *  ¥¿¥€¥à¥€¥Ù¥ó¥È€òindex€Î°ÌÃÖ€ËÁÞÆþ€¹€ë¡¥
225         */
226        TMEVT_NODE(index).time = time;
227        TMEVT_NODE(index).p_tmevtb = p_tmevtb;
228        p_tmevtb->index = index;
229}
230
231#endif /* TOPPERS_tmeins */
232
233/*
234 *  ¥¿¥€¥à¥€¥Ù¥ó¥È¥Ò¡Œ¥×€«€é€Îºïœü
235 */
236#ifdef TOPPERS_tmedel
237
238void
239tmevtb_delete(TMEVTB *p_tmevtb)
240{
241        uint_t  index = p_tmevtb->index;
242        uint_t  parent;
243        EVTTIM  event_time = TMEVT_NODE(last_index).time;
244
245        /*
246         *  ºïœü€Ë€è€ê¥¿¥€¥à¥€¥Ù¥ó¥È¥Ò¡Œ¥×€¬¶õ€Ë€Ê€ëŸì¹ç€Ï²¿€â€·€Ê€€¡¥
247         */
248        if (--last_index == 0) {
249                return;
250        }
251
252        /*
253         *  ºïœü€·€¿¥Î¡Œ¥É€Î°ÌÃր˺Ǟå€Î¥Î¡Œ¥É¡Êlast_index+1€Î°ÌÃրΥΡŒ¥É¡Ë
254         *  €òÁÞÆþ€·¡€€œ€ì€òŬÀڀʰÌÃÖ€Ø°ÜÆ°€µ€»€ë¡¥ŒÂºÝ€Ë€Ï¡€ºÇžå€Î¥Î¡Œ¥É
255         *  €òŒÂºÝ€ËÁÞÆþ€¹€ë€Î€Ç€Ï€Ê€¯¡€ºïœü€·€¿¥Î¡Œ¥É€Î°ÌÃÖ€¬¶õ¥Î¡Œ¥É€Ë€Ê
256         *  €ë€Î€Ç¡€ºÇžå€Î¥Î¡Œ¥É€òÁÞÆþ€¹€Ù€­°ÌÃր؞þ€±€Æ¶õ¥Î¡Œ¥É€ò°Üư€µ€»
257         *  €ë¡¥
258         *  ºÇžå€Î¥Î¡Œ¥É€Î¥€¥Ù¥ó¥ÈȯÀž»þ¹ï€¬¡€ºïœü€·€¿¥Î¡Œ¥É€Î¿Æ¥Î¡Œ¥É€Î¥€
259         *  ¥Ù¥ó¥ÈȯÀž»þ¹ï€è€êÁ°€ÎŸì¹ç€Ë€Ï¡€Ÿå€Ëžþ€«€Ã€ÆÁÞÆþ°ÌÃÖ€òõ€¹¡¥€œ
260         *  €Š€Ç€Ê€€Ÿì¹ç€Ë€Ï¡€²Œ€Ëžþ€«€Ã€ÆÃµ€¹¡¥
261         */
262        if (index > 1 && EVTTIM_LT(event_time,
263                                                                TMEVT_NODE(parent = PARENT(index)).time)) {
264                /*
265                 *  ¿Æ¥Î¡Œ¥É€òindex€Î°ÌÃÖ€Ë°ÜÆ°€µ€»€ë¡¥
266                 */
267                TMEVT_NODE(index) = TMEVT_NODE(parent);
268                TMEVT_NODE(index).p_tmevtb->index = index;
269
270                /*
271                 *  ºïœü€·€¿¥Î¡Œ¥É€Î¿Æ¥Î¡Œ¥É€«€éŸå€Ëžþ€«€Ã€ÆÁÞÆþ°ÌÃÖ€òõ€¹¡¥
272                 */
273                index = tmevt_up(parent, event_time);
274        }
275        else {
276                /*
277                 *  ºïœü€·€¿¥Î¡Œ¥É€«€é²Œ€Ëžþ€«€Ã€ÆÁÞÆþ°ÌÃÖ€òõ€¹¡¥
278                 */
279                index = tmevt_down(index, event_time);
280        }
281
282        /*
283         *  ºÇžå€Î¥Î¡Œ¥É€òindex€Î°ÌÃÖ€ËÁÞÆþ€¹€ë¡¥
284         */
285        TMEVT_NODE(index) = TMEVT_NODE(last_index + 1);
286        TMEVT_NODE(index).p_tmevtb->index = index;
287}
288
289#endif /* TOPPERS_tmedel */
290
291/*
292 *  ¥¿¥€¥à¥€¥Ù¥ó¥È¥Ò¡Œ¥×€ÎÀèÆ¬€Î¥Î¡Œ¥É€Îºïœü
293 */
294Inline void
295tmevtb_delete_top(void)
296{
297        uint_t  index;
298        EVTTIM  event_time = TMEVT_NODE(last_index).time;
299
300        /*
301         *  ºïœü€Ë€è€ê¥¿¥€¥à¥€¥Ù¥ó¥È¥Ò¡Œ¥×€¬¶õ€Ë€Ê€ëŸì¹ç€Ï²¿€â€·€Ê€€¡¥
302         */
303        if (--last_index == 0) {
304                return;
305        }
306
307        /*
308         *  ¥ë¡Œ¥È¥Î¡Œ¥É€ËºÇžå€Î¥Î¡Œ¥É¡Êlast_index + 1 €Î°ÌÃրΥΡŒ¥É¡Ë€ò
309         *  ÁÞÆþ€·¡€€œ€ì€òŬÀڀʰÌÃÖ€Ø°ÜÆ°€µ€»€ë¡¥ŒÂºÝ€Ë€Ï¡€ºÇžå€Î¥Î¡Œ¥É€ò
310         *  ŒÂºÝ€ËÁÞÆþ€¹€ë€Î€Ç€Ï€Ê€¯¡€¥ë¡Œ¥È¥Î¡Œ¥É€¬¶õ¥Î¡Œ¥É€Ë€Ê€ë€Î€Ç¡€ºÇ
311         *  žå€Î¥Î¡Œ¥É€òÁÞÆþ€¹€Ù€­°ÌÃր؞þ€±€Æ¶õ¥Î¡Œ¥É€ò°Üư€µ€»€ë¡¥
312         */
313        index = tmevt_down(1, event_time);
314
315        /*
316         *  ºÇžå€Î¥Î¡Œ¥É€òindex€Î°ÌÃÖ€ËÁÞÆþ€¹€ë¡¥
317         */
318        TMEVT_NODE(index) = TMEVT_NODE(last_index + 1);
319        TMEVT_NODE(index).p_tmevtb->index = index;
320}
321
322/*
323 *  ¥¿¥€¥à¥€¥Ù¥ó¥È€Þ€Ç€Î»Ä€ê»þŽÖ€Î·×»»
324 */
325#ifdef TOPPERS_tmeltim
326
327RELTIM
328tmevt_lefttim(TMEVTB *p_tmevtb)
329{
330        EVTTIM  time;
331
332        time = TMEVT_NODE(p_tmevtb->index).time;
333        if (EVTTIM_LE(time, next_time)) {
334                /*
335                 *  Œ¡€Î¥¿¥€¥à¥Æ¥£¥Ã¥¯€ÇœèÍý€µ€ì€ëŸì¹ç€Ë€Ï0€òÊÖ€¹¡¥
336                 */
337                return(0U);
338        }
339        else {
340                return((RELTIM)(time - base_time));
341        }
342}
343
344#endif /* TOPPERS_tmeltim */
345
346/*
347 *  ¥¿¥€¥à¥Æ¥£¥Ã¥¯€Î¶¡µë
348 */
349#ifdef TOPPERS_sigtim
350
351void
352signal_time(void)
353{
354        TMEVTB  *p_tmevtb;
355
356        assert(sense_context());
357        assert(!i_sense_lock());
358
359        i_lock_cpu();
360
361        /*
362         *  current_time€ò¹¹¿·€¹€ë¡¥
363         */
364        current_time = next_time;
365
366        /*
367         *  next_time¡€next_subtime€ò¹¹¿·€¹€ë¡¥
368         */
369#if TIC_DENO == 1U
370        next_time = current_time + TIC_NUME;
371#else /* TIC_DENO == 1U */
372        next_subtime += TIC_NUME % TIC_DENO;
373        next_time = current_time + TIC_NUME / TIC_DENO;
374        if (next_subtime >= TIC_DENO) {
375                next_subtime -= TIC_DENO;
376                next_time += 1U;
377        }
378#endif /* TIC_DENO == 1U */
379
380        /*
381         *  current_time€è€ê¥€¥Ù¥ó¥ÈȯÀž»þ¹ï€ÎÁက¡Ê€Þ€¿€ÏƱ€ž¡Ë¥¿¥€¥à¥€¥Ù
382         *  ¥ó¥È€ò¡€¥¿¥€¥à¥€¥Ù¥ó¥È¥Ò¡Œ¥×€«€éºïœü€·¡€¥³¡Œ¥ë¥Ð¥Ã¥¯ŽØ¿ô€òžÆ€Ó
383         *  œÐ€¹¡¥
384         */
385        while (last_index > 0 && EVTTIM_LE(TMEVT_NODE(1).time, current_time)) {
386                p_tmevtb = TMEVT_NODE(1).p_tmevtb;
387                tmevtb_delete_top();
388                (*(p_tmevtb->callback))(p_tmevtb->arg);
389        }
390
391        /*
392         *  min_time€ò¹¹¿·€¹€ë¡¥
393         */
394        min_time = current_time;
395
396        i_unlock_cpu();
397}
398
399#endif /* TOPPERS_sigtim */
詳しい使い方は TracBrowser を参照してください。