source: kernel/interrupt.c

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

TOPPERS/ASP 1.9.1

ファイルサイズ: 5.3 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-2011 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 "check.h"
49#include "task.h"
50#include "interrupt.h"
51
52/*
53 *  ¥È¥ì¡Œ¥¹¥í¥°¥Þ¥¯¥í€Î¥Ç¥Õ¥©¥ë¥ÈÄêµÁ
54 */
55#ifndef LOG_DIS_INT_ENTER
56#define LOG_DIS_INT_ENTER(intno)
57#endif /* LOG_DIS_INT_ENTER */
58
59#ifndef LOG_DIS_INT_LEAVE
60#define LOG_DIS_INT_LEAVE(ercd)
61#endif /* LOG_DIS_INT_LEAVE */
62
63#ifndef LOG_ENA_INT_ENTER
64#define LOG_ENA_INT_ENTER(intno)
65#endif /* LOG_ENA_INT_ENTER */
66
67#ifndef LOG_ENA_INT_LEAVE
68#define LOG_ENA_INT_LEAVE(ercd)
69#endif /* LOG_ENA_INT_LEAVE */
70
71#ifndef LOG_CHG_IPM_ENTER
72#define LOG_CHG_IPM_ENTER(intpri)
73#endif /* LOG_CHG_IPM_ENTER */
74
75#ifndef LOG_CHG_IPM_LEAVE
76#define LOG_CHG_IPM_LEAVE(ercd)
77#endif /* LOG_CHG_IPM_LEAVE */
78
79#ifndef LOG_GET_IPM_ENTER
80#define LOG_GET_IPM_ENTER(p_intpri)
81#endif /* LOG_GET_IPM_ENTER */
82
83#ifndef LOG_GET_IPM_LEAVE
84#define LOG_GET_IPM_LEAVE(ercd, intpri)
85#endif /* LOG_GET_IPM_LEAVE */
86
87/*
88 *  ³ä¹þ€ßŽÉÍýµ¡Çœ€ÎœéŽü²œ
89 */
90#ifdef TOPPERS_intini
91#ifndef OMIT_INITIALIZE_INTERRUPT
92
93void
94initialize_interrupt(void)
95{
96        uint_t                  i;
97        const INHINIB   *p_inhinib;
98        const INTINIB   *p_intinib;
99
100        for (i = 0; i < tnum_inhno; i++) {
101                p_inhinib = &(inhinib_table[i]);
102                x_define_inh(p_inhinib->inhno, p_inhinib->int_entry);
103        }
104        for (i = 0; i < tnum_intno; i++) {
105                p_intinib = &(intinib_table[i]);
106                x_config_int(p_intinib->intno, p_intinib->intatr, p_intinib->intpri);
107        }
108}
109
110#endif /* OMIT_INITIALIZE_INTERRUPT */
111#endif /* TOPPERS_intini */
112
113/*
114 *  ³ä¹þ€ß€Î¶Ø»ß
115 */
116#ifdef TOPPERS_dis_int
117#ifdef TOPPERS_SUPPORT_DIS_INT
118
119ER
120dis_int(INTNO intno)
121{
122        bool_t  locked;
123        ER              ercd;
124
125        LOG_DIS_INT_ENTER(intno);
126        CHECK_TSKCTX();
127        CHECK_INTNO_DISINT(intno);
128
129        locked = t_sense_lock();
130        if (!locked) {
131                t_lock_cpu();
132        }
133        if (t_disable_int(intno)) {
134                ercd = E_OK;
135        }
136        else {
137                ercd = E_OBJ;
138        }
139        if (!locked) {
140                t_unlock_cpu();
141        }
142
143  error_exit:
144        LOG_DIS_INT_LEAVE(ercd);
145        return(ercd);
146}
147
148#endif /* TOPPERS_SUPPORT_DIS_INT */
149#endif /* TOPPERS_dis_int */
150
151/*
152 *  ³ä¹þ€ß€Îµö²Ä
153 */
154#ifdef TOPPERS_ena_int
155#ifdef TOPPERS_SUPPORT_ENA_INT
156
157ER
158ena_int(INTNO intno)
159{
160        bool_t  locked;
161        ER              ercd;
162
163        LOG_ENA_INT_ENTER(intno);
164        CHECK_TSKCTX();
165        CHECK_INTNO_DISINT(intno);
166
167        locked = t_sense_lock();
168        if (!locked) {
169                t_lock_cpu();
170        }
171        if (t_enable_int(intno)) {
172                ercd = E_OK;
173        }
174        else {
175                ercd = E_OBJ;
176        }
177        if (!locked) {
178                t_unlock_cpu();
179        }
180
181  error_exit:
182        LOG_ENA_INT_LEAVE(ercd);
183        return(ercd);
184}
185
186#endif /* TOPPERS_SUPPORT_ENA_INT */
187#endif /* TOPPERS_ena_int */
188
189/*
190 *  ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€ÎÊѹ¹
191 */
192#ifdef TOPPERS_chg_ipm
193
194ER
195chg_ipm(PRI intpri)
196{
197        ER              ercd;
198
199        LOG_CHG_IPM_ENTER(intpri);
200        CHECK_TSKCTX_UNL();
201        CHECK_INTPRI_CHGIPM(intpri);
202
203        t_lock_cpu();
204        t_set_ipm(intpri);
205        if (intpri == TIPM_ENAALL) {
206                ipmflg = true;
207                if (!disdsp) {
208                        dspflg = true;
209                        if (p_runtsk != p_schedtsk) {
210                                dispatch();
211                        }
212                }
213                if (p_runtsk->enatex && p_runtsk->texptn != 0U) {
214                        call_texrtn();
215                }
216        }
217        else {
218                ipmflg = false;
219                dspflg = false;
220        }
221        ercd = E_OK;
222        t_unlock_cpu();
223
224  error_exit:
225        LOG_CHG_IPM_LEAVE(ercd);
226        return(ercd);
227}
228
229#endif /* TOPPERS_chg_ipm */
230
231/*
232 *  ³ä¹þ€ßÍ¥ÀèÅÙ¥Þ¥¹¥¯€Î»²ŸÈ
233 */
234#ifdef TOPPERS_get_ipm
235
236ER
237get_ipm(PRI *p_intpri)
238{
239        ER              ercd;
240
241        LOG_GET_IPM_ENTER(p_intpri);
242        CHECK_TSKCTX_UNL();
243
244        t_lock_cpu();
245        *p_intpri = t_get_ipm();
246        ercd = E_OK;
247        t_unlock_cpu();
248
249  error_exit:
250        LOG_GET_IPM_LEAVE(ercd, *p_intpri);
251        return(ercd);
252}
253
254#endif /* TOPPERS_get_ipm */
詳しい使い方は TracBrowser を参照してください。