source: atk2-sc3_fl850f1l/kernel/event.c@ 165

Last change on this file since 165 was 117, checked in by ertl-ishikawa, 9 years ago

ATK2-SC3 1.3.2 FL850F1L(RH850F1L)依存部(GCC/GHS/CCRH)を追加

File size: 9.4 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 *
22 * 上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
23 * ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
24 * 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
25 * (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
26 * 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
27 * スコード中に含まれていること.
28 * (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
29 * 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
30 * 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
31 * の無保証規定を掲載すること.
32 * (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
33 * 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
34 * と.
35 * (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
36 * 作権表示,この利用条件および下記の無保証規定を掲載すること.
37 * (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
38 * 報告すること.
39 * (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
40 * 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
41 * また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
42 * 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
43 * 免責すること.
44 *
45 * 本ソフトウェアは,AUTOSAR(AUTomotive Open System ARchitecture)仕
46 * 様に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するもので
47 * はない.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利
48 * 用する者に対して,AUTOSARパートナーになることを求めている.
49 *
50 * 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
51 * よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
52 * に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
53 * アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
54 * の責任を負わない.
55 *
56 * $Id: event.c 187 2015-06-25 03:39:04Z t_ishikawa $
57 */
58
59/*
60 * イベント管理モジュール
61 */
62
63#include "kernel_impl.h"
64#include "check.h"
65#include "task.h"
66
67/*
68 * トレースログマクロのデフォルト定義
69 */
70#ifndef LOG_TSKSTAT
71#define LOG_TSKSTAT(p_tcb)
72#endif /* LOG_TSKSTAT */
73
74#ifndef LOG_SETEVT_ENTER
75#define LOG_SETEVT_ENTER(tskid, mask)
76#endif /* LOG_SETEVT_ENTER */
77
78#ifndef LOG_SETEVT_LEAVE
79#define LOG_SETEVT_LEAVE(ercd)
80#endif /* LOG_SETEVT_LEAVE */
81
82#ifndef LOG_CLREVT_ENTER
83#define LOG_CLREVT_ENTER(p_runtsk, mask)
84#endif /* LOG_CLREVT_ENTER */
85
86#ifndef LOG_CLREVT_LEAVE
87#define LOG_CLREVT_LEAVE(ercd)
88#endif /* LOG_CLREVT_LEAVE */
89
90#ifndef LOG_GETEVT_ENTER
91#define LOG_GETEVT_ENTER(tskid)
92#endif /* LOG_GETEVT_ENTER */
93
94#ifndef LOG_GETEVT_LEAVE
95#define LOG_GETEVT_LEAVE(ercd, tskid, p_mask)
96#endif /* LOG_GETEVT_LEAVE */
97
98#ifndef LOG_WAIEVT_ENTER
99#define LOG_WAIEVT_ENTER(p_runtsk, mask)
100#endif /* LOG_WAIEVT_ENTER */
101
102#ifndef LOG_WAIEVT_LEAVE
103#define LOG_WAIEVT_LEAVE(ercd)
104#endif /* LOG_WAIEVT_LEAVE */
105
106/*
107 * イベントのセット
108 */
109#ifdef TOPPERS_SetEvent
110
111StatusType
112SetEvent(TaskType TaskID, EventMaskType Mask)
113{
114 StatusType ercd = E_OK;
115 TCB *p_tcb;
116 OSAPCB *p_osapcb;
117
118 LOG_SETEVT_ENTER(TaskID, Mask);
119 CHECK_DISABLEDINT();
120 CHECK_CALLEVEL(CALLEVEL_SETEVENT);
121 CHECK_ID(TaskID < tnum_task);
122 CHECK_ACCESS(TaskID < tnum_exttask);
123 p_tcb = get_tcb(TaskID);
124 CHECK_RIGHT(p_tcb->p_tinib->acsbtmp);
125
126 p_osapcb = p_tcb->p_tinib->p_osapcb;
127 x_nested_lock_os_int();
128
129 /* タスク所属のOSAPの状態をチェック */
130 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
131 ((p_osapcb->osap_stat == APPLICATION_RESTARTING) &&
132 (p_osapcb == p_runosap)));
133 D_CHECK_STATE(p_tcb->tstat != SUSPENDED);
134
135 p_tcb->curevt |= Mask;
136 if ((p_tcb->curevt & p_tcb->waievt) != EVTMASK_NONE) {
137 p_tcb->waievt = EVTMASK_NONE;
138 if ((make_runnable(p_tcb) != FALSE) && (callevel_stat == TCL_TASK)) {
139 dispatch();
140 }
141 }
142
143 d_exit_no_errorhook:
144 x_nested_unlock_os_int();
145 exit_no_errorhook:
146 LOG_SETEVT_LEAVE(ercd);
147 return(ercd);
148
149#ifdef CFG_USE_ERRORHOOK
150 exit_errorhook:
151 x_nested_lock_os_int();
152 d_exit_errorhook:
153#ifdef CFG_USE_PARAMETERACCESS
154 _errorhook_par1.tskid = TaskID;
155 _errorhook_par2.mask = Mask;
156#endif /* CFG_USE_PARAMETERACCESS */
157 call_errorhook(ercd, OSServiceId_SetEvent);
158 goto d_exit_no_errorhook;
159#endif /* CFG_USE_ERRORHOOK */
160}
161
162#endif /* TOPPERS_SetEvent */
163
164/*
165 * イベントのクリア
166 */
167#ifdef TOPPERS_ClearEvent
168
169StatusType
170ClearEvent(EventMaskType Mask)
171{
172 StatusType ercd = E_OK;
173
174 LOG_CLREVT_ENTER(p_runtsk, Mask);
175 CHECK_DISABLEDINT();
176 CHECK_CALLEVEL(CALLEVEL_CLEAREVENT);
177 CHECK_ACCESS(TSKID(p_runtsk) < tnum_exttask);
178
179 x_nested_lock_os_int();
180 p_runtsk->curevt &= ~Mask;
181
182 d_exit_no_errorhook:
183 x_nested_unlock_os_int();
184 exit_no_errorhook:
185 LOG_CLREVT_LEAVE(ercd);
186 return(ercd);
187
188#ifdef CFG_USE_ERRORHOOK
189 exit_errorhook:
190 x_nested_lock_os_int();
191#ifdef CFG_USE_PARAMETERACCESS
192 _errorhook_par1.mask = Mask;
193#endif /* CFG_USE_PARAMETERACCESS */
194 call_errorhook(ercd, OSServiceId_ClearEvent);
195 goto d_exit_no_errorhook;
196#endif /* CFG_USE_ERRORHOOK */
197}
198
199#endif /* TOPPERS_ClearEvent */
200
201/*
202 * イベントの状態参照
203 */
204#ifdef TOPPERS_GetEvent
205
206StatusType
207GetEvent(TaskType TaskID, EventMaskRefType Event)
208{
209 StatusType ercd = E_OK;
210 TCB *p_tcb;
211 OSAPCB *p_osapcb;
212
213 LOG_GETEVT_ENTER(TaskID);
214 CHECK_DISABLEDINT();
215 CHECK_CALLEVEL(CALLEVEL_GETEVENT);
216 CHECK_ID(TaskID < tnum_task);
217 CHECK_ACCESS(TaskID < tnum_exttask);
218 CHECK_PARAM_POINTER(Event);
219 CHECK_MEM_WRITE(Event, EventMaskType);
220 p_tcb = get_tcb(TaskID);
221 CHECK_RIGHT(p_tcb->p_tinib->acsbtmp);
222
223 p_osapcb = p_tcb->p_tinib->p_osapcb;
224 x_nested_lock_os_int();
225
226 /* タスク所属のOSAPの状態をチェック */
227 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
228 ((p_osapcb->osap_stat == APPLICATION_RESTARTING) &&
229 (p_osapcb == p_runosap)));
230 /* 対象タスクが休止状態の場合はエラーとする */
231 D_CHECK_STATE((p_tcb->tstat != SUSPENDED) || (p_tcb == p_runtsk));
232
233 *Event = p_tcb->curevt;
234
235 d_exit_no_errorhook:
236 x_nested_unlock_os_int();
237 exit_no_errorhook:
238 LOG_GETEVT_LEAVE(ercd, TaskID, Event);
239 return(ercd);
240
241#ifdef CFG_USE_ERRORHOOK
242 exit_errorhook:
243 x_nested_lock_os_int();
244 d_exit_errorhook:
245#ifdef CFG_USE_PARAMETERACCESS
246 _errorhook_par1.tskid = TaskID;
247 _errorhook_par2.p_mask = Event;
248#endif /* CFG_USE_PARAMETERACCESS */
249 call_errorhook(ercd, OSServiceId_GetEvent);
250 goto d_exit_no_errorhook;
251#endif /* CFG_USE_ERRORHOOK */
252}
253
254#endif /* TOPPERS_GetEvent */
255
256/*
257 * イベント待ち
258 */
259#ifdef TOPPERS_WaitEvent
260
261StatusType
262WaitEvent(EventMaskType Mask)
263{
264 StatusType ercd = E_OK;
265
266 LOG_WAIEVT_ENTER(p_runtsk, Mask);
267 CHECK_DISABLEDINT();
268 CHECK_CALLEVEL(CALLEVEL_WAITEVENT);
269 CHECK_ACCESS(TSKID(p_runtsk) < tnum_exttask);
270 CHECK_RESOURCE(p_runtsk->p_lastrescb == NULL);
271
272 x_nested_lock_os_int();
273 if ((p_runtsk->curevt & Mask) == EVTMASK_NONE) {
274 p_runtsk->curpri = p_runtsk->p_tinib->inipri;
275 p_runtsk->tstat = WAITING;
276 LOG_TSKSTAT(p_runtsk);
277 p_runtsk->waievt = Mask;
278 make_non_runnable();
279 dispatch();
280 p_runtsk->curpri = p_runtsk->p_tinib->exepri;
281 }
282
283 d_exit_no_errorhook:
284 x_nested_unlock_os_int();
285 exit_no_errorhook:
286 LOG_WAIEVT_LEAVE(ercd);
287 return(ercd);
288
289#ifdef CFG_USE_ERRORHOOK
290 exit_errorhook:
291 x_nested_lock_os_int();
292#ifdef CFG_USE_PARAMETERACCESS
293 _errorhook_par1.mask = Mask;
294#endif /* CFG_USE_PARAMETERACCESS */
295 call_errorhook(ercd, OSServiceId_WaitEvent);
296 goto d_exit_no_errorhook;
297#endif /* CFG_USE_ERRORHOOK */
298}
299
300#endif /* TOPPERS_WaitEvent */
301
302/*
303 * 満了処理専用イベントのセット
304 *
305 * 条件:OS割込み禁止状態で呼ばれる
306 */
307#ifdef TOPPERS_set_event_action
308
309StatusType
310set_event_action(OSAPCB *p_expire_osapcb, TaskType TaskID, EventMaskType Mask)
311{
312 StatusType ercd;
313 TCB *p_tcb;
314 OSAPCB *p_osapcb;
315
316 LOG_SETEVT_ENTER(TaskID, Mask);
317 p_tcb = get_tcb(TaskID);
318
319 p_osapcb = p_tcb->p_tinib->p_osapcb;
320 /* 満了点所属のOSAP及びセットイベント対象タスク所属のOSAPの状態をチェック */
321 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) || (p_expire_osapcb == p_osapcb));
322 D_CHECK_STATE(p_tcb->tstat != SUSPENDED);
323 ercd = E_OK;
324
325 p_tcb->curevt |= Mask;
326 if ((p_tcb->curevt & p_tcb->waievt) != EVTMASK_NONE) {
327 p_tcb->waievt = EVTMASK_NONE;
328 (void) make_runnable(p_tcb);
329 }
330
331 d_exit_no_errorhook:
332 LOG_SETEVT_LEAVE(ercd);
333 return(ercd);
334
335#ifdef CFG_USE_ERRORHOOK
336 d_exit_errorhook:
337#ifdef CFG_USE_PARAMETERACCESS
338 _errorhook_par1.tskid = TaskID;
339 _errorhook_par2.mask = Mask;
340#endif /* CFG_USE_PARAMETERACCESS */
341 call_errorhook(ercd, OSServiceId_SetEvent);
342 goto d_exit_no_errorhook;
343#endif /* CFG_USE_ERRORHOOK */
344}
345
346#endif /* TOPPERS_set_event_action */
Note: See TracBrowser for help on using the repository browser.