source: asp3_wo_tecs/trunk/kernel/time_event.c@ 302

Last change on this file since 302 was 302, checked in by ertl-honda, 7 years ago

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

File size: 17.2 KB
Line 
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-2015 by Embedded and Real-Time Systems Laboratory
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 *
11 * 上記著作権者
12は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
13 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
14 * 変・再é…
15å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
16 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
17 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
18 * スコード中に含まれていること.
19 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
20 * 用できる形で再é…
21å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
22å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
23 * 者
24マニュアルなど)に,上記の著作権表示,この利用条件および下記
25 * の無保証規定を掲載すること.
26 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
27 * 用できない形で再é…
28å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
29 * と.
30 * (a) 再é…
31å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
32マニュアルなど)に,上記の著
33 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
34 * (b) 再é…
35å¸ƒã®å½¢æ…
36‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
37 * 報告すること.
38 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
39 * 害からも,上記著作権者
40およびTOPPERSプロジェクトをå…
41è²¬ã™ã‚‹ã“と.
42 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
43 * 由に基づく請求からも,上記著作権者
44およびTOPPERSプロジェクトを
45 * å…
46è²¬ã™ã‚‹ã“と.
47 *
48 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
49お
50 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
51 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
52 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
53 * の責任を負わない.
54 *
55 * $Id: time_event.c 451 2015-08-14 15:29:07Z ertl-hiro $
56 */
57
58/*
59 * タイムイベント管理モジュール
60 */
61
62#include "kernel_impl.h"
63#include "time_event.h"
64
65/*
66 * TSTEP_HRTCNTの範囲チェック
67 */
68#if TSTEP_HRTCNT > 4000U
69#error TSTEP_HRTCNT is too large.
70#endif /* TSTEP_HRTCNT > 4000U */
71
72/*
73 * HRTCNT_BOUNDの範囲チェック
74 */
75#if HRTCNT_BOUND >= 4294000000U
76#error HRTCNT_BOUND is too large.
77#endif /* HRTCNT_BOUND >= 4294000000U */
78
79#ifdef TCYC_HRTCNT
80#if HRTCNT_BOUND >= TCYC_HRTCNT
81#error HRTCNT_BOUND is too large.
82#endif /* HRTCNT_BOUND >= TCYC_HRTCNT */
83#endif /* TCYC_HRTCNT */
84
85/*
86 * タイムイベントヒープ操作マクロ
87 *
88 * PARENTとCHILDの素直な定義は次の通りであるが,より実行効率の良いマク
89 * ロ定義としている.
90 * #define PARENT(p_tmevtn) (tmevt_heap + (((p_tmevtn) - tmevt_heap) >> 1))
91 * #define LCHILD(p_tmevtn) (tmevt_heap + (((p_tmevtn) - tmevt_heap) << 1))
92 *
93 * 下のPARENTの定義は,TMEVTNのé…
94åˆ—が,sizeof(TMEVTN)の単位でアライン
95 * されていることを想定している.この前提が成立しない場合は,上の定義
96 * を使用する必
97要がある.
98 */
99#define PARENT(p_tmevtn) /* 親ノードを求める */ \
100 ((TMEVTN *)(((((uintptr_t) tmevt_heap) \
101 + ((uintptr_t)(p_tmevtn))) >> 1) & ~(sizeof(TMEVTN) - 1)))
102#define LCHILD(p_tmevtn) /* 左の子ノードを求める */ \
103 ((TMEVTN *)((((uintptr_t)(p_tmevtn)) << 1) - ((uintptr_t) tmevt_heap)))
104
105/*
106 * タイムイベントヒープ中のå…
107ˆé ­ã®ãƒŽãƒ¼ãƒ‰
108 */
109#define p_top_tmevtn (&(tmevt_heap[1]))
110#define top_evttim (tmevt_heap[1].p_tmevtb->evttim)
111 /* å…
112ˆé ­ã®ã‚¿ã‚¤ãƒ ã‚¤ãƒ™ãƒ³ãƒˆã®ç™ºç”Ÿæ™‚刻 */
113/*
114 * タイムイベントヒープ中の最後のノード
115 */
116#define p_last_tmevtn (tmevt_heap[0].p_last)
117
118/*
119 * イベント時刻の前後関係の判定[ASPD1009]
120 *
121 * イベント時刻は,boundary_evttimからの相対値で比較する.すなわち,
122 * boundary_evttimを最も早い時刻,boundary_evttim−1が最も遅
123い時刻とみ
124 * なして比較する.
125 */
126#define EVTTIM_ADVANCE(t) ((t) - boundary_evttim)
127#define EVTTIM_LT(t1, t2) (EVTTIM_ADVANCE(t1) < EVTTIM_ADVANCE(t2))
128#define EVTTIM_LE(t1, t2) (EVTTIM_ADVANCE(t1) <= EVTTIM_ADVANCE(t2))
129
130#ifdef TOPPERS_tmeini
131
132/*
133 * 境界イベント時刻[ASPD1008]
134 */
135EVTTIM boundary_evttim;
136
137/*
138 * 最後に現在時刻を算出した時点でのイベント時刻[ASPD1012]
139 */
140EVTTIM current_evttim;
141
142/*
143 * 最後に現在時刻を算出した時点での高分解能タイマのカウント値[ASPD1012]
144 */
145HRTCNT current_hrtcnt;
146
147/*
148 * 最も進んでいた時のイベント時刻[ASPD1041]
149 */
150EVTTIM monotonic_evttim;
151
152/*
153 * システム時刻のオフセット[ASPD1043]
154 */
155SYSTIM systim_offset;
156
157/*
158 * 高分解能タイマ割込みの処理中であることを示すフラグ[ASPD1032]
159 */
160bool_t in_signal_time;
161
162/*
163 * タイムイベント管理モジュールの初期化[ASPD1061]
164 */
165void
166initialize_tmevt(void)
167{
168 current_evttim = 0U; /*ï¼»ASPD1047ï¼½*/
169 boundary_evttim = current_evttim - BOUNDARY_MARGIN;
170 /*ï¼»ASPD1048ï¼½*/
171 monotonic_evttim = 0U; /*ï¼»ASPD1046ï¼½*/
172 systim_offset = 0U; /*ï¼»ASPD1044ï¼½*/
173 in_signal_time = false; /*ï¼»ASPD1033ï¼½*/
174 p_last_tmevtn = tmevt_heap;
175}
176
177#endif /* TOPPERS_tmeini */
178
179/*
180 * タイムイベントの挿å…
181¥ä½ç½®ã‚’上向きに探索
182 *
183 * 時刻evttimに発生するタイムイベントを挿å…
184¥ã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’空けるために,
185 * ヒープの上に向かって空ノードを移動させる.移動前の空ノードの位置を
186 * p_tmevtnに渡すと,移動後の空ノードの位置(すなわち挿å…
187¥ä½ç½®ï¼‰ã‚’返す.
188 */
189#ifdef TOPPERS_tmeup
190
191TMEVTN *
192tmevt_up(TMEVTN *p_tmevtn, EVTTIM evttim)
193{
194 TMEVTN *p_parent;
195
196 while (p_tmevtn > p_top_tmevtn) {
197 /*
198 * 親ノードのイベント発生時刻の方が早い(または同じ)ならば,
199 * p_tmevtnが挿å…
200¥ä½ç½®ãªã®ã§ãƒ«ãƒ¼ãƒ—を抜ける.
201 */
202 p_parent = PARENT(p_tmevtn);
203 if (EVTTIM_LE(p_parent->p_tmevtb->evttim, evttim)) {
204 break;
205 }
206
207 /*
208 * 親ノードをp_tmevtnの位置に移動させる.
209 */
210 *p_tmevtn = *p_parent;
211 p_tmevtn->p_tmevtb->p_tmevtn = p_tmevtn;
212
213 /*
214 * p_tmevtnを親ノードの位置に更新.
215 */
216 p_tmevtn = p_parent;
217 }
218 return(p_tmevtn);
219}
220
221#endif /* TOPPERS_tmeup */
222
223/*
224 * タイムイベントの挿å…
225¥ä½ç½®ã‚’下向きに探索
226 *
227 * 時刻evttimに発生するタイムイベントを挿å…
228¥ã™ã‚‹ãƒŽãƒ¼ãƒ‰ã‚’空けるために,
229 * ヒープの下に向かって空ノードを移動させる.移動前の空ノードの位置を
230 * p_tmevtnに渡すと,移動後の空ノードの位置(すなわち挿å…
231¥ä½ç½®ï¼‰ã‚’返す.
232 */
233#ifdef TOPPERS_tmedown
234
235TMEVTN *
236tmevt_down(TMEVTN *p_tmevtn, EVTTIM evttim)
237{
238 TMEVTN *p_child;
239
240 while ((p_child = LCHILD(p_tmevtn)) <= p_last_tmevtn) {
241 /*
242 * 左右の子ノードのイベント発生時刻を比較し,早い方の子ノード
243 * の位置をp_childに設定する.以下の子ノードは,ここで選ばれた
244 * 方の子ノードのこと.
245 */
246 if (p_child + 1 <= p_last_tmevtn
247 && EVTTIM_LT((p_child + 1)->p_tmevtb->evttim,
248 p_child->p_tmevtb->evttim)) {
249 p_child = p_child + 1;
250 }
251
252 /*
253 * 子ノードのイベント発生時刻の方が遅
254い(または同じ)ならば,
255 * p_tmevtnが挿å…
256¥ä½ç½®ãªã®ã§ãƒ«ãƒ¼ãƒ—を抜ける.
257 */
258 if (EVTTIM_LE(evttim, p_child->p_tmevtb->evttim)) {
259 break;
260 }
261
262 /*
263 * 子ノードをp_tmevtnの位置に移動させる.
264 */
265 *p_tmevtn = *p_child;
266 p_tmevtn->p_tmevtb->p_tmevtn = p_tmevtn;
267
268 /*
269 * p_tmevtnを子ノードの位置に更新.
270 */
271 p_tmevtn = p_child;
272 }
273 return(p_tmevtn);
274}
275
276#endif /* TOPPERS_tmedown */
277
278/*
279 * タイムイベントヒープへの追加
280 *
281 * p_tmevtbで指定したタイムイベントブロックを,タイムイベントヒープに
282 * 追加する.
283 */
284Inline void
285tmevtb_insert(TMEVTB *p_tmevtb)
286{
287 TMEVTN *p_tmevtn;
288
289 /*
290 * p_last_tmevtnをインクリメントし,そこから上に挿å…
291¥ä½ç½®ã‚’探す.
292 */
293 p_tmevtn = tmevt_up(++p_last_tmevtn, p_tmevtb->evttim);
294
295 /*
296 * タイムイベントをp_tmevtnの位置に挿å…
297¥ã™ã‚‹ï¼Ž
298 */
299 p_tmevtn->p_tmevtb = p_tmevtb;
300 p_tmevtb->p_tmevtn = p_tmevtn;
301}
302
303/*
304 * タイムイベントヒープからの削除
305 */
306Inline void
307tmevtb_delete(TMEVTB *p_tmevtb)
308{
309 TMEVTN *p_tmevtn = p_tmevtb->p_tmevtn;
310 TMEVTN *p_parent;
311 EVTTIM event_evttim;
312
313 /*
314 * 削除によりタイムイベントヒープが空になる場合は何もしない.
315 */
316 if (--p_last_tmevtn < p_top_tmevtn) {
317 return;
318 }
319
320 /*
321 * 削除したノードの位置に最後のノード(p_last_tmevtn + 1 の位置の
322 * ノード)を挿å…
323¥ã—,それを適切な位置へ移動させる.実際には,最後
324 * のノードを実際に挿å…
325¥ã™ã‚‹ã®ã§ã¯ãªãï¼Œå‰Šé™¤ã—たノードの位置が空ノー
326 * ドになるので,最後のノードを挿å…
327¥ã™ã¹ãä½ç½®ã¸å‘けて空ノードを移
328 * 動させる.
329 *
330 * 最後のノードのイベント発生時刻が,削除したノードの親ノードのイ
331 * ベント発生時刻より前の場合には,上に向かって挿å…
332¥ä½ç½®ã‚’探す.そ
333 * うでない場合には,下に向かって探す.
334 */
335 event_evttim = (p_last_tmevtn + 1)->p_tmevtb->evttim;
336 if (p_tmevtn > p_top_tmevtn
337 && EVTTIM_LT(event_evttim,
338 (p_parent = PARENT(p_tmevtn))->p_tmevtb->evttim)) {
339 /*
340 * 親ノードをp_tmevtnの位置に移動させる.
341 */
342 *p_tmevtn = *p_parent;
343 p_tmevtn->p_tmevtb->p_tmevtn = p_tmevtn;
344
345 /*
346 * 削除したノードの親ノードから上に向かって挿å…
347¥ä½ç½®ã‚’探す.
348 */
349 p_tmevtn = tmevt_up(p_parent, event_evttim);
350 }
351 else {
352 /*
353 * 削除したノードから下に向かって挿å…
354¥ä½ç½®ã‚’探す.
355 */
356 p_tmevtn = tmevt_down(p_tmevtn, event_evttim);
357 }
358
359 /*
360 * 最後のノードをp_tmevtnの位置に挿å…
361¥ã™ã‚‹ï¼Ž
362 */
363 *p_tmevtn = *(p_last_tmevtn + 1);
364 p_tmevtn->p_tmevtb->p_tmevtn = p_tmevtn;
365}
366
367/*
368 * タイムイベントヒープのå…
369ˆé ­ã®ãƒŽãƒ¼ãƒ‰ã®å‰Šé™¤
370 */
371Inline TMEVTB *
372tmevtb_delete_top(void)
373{
374 TMEVTN *p_tmevtn;
375 TMEVTB *p_top_tmevtb = p_top_tmevtn->p_tmevtb;
376 EVTTIM event_evttim;
377
378 /*
379 * 削除によりタイムイベントヒープが空になる場合は何もしない.
380 */
381 if (--p_last_tmevtn >= p_top_tmevtn) {
382 /*
383 * ルートノードに最後のノード(p_last_tmevtn + 1 の位置のノー
384 * ド)を挿å…
385¥ã—,それを適切な位置へ移動させる.実際には,最後
386 * のノードを実際に挿å…
387¥ã™ã‚‹ã®ã§ã¯ãªãï¼Œãƒ«ãƒ¼ãƒˆãƒŽãƒ¼ãƒ‰ãŒç©ºãƒŽãƒ¼ãƒ‰
388 * になるので,最後のノードを挿å…
389¥ã™ã¹ãä½ç½®ã¸å‘けて空ノードを
390 * 移動させる.
391 */
392 event_evttim = (p_last_tmevtn + 1)->p_tmevtb->evttim;
393 p_tmevtn = tmevt_down(p_top_tmevtn, event_evttim);
394
395 /*
396 * 最後のノードをp_tmevtnの位置に挿å…
397¥ã™ã‚‹ï¼Ž
398 */
399 *p_tmevtn = *(p_last_tmevtn + 1);
400 p_tmevtn->p_tmevtb->p_tmevtn = p_tmevtn;
401 }
402 return(p_top_tmevtb);
403}
404
405/*
406 * 現在のイベント時刻の更新
407 */
408#ifdef TOPPERS_tmecur
409
410void
411update_current_evttim(void)
412{
413 HRTCNT new_hrtcnt, hrtcnt_advance;
414 EVTTIM previous_evttim;
415
416 new_hrtcnt = target_hrt_get_current(); /*ï¼»ASPD1013ï¼½*/
417 hrtcnt_advance = new_hrtcnt - current_hrtcnt; /*ï¼»ASPD1014ï¼½*/
418#ifdef TCYC_HRTCNT
419 if (new_hrtcnt < current_hrtcnt) {
420 hrtcnt_advance += TCYC_HRTCNT;
421 }
422#endif /* TCYC_HRTCNT */
423
424 previous_evttim = current_evttim;
425 current_evttim += (EVTTIM) hrtcnt_advance; /*ï¼»ASPD1015ï¼½*/
426 current_hrtcnt = new_hrtcnt; /*ï¼»ASPD1016ï¼½*/
427 boundary_evttim = current_evttim - BOUNDARY_MARGIN; /*ï¼»ASPD1011ï¼½*/
428
429 if (monotonic_evttim - previous_evttim < (EVTTIM) hrtcnt_advance) {
430#ifdef UINT64_MAX
431 if (current_evttim < monotonic_evttim) {
432 systim_offset += 1LLU << 32; /*ï¼»ASPD1045ï¼½*/
433 }
434#endif /* UINT64_MAX */
435 monotonic_evttim = current_evttim; /*ï¼»ASPD1042ï¼½*/
436 }
437}
438
439#endif /* TOPPERS_tmecur */
440
441/*
442 * 現在のイベント時刻を遅
443い方に丸めたイベント時刻の算出[ASPD1027]
444 *
445 * 現在のイベント時刻を更新した後に呼ぶことを想定している.
446 */
447Inline EVTTIM
448calc_current_evttim_ub(void)
449{
450 return(current_evttim + ((EVTTIM) TSTEP_HRTCNT));
451}
452
453/*
454 * 高分解能タイマ割込みの発生タイミングの設定
455 */
456#ifdef TOPPERS_tmeset
457
458void
459set_hrt_event(void)
460{
461 HRTCNT hrtcnt;
462
463 if (p_last_tmevtn < p_top_tmevtn) {
464 target_hrt_set_event(HRTCNT_BOUND); /*ï¼»ASPD1007ï¼½*/
465 }
466 else if (EVTTIM_LE(top_evttim, current_evttim)) {
467 target_hrt_raise_event(); /*ï¼»ASPD1017ï¼½*/
468 }
469 else {
470 hrtcnt = (HRTCNT)(top_evttim - current_evttim);
471 if (hrtcnt > HRTCNT_BOUND) {
472 target_hrt_set_event(HRTCNT_BOUND); /*ï¼»ASPD1006ï¼½*/
473 }
474 else {
475 target_hrt_set_event(hrtcnt); /*ï¼»ASPD1002ï¼½*/
476 }
477 }
478}
479
480#endif /* TOPPERS_tmeset */
481
482/*
483 * タイムイベントブロックのヒープへの挿å…
484¥
485 */
486#ifdef TOPPERS_tmereg
487
488void
489tmevtb_register(TMEVTB *p_tmevtb)
490{
491 tmevtb_insert(p_tmevtb);
492}
493
494#endif /* TOPPERS_tmereg */
495
496/*
497 * 相対時間指定によるタイムイベントの登録
498 *
499 */
500#ifdef TOPPERS_tmeenq
501
502void
503tmevtb_enqueue(TMEVTB *p_tmevtb, RELTIM time)
504{
505 /*
506 * 現在のイベント時刻とタイムイベントの発生時刻を求める[ASPD1026].
507 */
508 update_current_evttim();
509 p_tmevtb->evttim = calc_current_evttim_ub() + time;
510
511 /*
512 * タイムイベントブロックをヒープに挿å…
513¥ã™ã‚‹ï¼»ASPD1030].
514 */
515 tmevtb_insert(p_tmevtb);
516
517 /*
518 * 高分解能タイマ割込みの発生タイミングを設定する[ASPD1031]
519 * [ASPD1034].
520 */
521 if (!in_signal_time && p_tmevtb->p_tmevtn == p_top_tmevtn) {
522 set_hrt_event();
523 }
524}
525
526#endif /* TOPPERS_tmeenq */
527
528/*
529 * タイムイベントの登録解除
530 */
531#ifdef TOPPERS_tmedeq
532
533void
534tmevtb_dequeue(TMEVTB *p_tmevtb)
535{
536 TMEVTN *p_tmevtn;
537
538 /*
539 * タイムイベントブロックをヒープから削除する[ASPD1039].
540 */
541 p_tmevtn = p_tmevtb->p_tmevtn;
542 tmevtb_delete(p_tmevtb);
543
544 /*
545 * 高分解能タイマ割込みの発生タイミングを設定する[ASPD1040].
546 */
547 if (!in_signal_time && p_tmevtn == p_top_tmevtn) {
548 update_current_evttim();
549 set_hrt_event();
550 }
551}
552
553#endif /* TOPPERS_tmedeq */
554
555/*
556 * システム時刻の調整時のエラーチェック
557 */
558#ifdef TOPPERS_tmechk
559
560bool_t
561check_adjtim(int_t adjtim)
562{
563 if (adjtim > 0) {
564 return(p_last_tmevtn >= p_top_tmevtn /*ï¼»NGKI3588ï¼½*/
565 && EVTTIM_LE(top_evttim, current_evttim - TMAX_ADJTIM));
566 }
567 else if (adjtim < 0) { /*ï¼»NGKI3589ï¼½*/
568 return(monotonic_evttim - current_evttim >= -TMIN_ADJTIM);
569 }
570 return(false);
571}
572
573#endif /* TOPPERS_tmechk */
574
575/*
576 * タイムイベントが発生するまでの時間の計算
577 */
578#ifdef TOPPERS_tmeltim
579
580RELTIM
581tmevt_lefttim(TMEVTB *p_tmevtb)
582{
583 EVTTIM evttim, current_evttim_ub;
584
585 /*
586 * 現在のイベント時刻を遅
587い方に丸めた時刻を求める[ASPD1050].
588 */
589 update_current_evttim();
590 current_evttim_ub = calc_current_evttim_ub();
591
592 /*
593 * タイムイベント発生までの相対時間を求める[ASPD1049].
594 */
595 evttim = p_tmevtb->evttim;
596 if (EVTTIM_LE(evttim, current_evttim_ub)) {
597 /*
598 * タイムイベントの発生時刻を過ぎている場合には0を返す[NGKI0552].
599 */
600 return(0U);
601 }
602 else {
603 return((RELTIM)(evttim - current_evttim_ub));
604 }
605}
606
607#endif /* TOPPERS_tmeltim */
608
609/*
610 * 高分解能タイマ割込みの処理
611 */
612#ifdef TOPPERS_sigtim
613
614void
615signal_time(void)
616{
617 TMEVTB *p_tmevtb;
618 bool_t callflag;
619
620 assert(sense_context());
621 assert(!sense_lock());
622
623 lock_cpu();
624 in_signal_time = true; /*ï¼»ASPD1033ï¼½*/
625
626 do {
627 /*
628 * コールバック関数を呼び出さなければループを抜ける[ASPD1020].
629 */
630 callflag = false;
631
632 /*
633 * 現在のイベント時刻を求める[ASPD1022].
634 */
635 update_current_evttim();
636
637 /*
638 * 発生時刻がcurrent_evttim以前のタイムイベントがあれば,タイ
639 * ムイベントヒープから削除し,コールバック関数を呼び出す
640 * [ASPD1018][ASPD1019].
641 */
642 while (p_last_tmevtn >= p_top_tmevtn
643 && EVTTIM_LE(top_evttim, current_evttim)) {
644 p_tmevtb = tmevtb_delete_top();
645 (*(p_tmevtb->callback))(p_tmevtb->arg);
646 callflag = true;
647 }
648 } while (callflag); /*ï¼»ASPD1020ï¼½*/
649
650 /*
651 * 高分解能タイマ割込みの発生タイミングを設定する[ASPD1025].
652 */
653 set_hrt_event();
654
655 in_signal_time = false; /*ï¼»ASPD1033ï¼½*/
656 unlock_cpu();
657}
658
659#endif /* TOPPERS_sigtim */
Note: See TracBrowser for help on using the repository browser.