source: asp3_gr_sakura/trunk/kernel/interrupt.c@ 317

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

GR-SAKURA向けASP3を追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 15.4 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-2017 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: interrupt.c 317 2017-08-03 13:14:26Z coas-nagasima $
56 */
57
58/*
59 * 割込み管理機能
60 */
61
62#include "kernel_impl.h"
63#include "check.h"
64#include "task.h"
65#include "interrupt.h"
66#include "overrun.h"
67
68/*
69 * トレースログマクロのデフォルト定義
70 */
71#ifndef LOG_ISR_ENTER
72#define LOG_ISR_ENTER(isrid)
73#endif /* LOG_ISR_ENTER */
74
75#ifndef LOG_ISR_LEAVE
76#define LOG_ISR_LEAVE(isrid)
77#endif /* LOG_ISR_LEAVE */
78
79#ifndef LOG_ACRE_ISR_ENTER
80#define LOG_ACRE_ISR_ENTER(pk_cisr)
81#endif /* LOG_ACRE_ISR_ENTER */
82
83#ifndef LOG_ACRE_ISR_LEAVE
84#define LOG_ACRE_ISR_LEAVE(ercd)
85#endif /* LOG_ACRE_ISR_LEAVE */
86
87#ifndef LOG_DEL_ISR_ENTER
88#define LOG_DEL_ISR_ENTER(isrid)
89#endif /* LOG_DEL_ISR_ENTER */
90
91#ifndef LOG_DEL_ISR_LEAVE
92#define LOG_DEL_ISR_LEAVE(ercd)
93#endif /* LOG_DEL_ISR_LEAVE */
94
95#ifndef LOG_DIS_INT_ENTER
96#define LOG_DIS_INT_ENTER(intno)
97#endif /* LOG_DIS_INT_ENTER */
98
99#ifndef LOG_DIS_INT_LEAVE
100#define LOG_DIS_INT_LEAVE(ercd)
101#endif /* LOG_DIS_INT_LEAVE */
102
103#ifndef LOG_ENA_INT_ENTER
104#define LOG_ENA_INT_ENTER(intno)
105#endif /* LOG_ENA_INT_ENTER */
106
107#ifndef LOG_ENA_INT_LEAVE
108#define LOG_ENA_INT_LEAVE(ercd)
109#endif /* LOG_ENA_INT_LEAVE */
110
111#ifndef LOG_CLR_INT_ENTER
112#define LOG_CLR_INT_ENTER(intno)
113#endif /* LOG_CLR_INT_ENTER */
114
115#ifndef LOG_CLR_INT_LEAVE
116#define LOG_CLR_INT_LEAVE(ercd)
117#endif /* LOG_CLR_INT_LEAVE */
118
119#ifndef LOG_RAS_INT_ENTER
120#define LOG_RAS_INT_ENTER(intno)
121#endif /* LOG_RAS_INT_ENTER */
122
123#ifndef LOG_RAS_INT_LEAVE
124#define LOG_RAS_INT_LEAVE(ercd)
125#endif /* LOG_RAS_INT_LEAVE */
126
127#ifndef LOG_PRB_INT_ENTER
128#define LOG_PRB_INT_ENTER(intno)
129#endif /* LOG_PRB_INT_ENTER */
130
131#ifndef LOG_PRB_INT_LEAVE
132#define LOG_PRB_INT_LEAVE(ercd)
133#endif /* LOG_PRB_INT_LEAVE */
134
135#ifndef LOG_CHG_IPM_ENTER
136#define LOG_CHG_IPM_ENTER(intpri)
137#endif /* LOG_CHG_IPM_ENTER */
138
139#ifndef LOG_CHG_IPM_LEAVE
140#define LOG_CHG_IPM_LEAVE(ercd)
141#endif /* LOG_CHG_IPM_LEAVE */
142
143#ifndef LOG_GET_IPM_ENTER
144#define LOG_GET_IPM_ENTER(p_intpri)
145#endif /* LOG_GET_IPM_ENTER */
146
147#ifndef LOG_GET_IPM_LEAVE
148#define LOG_GET_IPM_LEAVE(ercd, p_intpri)
149#endif /* LOG_GET_IPM_LEAVE */
150
151/*
152 * 割込み番号の範囲の判定
153 */
154#ifndef VALID_INTNO_DISINT
155#define VALID_INTNO_DISINT(intno) VALID_INTNO(intno)
156#endif /* VALID_INTNO_DISINT */
157
158#ifndef VALID_INTNO_CLRINT
159#define VALID_INTNO_CLRINT(intno) VALID_INTNO(intno)
160#endif /* VALID_INTNO_CLRINT */
161
162#ifndef VALID_INTNO_RASINT
163#define VALID_INTNO_RASINT(intno) VALID_INTNO(intno)
164#endif /* VALID_INTNO_RASINT */
165
166#ifndef VALID_INTNO_PRBINT
167#define VALID_INTNO_PRBINT(intno) VALID_INTNO(intno)
168#endif /* VALID_INTNO_PRBINT */
169
170#ifndef VALID_INTNO_CREISR
171#define VALID_INTNO_CREISR(intno) VALID_INTNO(intno)
172#endif /* VALID_INTNO_CREISR */
173
174/*
175 * 割込み優å…
176ˆåº¦ã®ç¯„囲の判定
177 */
178#ifndef VALID_INTPRI_CHGIPM
179#define VALID_INTPRI_CHGIPM(intpri) \
180 (TMIN_INTPRI <= (intpri) && (intpri) <= TIPM_ENAALL)
181#endif /* VALID_INTPRI_CHGIPM */
182
183/*
184 * 割込みサービスルーチンの数
185 */
186#define tnum_isr ((uint_t)(tmax_isrid - TMIN_ISRID + 1))
187#define tnum_sisr ((uint_t)(tmax_sisrid - TMIN_ISRID + 1))
188
189/*
190 * 割込みサービスルーチンIDから割込みサービスルーチン管理ブロックを取
191 * り出すためのマクロ
192 */
193#define INDEX_ISR(isrid) ((uint_t)((isrid) - TMIN_ISRID))
194#define get_isrcb(isrid) (&(isrcb_table[INDEX_ISR(isrid)]))
195
196/*
197 * 割込みサービスルーチンキューへの登録
198 */
199Inline void
200enqueue_isr(QUEUE *p_isr_queue, ISRCB *p_isrcb)
201{
202 QUEUE *p_entry;
203 PRI isrpri = p_isrcb->p_isrinib->isrpri;
204
205 for (p_entry = p_isr_queue->p_next; p_entry != p_isr_queue;
206 p_entry = p_entry->p_next) {
207 if (isrpri < ((ISRCB *) p_entry)->p_isrinib->isrpri) {
208 break;
209 }
210 }
211 queue_insert_prev(p_entry, &(p_isrcb->isr_queue));
212}
213
214#ifdef TOPPERS_isrini
215
216/*
217 * 使用していない割込みサービスルーチン管理ブロックのリスト
218 */
219QUEUE free_isrcb;
220
221/*
222 * 割込みサービスルーチン機能の初期化
223 */
224void
225initialize_isr(void)
226{
227 uint_t i, j;
228 ISRCB *p_isrcb;
229 ISRINIB *p_isrinib;
230
231 for (i = 0; i < tnum_isr_queue; i++) {
232 queue_initialize(&(isr_queue_table[i]));
233 }
234 for (i = 0; i < tnum_sisr; i++) {
235 j = INDEX_ISR(isrorder_table[i]);
236 p_isrcb = &(isrcb_table[j]);
237 p_isrcb->p_isrinib = &(isrinib_table[j]);
238 enqueue_isr(p_isrcb->p_isrinib->p_isr_queue, p_isrcb);
239 }
240 queue_initialize(&free_isrcb);
241 for (j = 0; i < tnum_isr; i++, j++) {
242 p_isrcb = &(isrcb_table[i]);
243 p_isrinib = &(aisrinib_table[j]);
244 p_isrinib->isratr = TA_NOEXS;
245 p_isrcb->p_isrinib = ((const ISRINIB *) p_isrinib);
246 queue_insert_prev(&free_isrcb, &(p_isrcb->isr_queue));
247 }
248}
249
250#endif /* TOPPERS_isrini */
251
252/*
253 * 割込みサービスルーチンの呼出し
254 */
255#ifdef TOPPERS_isrcal
256
257void
258call_isr(QUEUE *p_isr_queue)
259{
260 QUEUE *p_queue;
261 ISRCB *p_isrcb;
262
263 for (p_queue = p_isr_queue->p_next; p_queue != p_isr_queue;
264 p_queue = p_queue->p_next) {
265 p_isrcb = (ISRCB *) p_queue;
266 LOG_ISR_ENTER(ISRID(p_isrcb));
267 (*(p_isrcb->p_isrinib->isr))(p_isrcb->p_isrinib->exinf);
268 LOG_ISR_LEAVE(ISRID(p_isrcb));
269
270 if (p_queue->p_next != p_isr_queue) {
271 /* ISRの呼出し前の状æ…
272‹ã«æˆ»ã™ */
273 if (sense_lock()) {
274 unlock_cpu();
275 }
276 }
277 }
278}
279
280#endif /* TOPPERS_isrcal */
281
282/*
283 * 割込みサービスルーチン呼出しキューの検索
284 */
285Inline QUEUE *
286search_isr_queue(INTNO intno)
287{
288 int_t left, right, i;
289
290 if (tnum_isr_queue == 0) {
291 return(NULL);
292 }
293
294 left = 0;
295 right = tnum_isr_queue - 1;
296 while (left < right) {
297 i = (left + right + 1) / 2;
298 if (intno < isr_queue_list[i].intno) {
299 right = i - 1;
300 }
301 else {
302 left = i;
303 }
304 }
305 if (isr_queue_list[left].intno == intno) {
306 return(isr_queue_list[left].p_isr_queue);
307 }
308 else {
309 return(NULL);
310 }
311}
312
313/*
314 * 割込みサービスルーチンの生成
315 *
316 * pk_cisr->exinfは,エラーチェックをせず,一度しか参ç…
317§ã—ないため,ロー
318 * カル変数にコピーする必
319要がない(途中で書き換わっても支障がない).
320 */
321#ifdef TOPPERS_acre_isr
322
323ER_UINT
324acre_isr(const T_CISR *pk_cisr)
325{
326 ISRCB *p_isrcb;
327 ISRINIB *p_isrinib;
328 QUEUE *p_isr_queue;
329 ATR isratr;
330 INTNO intno;
331 ISR isr;
332 PRI isrpri;
333 ER ercd;
334
335 LOG_ACRE_ISR_ENTER(pk_cisr);
336 CHECK_TSKCTX_UNL();
337
338 isratr = pk_cisr->isratr;
339 intno = pk_cisr->intno;
340 isr = pk_cisr->isr;
341 isrpri = pk_cisr->isrpri;
342
343 CHECK_RSATR(isratr, TARGET_ISRATR);
344 CHECK_PAR(VALID_INTNO_CREISR(intno));
345 CHECK_PAR(FUNC_ALIGN(isr));
346 CHECK_PAR(FUNC_NONNULL(isr));
347 CHECK_PAR(VALID_ISRPRI(isrpri));
348
349 p_isr_queue = search_isr_queue(intno);
350 CHECK_OBJ(p_isr_queue != NULL);
351
352 lock_cpu();
353 if (tnum_isr == 0 || queue_empty(&free_isrcb)) {
354 ercd = E_NOID;
355 }
356 else {
357 p_isrcb = ((ISRCB *) queue_delete_next(&free_isrcb));
358 p_isrinib = (ISRINIB *)(p_isrcb->p_isrinib);
359 p_isrinib->isratr = isratr;
360 p_isrinib->exinf = pk_cisr->exinf;
361 p_isrinib->p_isr_queue = p_isr_queue;
362 p_isrinib->isr = isr;
363 p_isrinib->isrpri = isrpri;
364 enqueue_isr(p_isr_queue, p_isrcb);
365 ercd = ISRID(p_isrcb);
366 }
367 unlock_cpu();
368
369 error_exit:
370 LOG_ACRE_ISR_LEAVE(ercd);
371 return(ercd);
372}
373
374#endif /* TOPPERS_acre_isr */
375
376/*
377 * 割込みサービスルーチンの削除
378 */
379#ifdef TOPPERS_del_isr
380
381ER
382del_isr(ID isrid)
383{
384 ISRCB *p_isrcb;
385 ISRINIB *p_isrinib;
386 ER ercd;
387
388 LOG_DEL_ISR_ENTER(isrid);
389 CHECK_TSKCTX_UNL();
390 CHECK_ID(VALID_ISRID(isrid));
391 p_isrcb = get_isrcb(isrid);
392
393 lock_cpu();
394 if (p_isrcb->p_isrinib->isratr == TA_NOEXS) {
395 ercd = E_NOEXS;
396 }
397 else if (isrid <= tmax_sisrid) {
398 ercd = E_OBJ;
399 }
400 else {
401 queue_delete(&(p_isrcb->isr_queue));
402 p_isrinib = (ISRINIB *)(p_isrcb->p_isrinib);
403 p_isrinib->isratr = TA_NOEXS;
404 queue_insert_prev(&free_isrcb, &(p_isrcb->isr_queue));
405 ercd = E_OK;
406 }
407 unlock_cpu();
408
409 error_exit:
410 LOG_DEL_ISR_LEAVE(ercd);
411 return(ercd);
412}
413
414#endif /* TOPPERS_del_isr */
415
416/*
417 * 割込み管理機能の初期化
418 */
419#ifdef TOPPERS_intini
420#ifndef OMIT_INITIALIZE_INTERRUPT
421
422void
423initialize_interrupt(void)
424{
425 uint_t i;
426 const INHINIB *p_inhinib;
427 const INTINIB *p_intinib;
428
429 for (i = 0; i < tnum_def_inhno; i++) {
430 p_inhinib = &(inhinib_table[i]);
431 define_inh(p_inhinib->inhno, p_inhinib->int_entry);
432 }
433 for (i = 0; i < tnum_cfg_intno; i++) {
434 p_intinib = &(intinib_table[i]);
435 config_int(p_intinib->intno, p_intinib->intatr, p_intinib->intpri);
436 }
437}
438
439#endif /* OMIT_INITIALIZE_INTERRUPT */
440#endif /* TOPPERS_intini */
441
442/*
443 * 割込みの禁止[NGKI3555]
444 */
445#ifdef TOPPERS_dis_int
446#ifdef TOPPERS_SUPPORT_DIS_INT /*ï¼»NGKI3093ï¼½*/
447
448ER
449dis_int(INTNO intno)
450{
451 bool_t locked;
452 ER ercd;
453
454 LOG_DIS_INT_ENTER(intno);
455 CHECK_PAR(VALID_INTNO_DISINT(intno)); /*[NGKI3083][NGKI3087]*/
456
457 locked = sense_lock();
458 if (!locked) {
459 lock_cpu();
460 }
461 if (check_intno_cfg(intno)) {
462 disable_int(intno); /*ï¼»NGKI3086ï¼½*/
463 ercd = E_OK;
464 }
465 else {
466 ercd = E_OBJ; /*ï¼»NGKI3085ï¼½*/
467 }
468 if (!locked) {
469 unlock_cpu();
470 }
471
472 error_exit:
473 LOG_DIS_INT_LEAVE(ercd);
474 return(ercd);
475}
476
477#endif /* TOPPERS_SUPPORT_DIS_INT */
478#endif /* TOPPERS_dis_int */
479
480/*
481 * 割込みの許可[NGKI3556]
482 */
483#ifdef TOPPERS_ena_int
484#ifdef TOPPERS_SUPPORT_ENA_INT /*ï¼»NGKI3106ï¼½*/
485
486ER
487ena_int(INTNO intno)
488{
489 bool_t locked;
490 ER ercd;
491
492 LOG_ENA_INT_ENTER(intno);
493 CHECK_PAR(VALID_INTNO_DISINT(intno)); /*[NGKI3096][NGKI3100]*/
494
495 locked = sense_lock();
496 if (!locked) {
497 lock_cpu();
498 }
499 if (check_intno_cfg(intno)) {
500 enable_int(intno); /*ï¼»NGKI3099ï¼½*/
501 ercd = E_OK;
502 }
503 else {
504 ercd = E_OBJ; /*ï¼»NGKI3098ï¼½*/
505 }
506 if (!locked) {
507 unlock_cpu();
508 }
509
510 error_exit:
511 LOG_ENA_INT_LEAVE(ercd);
512 return(ercd);
513}
514
515#endif /* TOPPERS_SUPPORT_ENA_INT */
516#endif /* TOPPERS_ena_int */
517
518/*
519 * 割込み要求のクリア[NGKI3920]
520 */
521#ifdef TOPPERS_clr_int
522#ifdef TOPPERS_SUPPORT_CLR_INT /*ï¼»NGKI3927ï¼½*/
523
524ER
525clr_int(INTNO intno)
526{
527 bool_t locked;
528 ER ercd;
529
530 LOG_CLR_INT_ENTER(intno);
531 CHECK_PAR(VALID_INTNO_CLRINT(intno)); /*[NGKI3921][NGKI3930]*/
532
533 locked = sense_lock();
534 if (!locked) {
535 lock_cpu();
536 }
537 if (check_intno_cfg(intno) && check_intno_clear(intno)) {
538 clear_int(intno); /*ï¼»NGKI3924ï¼½*/
539 ercd = E_OK;
540 }
541 else {
542 ercd = E_OBJ; /*[NGKI3923][NGKI3929]*/
543 }
544 if (!locked) {
545 unlock_cpu();
546 }
547
548 error_exit:
549 LOG_CLR_INT_LEAVE(ercd);
550 return(ercd);
551}
552
553#endif /* TOPPERS_SUPPORT_CLR_INT */
554#endif /* TOPPERS_clr_int */
555
556/*
557 * 割込みの要求[NGKI3932]
558 */
559#ifdef TOPPERS_ras_int
560#ifdef TOPPERS_SUPPORT_RAS_INT /*ï¼»NGKI3939ï¼½*/
561
562ER
563ras_int(INTNO intno)
564{
565 bool_t locked;
566 ER ercd;
567
568 LOG_RAS_INT_ENTER(intno);
569 CHECK_PAR(VALID_INTNO_RASINT(intno)); /*[NGKI3933][NGKI3942]*/
570
571 locked = sense_lock();
572 if (!locked) {
573 lock_cpu();
574 }
575 if (check_intno_cfg(intno) && check_intno_raise(intno)) {
576 raise_int(intno); /*ï¼»NGKI3936ï¼½*/
577 ercd = E_OK;
578 }
579 else {
580 ercd = E_OBJ; /*[NGKI3935][NGKI3941]*/
581 }
582 if (!locked) {
583 unlock_cpu();
584 }
585
586 error_exit:
587 LOG_RAS_INT_LEAVE(ercd);
588 return(ercd);
589}
590
591#endif /* TOPPERS_SUPPORT_RAS_INT */
592#endif /* TOPPERS_ras_int */
593
594/*
595 * 割込み要求のチェック[NGKI3944]
596 */
597#ifdef TOPPERS_prb_int
598#ifdef TOPPERS_SUPPORT_PRB_INT /*ï¼»NGKI3951ï¼½*/
599
600ER_BOOL
601prb_int(INTNO intno)
602{
603 bool_t locked;
604 ER ercd;
605
606 LOG_PRB_INT_ENTER(intno);
607 CHECK_PAR(VALID_INTNO_PRBINT(intno)); /*[NGKI3945][NGKI3952]*/
608
609 locked = sense_lock();
610 if (!locked) {
611 lock_cpu();
612 }
613 if (check_intno_cfg(intno)) {
614 ercd = (ER_BOOL) probe_int(intno); /*ï¼»NGKI3948ï¼½*/
615 }
616 else {
617 ercd = E_OBJ; /*ï¼»NGKI3947ï¼½*/
618 }
619 if (!locked) {
620 unlock_cpu();
621 }
622
623 error_exit:
624 LOG_PRB_INT_LEAVE(ercd);
625 return(ercd);
626}
627
628#endif /* TOPPERS_SUPPORT_PRB_INT */
629#endif /* TOPPERS_prb_int */
630
631/*
632 * 割込み優å…
633ˆåº¦ãƒžã‚¹ã‚¯ã®å¤‰æ›´ï¼»NGKI3107ï¼½
634 */
635#ifdef TOPPERS_chg_ipm
636
637ER
638chg_ipm(PRI intpri)
639{
640 ER ercd;
641
642 LOG_CHG_IPM_ENTER(intpri);
643 CHECK_TSKCTX_UNL(); /*[NGKI3108][NGKI3109]*/
644 CHECK_PAR(VALID_INTPRI_CHGIPM(intpri)); /*[NGKI3113][NGKI3114]*/
645
646 lock_cpu();
647 t_set_ipm(intpri); /*ï¼»NGKI3111ï¼½*/
648 if (intpri == TIPM_ENAALL && enadsp) {
649 dspflg = true;
650 p_schedtsk = search_schedtsk();
651 if (p_runtsk->raster && p_runtsk->enater) {
652#ifdef TOPPERS_SUPPORT_OVRHDR
653 if (p_runtsk->staovr) {
654 (void) target_ovrtimer_stop(INTNO_DUMMY_TIMER);
655 ovrtimer_flag = false;
656 }
657#endif /* TOPPERS_SUPPORT_OVRHDR */
658 task_terminate(p_runtsk);
659 exit_and_dispatch();
660 ercd = E_SYS;
661 }
662 else {
663 if (p_runtsk != p_schedtsk) {
664 dispatch();
665 }
666 ercd = E_OK;
667 }
668 }
669 else {
670 dspflg = false;
671 ercd = E_OK;
672 }
673 unlock_cpu();
674
675 error_exit:
676 LOG_CHG_IPM_LEAVE(ercd);
677 return(ercd);
678}
679
680#endif /* TOPPERS_chg_ipm */
681
682/*
683 * 割込み優å…
684ˆåº¦ãƒžã‚¹ã‚¯ã®å‚ç…
685§ï¼»NGKI3115ï¼½
686 */
687#ifdef TOPPERS_get_ipm
688
689ER
690get_ipm(PRI *p_intpri)
691{
692 ER ercd;
693
694 LOG_GET_IPM_ENTER(p_intpri);
695 CHECK_TSKCTX_UNL(); /*[NGKI3116][NGKI3117]*/
696
697 lock_cpu();
698 *p_intpri = t_get_ipm(); /*ï¼»NGKI3120ï¼½*/
699 ercd = E_OK;
700 unlock_cpu();
701
702 error_exit:
703 LOG_GET_IPM_LEAVE(ercd, p_intpri);
704 return(ercd);
705}
706
707#endif /* TOPPERS_get_ipm */
Note: See TracBrowser for help on using the repository browser.