OSDN Git Service

マルチプロジェクト型にレポジトリを変更するために移動した
[toppersasp4lpc/asp.git] / asp / kernel / interrupt.c
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-2009 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: interrupt.c 1646 2009-10-01 05:19:30Z ertl-hiro $
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
93 void
94 initialize_interrupt(void)
95 {
96         uint_t                  i;
97         const INHINIB   *p_inhinib;
98         const INTINIB   *p_intinib;
99
100         for (p_inhinib = inhinib_table, i = 0; i < tnum_inhno; p_inhinib++, i++) {
101                 x_define_inh(p_inhinib->inhno, p_inhinib->int_entry);
102         }
103         for (p_intinib = intinib_table, i = 0; i < tnum_intno; p_intinib++, i++) {
104                 x_config_int(p_intinib->intno, p_intinib->intatr, p_intinib->intpri);
105         }
106 }
107
108 #endif /* OMIT_INITIALIZE_INTERRUPT */
109 #endif /* TOPPERS_intini */
110
111 /*
112  *  割込みの禁止
113  */
114 #ifdef TOPPERS_dis_int
115 #ifdef TOPPERS_SUPPORT_DIS_INT
116
117 ER
118 dis_int(INTNO intno)
119 {
120         bool_t  locked;
121         ER              ercd;
122
123         LOG_DIS_INT_ENTER(intno);
124         CHECK_TSKCTX();
125         CHECK_INTNO_DISINT(intno);
126
127         locked = t_sense_lock();
128         if (!locked) {
129                 t_lock_cpu();
130         }
131         if (t_disable_int(intno)) {
132                 ercd = E_OK;
133         }
134         else {
135                 ercd = E_OBJ;
136         }
137         if (!locked) {
138                 t_unlock_cpu();
139         }
140
141   error_exit:
142         LOG_DIS_INT_LEAVE(ercd);
143         return(ercd);
144 }
145
146 #endif /* TOPPERS_SUPPORT_DIS_INT */
147 #endif /* TOPPERS_dis_int */
148
149 /*
150  *  割込みの許可
151  */
152 #ifdef TOPPERS_ena_int
153 #ifdef TOPPERS_SUPPORT_ENA_INT
154
155 ER
156 ena_int(INTNO intno)
157 {
158         bool_t  locked;
159         ER              ercd;
160
161         LOG_ENA_INT_ENTER(intno);
162         CHECK_TSKCTX();
163         CHECK_INTNO_DISINT(intno);
164
165         locked = t_sense_lock();
166         if (!locked) {
167                 t_lock_cpu();
168         }
169         if (t_enable_int(intno)) {
170                 ercd = E_OK;
171         }
172         else {
173                 ercd = E_OBJ;
174         }
175         if (!locked) {
176                 t_unlock_cpu();
177         }
178
179   error_exit:
180         LOG_ENA_INT_LEAVE(ercd);
181         return(ercd);
182 }
183
184 #endif /* TOPPERS_SUPPORT_ENA_INT */
185 #endif /* TOPPERS_ena_int */
186
187 /*
188  *  割込み優先度マスクの変更
189  */
190 #ifdef TOPPERS_chg_ipm
191
192 ER
193 chg_ipm(PRI intpri)
194 {
195         ER              ercd;
196
197         LOG_CHG_IPM_ENTER(intpri);
198         CHECK_TSKCTX_UNL();
199         CHECK_INTPRI_CHGIPM(intpri);
200
201         t_lock_cpu();
202         t_set_ipm(intpri);
203         if (intpri != TIPM_ENAALL) {
204                 dspflg = false;
205         }
206         else if (!disdsp) {
207                 dspflg = true;
208                 if (p_runtsk != p_schedtsk) {
209                         dispatch();
210                 }
211         }
212         ercd = E_OK;
213         t_unlock_cpu();
214
215   error_exit:
216         LOG_CHG_IPM_LEAVE(ercd);
217         return(ercd);
218 }
219
220 #endif /* TOPPERS_chg_ipm */
221
222 /*
223  *  割込み優先度マスクの参照
224  */
225 #ifdef TOPPERS_get_ipm
226
227 ER
228 get_ipm(PRI *p_intpri)
229 {
230         ER              ercd;
231
232         LOG_GET_IPM_ENTER(p_intpri);
233         CHECK_TSKCTX_UNL();
234
235         t_lock_cpu();
236         *p_intpri = t_get_ipm();
237         ercd = E_OK;
238         t_unlock_cpu();
239
240   error_exit:
241         LOG_GET_IPM_LEAVE(ercd, *p_intpri);
242         return(ercd);
243 }
244
245 #endif /* TOPPERS_get_ipm */