OSDN Git Service

Merge branch 'experimental-1843-clean'
[toppersasp4lpc/asp.git] / asp / kernel / task_except.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-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: task_except.c 2023 2011-01-02 08:59:06Z ertl-hiro $
41  */
42
43 /*
44  *              タスク例外処理機能
45  */
46
47 #include "kernel_impl.h"
48 #include "check.h"
49 #include "task.h"
50
51 /*
52  *  トレースログマクロのデフォルト定義
53  */
54 #ifndef LOG_RAS_TEX_ENTER
55 #define LOG_RAS_TEX_ENTER(tskid, rasptn)
56 #endif /* LOG_RAS_TEX_ENTER */
57
58 #ifndef LOG_RAS_TEX_LEAVE
59 #define LOG_RAS_TEX_LEAVE(ercd)
60 #endif /* LOG_RAS_TEX_LEAVE */
61
62 #ifndef LOG_IRAS_TEX_ENTER
63 #define LOG_IRAS_TEX_ENTER(tskid, rasptn)
64 #endif /* LOG_IRAS_TEX_ENTER */
65
66 #ifndef LOG_IRAS_TEX_LEAVE
67 #define LOG_IRAS_TEX_LEAVE(ercd)
68 #endif /* LOG_IRAS_TEX_LEAVE */
69
70 #ifndef LOG_DIS_TEX_ENTER
71 #define LOG_DIS_TEX_ENTER()
72 #endif /* LOG_DIS_TEX_ENTER */
73
74 #ifndef LOG_DIS_TEX_LEAVE
75 #define LOG_DIS_TEX_LEAVE(ercd)
76 #endif /* LOG_DIS_TEX_LEAVE */
77
78 #ifndef LOG_ENA_TEX_ENTER
79 #define LOG_ENA_TEX_ENTER()
80 #endif /* LOG_ENA_TEX_ENTER */
81
82 #ifndef LOG_ENA_TEX_LEAVE
83 #define LOG_ENA_TEX_LEAVE(ercd)
84 #endif /* LOG_ENA_TEX_LEAVE */
85
86 #ifndef LOG_SNS_TEX_ENTER
87 #define LOG_SNS_TEX_ENTER()
88 #endif /* LOG_SNS_TEX_ENTER */
89
90 #ifndef LOG_SNS_TEX_LEAVE
91 #define LOG_SNS_TEX_LEAVE(state)
92 #endif /* LOG_SNS_TEX_LEAVE */
93
94 #ifndef LOG_REF_TEX_ENTER
95 #define LOG_REF_TEX_ENTER(tskid, pk_rtex)
96 #endif /* LOG_REF_TEX_ENTER */
97
98 #ifndef LOG_REF_TEX_LEAVE
99 #define LOG_REF_TEX_LEAVE(ercd, pk_rtex)
100 #endif /* LOG_REF_TEX_LEAVE */
101
102 /*
103  *  タスク例外処理の要求
104  */
105 #ifdef TOPPERS_ras_tex
106
107 ER
108 ras_tex(ID tskid, TEXPTN rasptn)
109 {
110         TCB             *p_tcb;
111         ER              ercd;
112
113         LOG_RAS_TEX_ENTER(tskid, rasptn);
114         CHECK_TSKCTX_UNL();
115         CHECK_TSKID_SELF(tskid);
116         CHECK_PAR(rasptn != 0U);
117         p_tcb = get_tcb_self(tskid);
118
119         t_lock_cpu();
120         if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
121                 ercd = E_OBJ;
122         }
123         else {
124                 p_tcb->texptn |= rasptn;
125                 if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
126                         call_texrtn();
127                 }
128                 ercd = E_OK;
129         }
130         t_unlock_cpu();
131
132   error_exit:
133         LOG_RAS_TEX_LEAVE(ercd);
134         return(ercd);
135 }
136
137 #endif /* TOPPERS_ras_tex */
138
139 /*
140  *  タスク例外処理の要求(非タスクコンテキスト用)
141  */
142 #ifdef TOPPERS_iras_tex
143
144 ER
145 iras_tex(ID tskid, TEXPTN rasptn)
146 {
147         TCB             *p_tcb;
148         ER              ercd;
149
150         LOG_IRAS_TEX_ENTER(tskid, rasptn);
151         CHECK_INTCTX_UNL();
152         CHECK_TSKID(tskid);
153         CHECK_PAR(rasptn != 0U);
154         p_tcb = get_tcb(tskid);
155
156         i_lock_cpu();
157         if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
158                 ercd = E_OBJ;
159         }
160         else {
161                 p_tcb->texptn |= rasptn;
162                 if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
163                         reqflg = true;
164                 }
165                 ercd = E_OK;
166         }
167         i_unlock_cpu();
168
169   error_exit:
170         LOG_IRAS_TEX_LEAVE(ercd);
171         return(ercd);
172 }
173
174 #endif /* TOPPERS_iras_tex */
175
176 /*
177  *  タスク例外処理の禁止
178  */
179 #ifdef TOPPERS_dis_tex
180
181 ER
182 dis_tex(void)
183 {
184         ER              ercd;
185
186         LOG_DIS_TEX_ENTER();
187         CHECK_TSKCTX_UNL();
188
189         t_lock_cpu();
190         if (p_runtsk->p_tinib->texrtn == NULL) {
191                 ercd = E_OBJ;
192         }
193         else {
194                 p_runtsk->enatex = false;
195                 ercd = E_OK;
196         }
197         t_unlock_cpu();
198
199   error_exit:
200         LOG_DIS_TEX_LEAVE(ercd);
201         return(ercd);
202 }
203
204 #endif /* TOPPERS_dis_tex */
205
206 /*
207  *  タスク例外処理の許可
208  */
209 #ifdef TOPPERS_ena_tex
210
211 ER
212 ena_tex(void)
213 {
214         ER              ercd;
215
216         LOG_ENA_TEX_ENTER();
217         CHECK_TSKCTX_UNL();
218
219         t_lock_cpu();
220         if (p_runtsk->p_tinib->texrtn == NULL) {
221                 ercd = E_OBJ;
222         }
223         else {
224                 p_runtsk->enatex = true;
225                 if (p_runtsk->texptn != 0U && ipmflg) {
226                         call_texrtn();
227                 }
228                 ercd = E_OK;
229         }
230         t_unlock_cpu();
231
232   error_exit:
233         LOG_ENA_TEX_LEAVE(ercd);
234         return(ercd);
235 }
236
237 #endif /* TOPPERS_ena_tex */
238
239 /*
240  *  タスク例外処理禁止状態の参照
241  */
242 #ifdef TOPPERS_sns_tex
243
244 bool_t
245 sns_tex(void)
246 {
247         bool_t  state;
248
249         LOG_SNS_TEX_ENTER();
250         state = (p_runtsk != NULL && p_runtsk->enatex) ? false : true;
251         LOG_SNS_TEX_LEAVE(state);
252         return(state);
253 }
254
255 #endif /* TOPPERS_sns_tex */
256
257 /*
258  *  タスク例外処理の状態参照
259  */
260 #ifdef TOPPERS_ref_tex
261
262 ER
263 ref_tex(ID tskid, T_RTEX *pk_rtex)
264 {
265         TCB             *p_tcb;
266         ER              ercd;
267
268         LOG_REF_TEX_ENTER(tskid, pk_rtex);
269         CHECK_TSKCTX_UNL();
270         CHECK_TSKID_SELF(tskid);
271         p_tcb = get_tcb_self(tskid);
272
273         t_lock_cpu();
274         if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
275                 ercd = E_OBJ;
276         }
277         else {
278                 pk_rtex->texstat = (p_tcb->enatex) ? TTEX_ENA : TTEX_DIS;
279                 pk_rtex->pndptn = p_tcb->texptn;
280                 ercd = E_OK;
281         }
282         t_unlock_cpu();
283
284   error_exit:
285         LOG_REF_TEX_LEAVE(ercd, pk_rtex);
286         return(ercd);
287 }
288
289 #endif /* TOPPERS_ref_tex */