source: rubycfg_asp/trunk/asp_dcre/kernel/task_except.c@ 313

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

ソースを追加

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/x-csrc
File size: 8.3 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-2014 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: task_except.c 313 2017-07-23 04:50:32Z coas-nagasima $
56 */
57
58/*
59 * タスク例外処理機能
60 */
61
62#include "kernel_impl.h"
63#include "check.h"
64#include "task.h"
65
66/*
67 * トレースログマクロのデフォルト定義
68 */
69#ifndef LOG_DEF_TEX_ENTER
70#define LOG_DEF_TEX_ENTER(tskid, pk_dtex)
71#endif /* LOG_DEF_TEX_ENTER */
72
73#ifndef LOG_DEF_TEX_LEAVE
74#define LOG_DEF_TEX_LEAVE(ercd)
75#endif /* LOG_DEF_TEX_LEAVE */
76
77#ifndef LOG_RAS_TEX_ENTER
78#define LOG_RAS_TEX_ENTER(tskid, rasptn)
79#endif /* LOG_RAS_TEX_ENTER */
80
81#ifndef LOG_RAS_TEX_LEAVE
82#define LOG_RAS_TEX_LEAVE(ercd)
83#endif /* LOG_RAS_TEX_LEAVE */
84
85#ifndef LOG_IRAS_TEX_ENTER
86#define LOG_IRAS_TEX_ENTER(tskid, rasptn)
87#endif /* LOG_IRAS_TEX_ENTER */
88
89#ifndef LOG_IRAS_TEX_LEAVE
90#define LOG_IRAS_TEX_LEAVE(ercd)
91#endif /* LOG_IRAS_TEX_LEAVE */
92
93#ifndef LOG_DIS_TEX_ENTER
94#define LOG_DIS_TEX_ENTER()
95#endif /* LOG_DIS_TEX_ENTER */
96
97#ifndef LOG_DIS_TEX_LEAVE
98#define LOG_DIS_TEX_LEAVE(ercd)
99#endif /* LOG_DIS_TEX_LEAVE */
100
101#ifndef LOG_ENA_TEX_ENTER
102#define LOG_ENA_TEX_ENTER()
103#endif /* LOG_ENA_TEX_ENTER */
104
105#ifndef LOG_ENA_TEX_LEAVE
106#define LOG_ENA_TEX_LEAVE(ercd)
107#endif /* LOG_ENA_TEX_LEAVE */
108
109#ifndef LOG_SNS_TEX_ENTER
110#define LOG_SNS_TEX_ENTER()
111#endif /* LOG_SNS_TEX_ENTER */
112
113#ifndef LOG_SNS_TEX_LEAVE
114#define LOG_SNS_TEX_LEAVE(state)
115#endif /* LOG_SNS_TEX_LEAVE */
116
117#ifndef LOG_REF_TEX_ENTER
118#define LOG_REF_TEX_ENTER(tskid, pk_rtex)
119#endif /* LOG_REF_TEX_ENTER */
120
121#ifndef LOG_REF_TEX_LEAVE
122#define LOG_REF_TEX_LEAVE(ercd, pk_rtex)
123#endif /* LOG_REF_TEX_LEAVE */
124
125/*
126 * タスク例外処理ルーチンの定義
127 */
128#ifdef TOPPERS_def_tex
129
130ER_UINT
131def_tex(ID tskid, const T_DTEX *pk_dtex)
132{
133 TCB *p_tcb;
134 TINIB *p_tinib;
135 ER ercd;
136
137 LOG_DEF_TEX_ENTER(tskid, pk_dtex);
138 CHECK_TSKCTX_UNL();
139 CHECK_TSKID_SELF(tskid);
140 CHECK_RSATR(pk_dtex->texatr, TA_NULL);
141 if (pk_dtex->texrtn != NULL) {
142 CHECK_ALIGN_FUNC(pk_dtex->texrtn);
143 CHECK_NONNULL_FUNC(pk_dtex->texrtn);
144 }
145 p_tcb = get_tcb_self(tskid);
146 p_tinib = (TINIB *)(p_tcb->p_tinib);
147
148 t_lock_cpu();
149 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
150 ercd = E_NOEXS;
151 }
152 else if (TSKID(p_tcb) > tmax_stskid) {
153 if (pk_dtex->texrtn != NULL) {
154 if (p_tinib->texrtn != NULL) {
155 ercd = E_OBJ;
156 }
157 else {
158 p_tinib->texatr = pk_dtex->texatr;
159 p_tinib->texrtn = pk_dtex->texrtn;
160 ercd = E_OK;
161 }
162 }
163 else {
164 if (p_tinib->texrtn != NULL) {
165 p_tinib->texrtn = NULL;
166 p_tcb->enatex = false;
167 p_tcb->texptn = 0U;
168 ercd = E_OK;
169 }
170 else {
171 ercd = E_OBJ;
172 }
173 }
174 }
175 else {
176 ercd = E_OBJ;
177 }
178 t_unlock_cpu();
179
180 error_exit:
181 LOG_DEF_TEX_LEAVE(ercd);
182 return(ercd);
183}
184
185#endif /* TOPPERS_def_tex */
186
187/*
188 * タスク例外処理の要求
189 */
190#ifdef TOPPERS_ras_tex
191
192ER
193ras_tex(ID tskid, TEXPTN rasptn)
194{
195 TCB *p_tcb;
196 ER ercd;
197
198 LOG_RAS_TEX_ENTER(tskid, rasptn);
199 CHECK_TSKCTX_UNL();
200 CHECK_TSKID_SELF(tskid);
201 CHECK_PAR(rasptn != 0U);
202 p_tcb = get_tcb_self(tskid);
203
204 t_lock_cpu();
205 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
206 ercd = E_NOEXS;
207 }
208 else if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
209 ercd = E_OBJ;
210 }
211 else {
212 p_tcb->texptn |= rasptn;
213 if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
214 call_texrtn();
215 }
216 ercd = E_OK;
217 }
218 t_unlock_cpu();
219
220 error_exit:
221 LOG_RAS_TEX_LEAVE(ercd);
222 return(ercd);
223}
224
225#endif /* TOPPERS_ras_tex */
226
227/*
228 * タスク例外処理の要求(非タスクコンテキスト用)
229 */
230#ifdef TOPPERS_iras_tex
231
232ER
233iras_tex(ID tskid, TEXPTN rasptn)
234{
235 TCB *p_tcb;
236 ER ercd;
237
238 LOG_IRAS_TEX_ENTER(tskid, rasptn);
239 CHECK_INTCTX_UNL();
240 CHECK_TSKID(tskid);
241 CHECK_PAR(rasptn != 0U);
242 p_tcb = get_tcb(tskid);
243
244 i_lock_cpu();
245 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
246 ercd = E_NOEXS;
247 }
248 else if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
249 ercd = E_OBJ;
250 }
251 else {
252 p_tcb->texptn |= rasptn;
253 if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
254 reqflg = true;
255 }
256 ercd = E_OK;
257 }
258 i_unlock_cpu();
259
260 error_exit:
261 LOG_IRAS_TEX_LEAVE(ercd);
262 return(ercd);
263}
264
265#endif /* TOPPERS_iras_tex */
266
267/*
268 * タスク例外処理の禁止
269 */
270#ifdef TOPPERS_dis_tex
271
272ER
273dis_tex(void)
274{
275 ER ercd;
276
277 LOG_DIS_TEX_ENTER();
278 CHECK_TSKCTX_UNL();
279
280 t_lock_cpu();
281 if (p_runtsk->p_tinib->texrtn == NULL) {
282 ercd = E_OBJ;
283 }
284 else {
285 p_runtsk->enatex = false;
286 ercd = E_OK;
287 }
288 t_unlock_cpu();
289
290 error_exit:
291 LOG_DIS_TEX_LEAVE(ercd);
292 return(ercd);
293}
294
295#endif /* TOPPERS_dis_tex */
296
297/*
298 * タスク例外処理の許可
299 */
300#ifdef TOPPERS_ena_tex
301
302ER
303ena_tex(void)
304{
305 ER ercd;
306
307 LOG_ENA_TEX_ENTER();
308 CHECK_TSKCTX_UNL();
309
310 t_lock_cpu();
311 if (p_runtsk->p_tinib->texrtn == NULL) {
312 ercd = E_OBJ;
313 }
314 else {
315 p_runtsk->enatex = true;
316 if (p_runtsk->texptn != 0U && ipmflg) {
317 call_texrtn();
318 }
319 ercd = E_OK;
320 }
321 t_unlock_cpu();
322
323 error_exit:
324 LOG_ENA_TEX_LEAVE(ercd);
325 return(ercd);
326}
327
328#endif /* TOPPERS_ena_tex */
329
330/*
331 * タスク例外処理禁止状æ…
332‹ã®å‚ç…
333§
334 */
335#ifdef TOPPERS_sns_tex
336
337bool_t
338sns_tex(void)
339{
340 bool_t state;
341
342 LOG_SNS_TEX_ENTER();
343 state = (p_runtsk != NULL && p_runtsk->enatex) ? false : true;
344 LOG_SNS_TEX_LEAVE(state);
345 return(state);
346}
347
348#endif /* TOPPERS_sns_tex */
349
350/*
351 * タスク例外処理の状æ…
352‹å‚ç…
353§
354 */
355#ifdef TOPPERS_ref_tex
356
357ER
358ref_tex(ID tskid, T_RTEX *pk_rtex)
359{
360 TCB *p_tcb;
361 ER ercd;
362
363 LOG_REF_TEX_ENTER(tskid, pk_rtex);
364 CHECK_TSKCTX_UNL();
365 CHECK_TSKID_SELF(tskid);
366 p_tcb = get_tcb_self(tskid);
367
368 t_lock_cpu();
369 if (p_tcb->p_tinib->tskatr == TA_NOEXS) {
370 ercd = E_NOEXS;
371 }
372 else if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
373 ercd = E_OBJ;
374 }
375 else {
376 pk_rtex->texstat = (p_tcb->enatex) ? TTEX_ENA : TTEX_DIS;
377 pk_rtex->pndptn = p_tcb->texptn;
378 ercd = E_OK;
379 }
380 t_unlock_cpu();
381
382 error_exit:
383 LOG_REF_TEX_LEAVE(ercd, pk_rtex);
384 return(ercd);
385}
386
387#endif /* TOPPERS_ref_tex */
Note: See TracBrowser for help on using the repository browser.