source: rtos_arduino/trunk/asp_1.9.2/kernel/task_except.c@ 136

Last change on this file since 136 was 136, checked in by ertl-honda, 8 years ago

ライブラリとOS及びベーシックなサンプルの追加.

File size: 6.9 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-2011 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 2023 2011-01-02 08:59:06Z ertl-hiro $
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_RAS_TEX_ENTER
70#define LOG_RAS_TEX_ENTER(tskid, rasptn)
71#endif /* LOG_RAS_TEX_ENTER */
72
73#ifndef LOG_RAS_TEX_LEAVE
74#define LOG_RAS_TEX_LEAVE(ercd)
75#endif /* LOG_RAS_TEX_LEAVE */
76
77#ifndef LOG_IRAS_TEX_ENTER
78#define LOG_IRAS_TEX_ENTER(tskid, rasptn)
79#endif /* LOG_IRAS_TEX_ENTER */
80
81#ifndef LOG_IRAS_TEX_LEAVE
82#define LOG_IRAS_TEX_LEAVE(ercd)
83#endif /* LOG_IRAS_TEX_LEAVE */
84
85#ifndef LOG_DIS_TEX_ENTER
86#define LOG_DIS_TEX_ENTER()
87#endif /* LOG_DIS_TEX_ENTER */
88
89#ifndef LOG_DIS_TEX_LEAVE
90#define LOG_DIS_TEX_LEAVE(ercd)
91#endif /* LOG_DIS_TEX_LEAVE */
92
93#ifndef LOG_ENA_TEX_ENTER
94#define LOG_ENA_TEX_ENTER()
95#endif /* LOG_ENA_TEX_ENTER */
96
97#ifndef LOG_ENA_TEX_LEAVE
98#define LOG_ENA_TEX_LEAVE(ercd)
99#endif /* LOG_ENA_TEX_LEAVE */
100
101#ifndef LOG_SNS_TEX_ENTER
102#define LOG_SNS_TEX_ENTER()
103#endif /* LOG_SNS_TEX_ENTER */
104
105#ifndef LOG_SNS_TEX_LEAVE
106#define LOG_SNS_TEX_LEAVE(state)
107#endif /* LOG_SNS_TEX_LEAVE */
108
109#ifndef LOG_REF_TEX_ENTER
110#define LOG_REF_TEX_ENTER(tskid, pk_rtex)
111#endif /* LOG_REF_TEX_ENTER */
112
113#ifndef LOG_REF_TEX_LEAVE
114#define LOG_REF_TEX_LEAVE(ercd, pk_rtex)
115#endif /* LOG_REF_TEX_LEAVE */
116
117/*
118 * タスク例外処理の要求
119 */
120#ifdef TOPPERS_ras_tex
121
122ER
123ras_tex(ID tskid, TEXPTN rasptn)
124{
125 TCB *p_tcb;
126 ER ercd;
127
128 LOG_RAS_TEX_ENTER(tskid, rasptn);
129 CHECK_TSKCTX_UNL();
130 CHECK_TSKID_SELF(tskid);
131 CHECK_PAR(rasptn != 0U);
132 p_tcb = get_tcb_self(tskid);
133
134 t_lock_cpu();
135 if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
136 ercd = E_OBJ;
137 }
138 else {
139 p_tcb->texptn |= rasptn;
140 if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
141 call_texrtn();
142 }
143 ercd = E_OK;
144 }
145 t_unlock_cpu();
146
147 error_exit:
148 LOG_RAS_TEX_LEAVE(ercd);
149 return(ercd);
150}
151
152#endif /* TOPPERS_ras_tex */
153
154/*
155 * タスク例外処理の要求(非タスクコンテキスト用)
156 */
157#ifdef TOPPERS_iras_tex
158
159ER
160iras_tex(ID tskid, TEXPTN rasptn)
161{
162 TCB *p_tcb;
163 ER ercd;
164
165 LOG_IRAS_TEX_ENTER(tskid, rasptn);
166 CHECK_INTCTX_UNL();
167 CHECK_TSKID(tskid);
168 CHECK_PAR(rasptn != 0U);
169 p_tcb = get_tcb(tskid);
170
171 i_lock_cpu();
172 if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
173 ercd = E_OBJ;
174 }
175 else {
176 p_tcb->texptn |= rasptn;
177 if (p_tcb == p_runtsk && p_runtsk->enatex && ipmflg) {
178 reqflg = true;
179 }
180 ercd = E_OK;
181 }
182 i_unlock_cpu();
183
184 error_exit:
185 LOG_IRAS_TEX_LEAVE(ercd);
186 return(ercd);
187}
188
189#endif /* TOPPERS_iras_tex */
190
191/*
192 * タスク例外処理の禁止
193 */
194#ifdef TOPPERS_dis_tex
195
196ER
197dis_tex(void)
198{
199 ER ercd;
200
201 LOG_DIS_TEX_ENTER();
202 CHECK_TSKCTX_UNL();
203
204 t_lock_cpu();
205 if (p_runtsk->p_tinib->texrtn == NULL) {
206 ercd = E_OBJ;
207 }
208 else {
209 p_runtsk->enatex = false;
210 ercd = E_OK;
211 }
212 t_unlock_cpu();
213
214 error_exit:
215 LOG_DIS_TEX_LEAVE(ercd);
216 return(ercd);
217}
218
219#endif /* TOPPERS_dis_tex */
220
221/*
222 * タスク例外処理の許可
223 */
224#ifdef TOPPERS_ena_tex
225
226ER
227ena_tex(void)
228{
229 ER ercd;
230
231 LOG_ENA_TEX_ENTER();
232 CHECK_TSKCTX_UNL();
233
234 t_lock_cpu();
235 if (p_runtsk->p_tinib->texrtn == NULL) {
236 ercd = E_OBJ;
237 }
238 else {
239 p_runtsk->enatex = true;
240 if (p_runtsk->texptn != 0U && ipmflg) {
241 call_texrtn();
242 }
243 ercd = E_OK;
244 }
245 t_unlock_cpu();
246
247 error_exit:
248 LOG_ENA_TEX_LEAVE(ercd);
249 return(ercd);
250}
251
252#endif /* TOPPERS_ena_tex */
253
254/*
255 * タスク例外処理禁止状æ…
256‹ã®å‚ç…
257§
258 */
259#ifdef TOPPERS_sns_tex
260
261bool_t
262sns_tex(void)
263{
264 bool_t state;
265
266 LOG_SNS_TEX_ENTER();
267 state = (p_runtsk != NULL && p_runtsk->enatex) ? false : true;
268 LOG_SNS_TEX_LEAVE(state);
269 return(state);
270}
271
272#endif /* TOPPERS_sns_tex */
273
274/*
275 * タスク例外処理の状æ…
276‹å‚ç…
277§
278 */
279#ifdef TOPPERS_ref_tex
280
281ER
282ref_tex(ID tskid, T_RTEX *pk_rtex)
283{
284 TCB *p_tcb;
285 ER ercd;
286
287 LOG_REF_TEX_ENTER(tskid, pk_rtex);
288 CHECK_TSKCTX_UNL();
289 CHECK_TSKID_SELF(tskid);
290 p_tcb = get_tcb_self(tskid);
291
292 t_lock_cpu();
293 if (TSTAT_DORMANT(p_tcb->tstat) || p_tcb->p_tinib->texrtn == NULL) {
294 ercd = E_OBJ;
295 }
296 else {
297 pk_rtex->texstat = (p_tcb->enatex) ? TTEX_ENA : TTEX_DIS;
298 pk_rtex->pndptn = p_tcb->texptn;
299 ercd = E_OK;
300 }
301 t_unlock_cpu();
302
303 error_exit:
304 LOG_REF_TEX_LEAVE(ercd, pk_rtex);
305 return(ercd);
306}
307
308#endif /* TOPPERS_ref_tex */
Note: See TracBrowser for help on using the repository browser.