source: atk2-sc3-1.4.0-ntisr/kernel/event.c

Last change on this file was 172, checked in by ertl-ishikawa, 8 years ago

ATK2-SC3 1.4.0 RH850依存部 非信頼C2ISR対応を追加

  • Property svn:executable set to *
File size: 10.3 KB
Line 
1/*
2 * TOPPERS ATK2
3 * Toyohashi Open Platform for Embedded Real-Time Systems
4 * Automotive Kernel Version 2
5 *
6 * Copyright (C) 2000-2003 by Embedded and Real-Time Systems Laboratory
7 * Toyohashi Univ. of Technology, JAPAN
8 * Copyright (C) 2004-2015 by Center for Embedded Computing Systems
9 * Graduate School of Information Science, Nagoya Univ., JAPAN
10 * Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
11 * Copyright (C) 2011-2013 by Spansion LLC, USA
12 * Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
13 * Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
14 * Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
15 * Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
16 * Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
17 * Copyright (C) 2004-2015 by Witz Corporation
18 * Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
19 * Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
20 * Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
21 * Copyright (C) 2015 by SUZUKI MOTOR CORPORATION
22 *
23 * 上記著作権者
24は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
25 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
26 * 変・再é…
27å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
28 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
29 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
30 * スコード中に含まれていること.
31 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
32 * 用できる形で再é…
33å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
34å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
35 * 者
36マニュアルなど)に,上記の著作権表示,この利用条件および下記
37 * の無保証規定を掲載すること.
38 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
39 * 用できない形で再é…
40å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
41 * と.
42 * (a) 再é…
43å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
44マニュアルなど)に,上記の著
45 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
46 * (b) 再é…
47å¸ƒã®å½¢æ…
48‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
49 * 報告すること.
50 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
51 * 害からも,上記著作権者
52およびTOPPERSプロジェクトをå…
53è²¬ã™ã‚‹ã“と.
54 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
55 * 由に基づく請求からも,上記著作権者
56およびTOPPERSプロジェクトを
57 * å…
58è²¬ã™ã‚‹ã“と.
59 *
60 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
61 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
62 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
63 * 用する者
64に対して,AUTOSARパートナーになることを求めている.
65 *
66 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者
67お
68 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
69 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
70 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
71 * の責任を負わない.
72 *
73 * $Id: event.c 425 2015-12-07 08:06:19Z witz-itoyo $
74 */
75
76/*
77 * イベント管理モジュール
78 */
79
80#include "kernel_impl.h"
81#include "check.h"
82#include "task.h"
83
84/*
85 * トレースログマクロのデフォルト定義
86 */
87#ifndef LOG_TSKSTAT
88#define LOG_TSKSTAT(p_tcb)
89#endif /* LOG_TSKSTAT */
90
91#ifndef LOG_SETEVT_ENTER
92#define LOG_SETEVT_ENTER(tskid, mask)
93#endif /* LOG_SETEVT_ENTER */
94
95#ifndef LOG_SETEVT_LEAVE
96#define LOG_SETEVT_LEAVE(ercd)
97#endif /* LOG_SETEVT_LEAVE */
98
99#ifndef LOG_CLREVT_ENTER
100#define LOG_CLREVT_ENTER(p_runtsk, mask)
101#endif /* LOG_CLREVT_ENTER */
102
103#ifndef LOG_CLREVT_LEAVE
104#define LOG_CLREVT_LEAVE(ercd)
105#endif /* LOG_CLREVT_LEAVE */
106
107#ifndef LOG_GETEVT_ENTER
108#define LOG_GETEVT_ENTER(tskid)
109#endif /* LOG_GETEVT_ENTER */
110
111#ifndef LOG_GETEVT_LEAVE
112#define LOG_GETEVT_LEAVE(ercd, tskid, p_mask)
113#endif /* LOG_GETEVT_LEAVE */
114
115#ifndef LOG_WAIEVT_ENTER
116#define LOG_WAIEVT_ENTER(p_runtsk, mask)
117#endif /* LOG_WAIEVT_ENTER */
118
119#ifndef LOG_WAIEVT_LEAVE
120#define LOG_WAIEVT_LEAVE(ercd)
121#endif /* LOG_WAIEVT_LEAVE */
122
123/*
124 * イベントのセット
125 */
126#ifdef TOPPERS_SetEvent
127
128StatusType
129SetEvent(TaskType TaskID, EventMaskType Mask)
130{
131 StatusType ercd = E_OK;
132 TCB *p_tcb;
133 OSAPCB *p_osapcb;
134
135 LOG_SETEVT_ENTER(TaskID, Mask);
136 CHECK_DISABLEDINT();
137 CHECK_CALLEVEL(CALLEVEL_SETEVENT);
138 CHECK_ID(TaskID < tnum_task);
139 CHECK_ACCESS(TaskID < tnum_exttask);
140 p_tcb = get_tcb(TaskID);
141 CHECK_RIGHT(p_tcb->p_tinib->acsbtmp);
142
143 p_osapcb = p_tcb->p_tinib->p_osapcb;
144 x_nested_lock_os_int();
145
146 /* タスク所属のOSAPの状æ…
147‹ã‚’チェック */
148 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
149 (p_osapcb == p_runosap));
150 D_CHECK_STATE(p_tcb->tstat != SUSPENDED);
151
152 p_tcb->curevt |= Mask;
153 if ((p_tcb->curevt & p_tcb->waievt) != EVTMASK_NONE) {
154 p_tcb->waievt = EVTMASK_NONE;
155 if ((make_runnable(p_tcb) != FALSE) && (callevel_stat == TCL_TASK)) {
156 dispatch();
157 }
158 }
159
160 d_exit_no_errorhook:
161 x_nested_unlock_os_int();
162 exit_no_errorhook:
163 LOG_SETEVT_LEAVE(ercd);
164 return(ercd);
165
166#ifdef CFG_USE_ERRORHOOK
167 exit_errorhook:
168 x_nested_lock_os_int();
169 d_exit_errorhook:
170#ifdef CFG_USE_PARAMETERACCESS
171 _errorhook_par1.tskid = TaskID;
172 _errorhook_par2.mask = Mask;
173#endif /* CFG_USE_PARAMETERACCESS */
174 call_errorhook(ercd, OSServiceId_SetEvent);
175 goto d_exit_no_errorhook;
176#endif /* CFG_USE_ERRORHOOK */
177}
178
179#endif /* TOPPERS_SetEvent */
180
181/*
182 * イベントのクリア
183 */
184#ifdef TOPPERS_ClearEvent
185
186StatusType
187ClearEvent(EventMaskType Mask)
188{
189 StatusType ercd = E_OK;
190
191 LOG_CLREVT_ENTER(p_runtsk, Mask);
192 CHECK_DISABLEDINT();
193 CHECK_CALLEVEL(CALLEVEL_CLEAREVENT);
194 CHECK_ACCESS(TSKID(p_runtsk) < tnum_exttask);
195
196 x_nested_lock_os_int();
197 p_runtsk->curevt &= ~Mask;
198
199 d_exit_no_errorhook:
200 x_nested_unlock_os_int();
201 exit_no_errorhook:
202 LOG_CLREVT_LEAVE(ercd);
203 return(ercd);
204
205#ifdef CFG_USE_ERRORHOOK
206 exit_errorhook:
207 x_nested_lock_os_int();
208#ifdef CFG_USE_PARAMETERACCESS
209 _errorhook_par1.mask = Mask;
210#endif /* CFG_USE_PARAMETERACCESS */
211 call_errorhook(ercd, OSServiceId_ClearEvent);
212 goto d_exit_no_errorhook;
213#endif /* CFG_USE_ERRORHOOK */
214}
215
216#endif /* TOPPERS_ClearEvent */
217
218/*
219 * イベントの状æ…
220‹å‚ç…
221§
222 */
223#ifdef TOPPERS_GetEvent
224
225StatusType
226GetEvent(TaskType TaskID, EventMaskRefType Event)
227{
228 StatusType ercd = E_OK;
229 TCB *p_tcb;
230 OSAPCB *p_osapcb;
231
232 LOG_GETEVT_ENTER(TaskID);
233 CHECK_DISABLEDINT();
234 CHECK_CALLEVEL(CALLEVEL_GETEVENT);
235 CHECK_ID(TaskID < tnum_task);
236 CHECK_ACCESS(TaskID < tnum_exttask);
237 CHECK_PARAM_POINTER(Event);
238 CHECK_MEM_WRITE(Event, EventMaskType);
239 p_tcb = get_tcb(TaskID);
240 CHECK_RIGHT(p_tcb->p_tinib->acsbtmp);
241
242 p_osapcb = p_tcb->p_tinib->p_osapcb;
243 x_nested_lock_os_int();
244
245 /* タスク所属のOSAPの状æ…
246‹ã‚’チェック */
247 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
248 (p_osapcb == p_runosap));
249 /* 対象タスクが休止状æ…
250‹ã®å ´åˆã¯ã‚¨ãƒ©ãƒ¼ã¨ã™ã‚‹ */
251 D_CHECK_STATE((p_tcb->tstat != SUSPENDED) || (p_tcb == p_runtsk));
252
253 *Event = p_tcb->curevt;
254
255 d_exit_no_errorhook:
256 x_nested_unlock_os_int();
257 exit_no_errorhook:
258 LOG_GETEVT_LEAVE(ercd, TaskID, Event);
259 return(ercd);
260
261#ifdef CFG_USE_ERRORHOOK
262 exit_errorhook:
263 x_nested_lock_os_int();
264 d_exit_errorhook:
265#ifdef CFG_USE_PARAMETERACCESS
266 _errorhook_par1.tskid = TaskID;
267 _errorhook_par2.p_mask = Event;
268#endif /* CFG_USE_PARAMETERACCESS */
269 call_errorhook(ercd, OSServiceId_GetEvent);
270 goto d_exit_no_errorhook;
271#endif /* CFG_USE_ERRORHOOK */
272}
273
274#endif /* TOPPERS_GetEvent */
275
276/*
277 * イベント待
278ち
279 */
280#ifdef TOPPERS_WaitEvent
281
282StatusType
283WaitEvent(EventMaskType Mask)
284{
285 StatusType ercd = E_OK;
286
287 LOG_WAIEVT_ENTER(p_runtsk, Mask);
288 CHECK_DISABLEDINT();
289 CHECK_CALLEVEL(CALLEVEL_WAITEVENT);
290 CHECK_ACCESS(TSKID(p_runtsk) < tnum_exttask);
291 CHECK_RESOURCE(p_runtsk->p_lastrescb == NULL);
292
293 x_nested_lock_os_int();
294 if ((p_runtsk->curevt & Mask) == EVTMASK_NONE) {
295 p_runtsk->curpri = p_runtsk->p_tinib->inipri;
296 p_runtsk->tstat = WAITING;
297 LOG_TSKSTAT(p_runtsk);
298 p_runtsk->waievt = Mask;
299 make_non_runnable();
300 dispatch();
301 p_runtsk->curpri = p_runtsk->p_tinib->exepri;
302 }
303
304 d_exit_no_errorhook:
305 x_nested_unlock_os_int();
306 exit_no_errorhook:
307 LOG_WAIEVT_LEAVE(ercd);
308 return(ercd);
309
310#ifdef CFG_USE_ERRORHOOK
311 exit_errorhook:
312 x_nested_lock_os_int();
313#ifdef CFG_USE_PARAMETERACCESS
314 _errorhook_par1.mask = Mask;
315#endif /* CFG_USE_PARAMETERACCESS */
316 call_errorhook(ercd, OSServiceId_WaitEvent);
317 goto d_exit_no_errorhook;
318#endif /* CFG_USE_ERRORHOOK */
319}
320
321#endif /* TOPPERS_WaitEvent */
322
323/*
324 * 満了処理専用イベントのセット
325 *
326 * 条件:OS割込み禁止状æ…
327‹ã§å‘¼ã°ã‚Œã‚‹
328 */
329#ifdef TOPPERS_set_event_action
330
331StatusType
332set_event_action(OSAPCB *p_expire_osapcb, TaskType TaskID, EventMaskType Mask)
333{
334 StatusType ercd;
335 TCB *p_tcb;
336 OSAPCB *p_osapcb;
337
338 LOG_SETEVT_ENTER(TaskID, Mask);
339 p_tcb = get_tcb(TaskID);
340
341 p_osapcb = p_tcb->p_tinib->p_osapcb;
342 /* 満了点所属のOSAP及びセットイベント対象タスク所属のOSAPの状æ…
343‹ã‚’チェック */
344 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) || (p_expire_osapcb == p_osapcb));
345 D_CHECK_STATE(p_tcb->tstat != SUSPENDED);
346 ercd = E_OK;
347
348 p_tcb->curevt |= Mask;
349 if ((p_tcb->curevt & p_tcb->waievt) != EVTMASK_NONE) {
350 p_tcb->waievt = EVTMASK_NONE;
351 (void) make_runnable(p_tcb);
352 }
353
354 d_exit_no_errorhook:
355 LOG_SETEVT_LEAVE(ercd);
356 return(ercd);
357
358#ifdef CFG_USE_ERRORHOOK
359 d_exit_errorhook:
360#ifdef CFG_USE_PARAMETERACCESS
361 _errorhook_par1.tskid = TaskID;
362 _errorhook_par2.mask = Mask;
363#endif /* CFG_USE_PARAMETERACCESS */
364 call_errorhook(ercd, OSServiceId_SetEvent);
365 goto d_exit_no_errorhook;
366#endif /* CFG_USE_ERRORHOOK */
367}
368
369#endif /* TOPPERS_set_event_action */
Note: See TracBrowser for help on using the repository browser.