source: azure_iot_hub/trunk/asp3_dcre/kernel/interrupt.c@ 388

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

Azure IoT Hub Device C SDK を使ったサンプルの追加

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