source: atk2-sc3_fl850f1l/kernel/task_manage.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: 11.6 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: task_manage.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_ACTTSK_ENTER
75#define LOG_ACTTSK_ENTER(tskid)
76#endif /* LOG_ACTTSK_ENTER */
77
78#ifndef LOG_ACTTSK_LEAVE
79#define LOG_ACTTSK_LEAVE(ercd)
80#endif /* LOG_ACTTSK_LEAVE */
81
82#ifndef LOG_TERTSK_ENTER
83#define LOG_TERTSK_ENTER()
84#endif /* LOG_TERTSK_ENTER */
85
86#ifndef LOG_TERTSK_LEAVE
87#define LOG_TERTSK_LEAVE(ercd)
88#endif /* LOG_TERTSK_LEAVE */
89
90#ifndef LOG_CHNTSK_ENTER
91#define LOG_CHNTSK_ENTER(tskid)
92#endif /* LOG_CHNTSK_ENTER */
93
94#ifndef LOG_CHNTSK_LEAVE
95#define LOG_CHNTSK_LEAVE(ercd)
96#endif /* LOG_CHNTSK_LEAVE */
97
98#ifndef LOG_SCHED_LEAVE
99#define LOG_SCHED_ENTER()
100#endif /* LOG_SCHED_LEAVE */
101
102#ifndef LOG_SCHED_LEAVE
103#define LOG_SCHED_LEAVE(ercd)
104#endif /* LOG_SCHED_LEAVE */
105
106#ifndef LOG_GETTID_ENTER
107#define LOG_GETTID_ENTER()
108#endif /* LOG_GETTID_ENTER */
109
110#ifndef LOG_GETTID_LEAVE
111#define LOG_GETTID_LEAVE(ercd, p_tskid)
112#endif /* LOG_GETTID_LEAVE */
113
114#ifndef LOG_GETTST_ENTER
115#define LOG_GETTST_ENTER(tskid)
116#endif /* LOG_GETTST_ENTER */
117
118#ifndef LOG_GETTST_LEAVE
119#define LOG_GETTST_LEAVE(ercd, p_state)
120#endif /* LOG_GETTST_LEAVE */
121
122
123/*
124 * タスクの起動
125 */
126#ifdef TOPPERS_ActivateTask
127
128StatusType
129ActivateTask(TaskType TaskID)
130{
131 StatusType ercd = E_OK;
132 TCB *p_tcb;
133 OSAPCB *p_osapcb;
134
135 LOG_ACTTSK_ENTER(TaskID);
136 CHECK_DISABLEDINT();
137 CHECK_CALLEVEL(CALLEVEL_ACTIVATETASK);
138 CHECK_ID(TaskID < tnum_task);
139 p_tcb = get_tcb(TaskID);
140 CHECK_RIGHT(p_tcb->p_tinib->acsbtmp);
141
142 p_osapcb = p_tcb->p_tinib->p_osapcb;
143 x_nested_lock_os_int();
144
145 /* 起動するタスク所属のOSAPの状態をチェック */
146 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
147 ((p_osapcb->osap_stat == APPLICATION_RESTARTING) &&
148 (p_osapcb == p_runosap)));
149
150 if (p_tcb->tstat == SUSPENDED) {
151 if ((make_active(p_tcb) != FALSE) && (callevel_stat == TCL_TASK)) {
152 dispatch();
153 }
154 }
155 else {
156 S_D_CHECK_LIMIT(p_tcb->actcnt < p_tcb->p_tinib->maxact);
157
158 p_tcb->actcnt += 1U;
159 }
160
161 d_exit_no_errorhook:
162 x_nested_unlock_os_int();
163 exit_no_errorhook:
164 LOG_ACTTSK_LEAVE(ercd);
165 return(ercd);
166
167#ifdef CFG_USE_ERRORHOOK
168 exit_errorhook:
169 x_nested_lock_os_int();
170 d_exit_errorhook:
171#ifdef CFG_USE_PARAMETERACCESS
172 _errorhook_par1.tskid = TaskID;
173#endif /* CFG_USE_PARAMETERACCESS */
174 call_errorhook(ercd, OSServiceId_ActivateTask);
175 goto d_exit_no_errorhook;
176#endif /* CFG_USE_ERRORHOOK */
177}
178
179#endif /* TOPPERS_ActivateTask */
180
181/*
182 * 自タスクの終了
183 */
184#ifdef TOPPERS_TerminateTask
185
186StatusType
187TerminateTask(void)
188{
189 StatusType ercd = E_OK;
190
191 LOG_TERTSK_ENTER();
192 CHECK_DISABLEDINT();
193 CHECK_CALLEVEL(CALLEVEL_TERMINATETASK);
194 CHECK_RESOURCE(p_runtsk->p_lastrescb == NULL);
195
196 x_nested_lock_os_int();
197 /*
198 * 内部リソースの解放は優先度を下げるだけなので,ここでは
199 * 何もしなくてよい
200 */
201
202 suspend();
203
204 LOG_TERTSK_LEAVE(E_OK);
205 exit_and_dispatch();
206 ASSERT(0);
207
208#ifdef CFG_USE_ERRORHOOK
209 exit_errorhook:
210 x_nested_lock_os_int();
211 call_errorhook(ercd, OSServiceId_TerminateTask);
212 x_nested_unlock_os_int();
213#endif /* CFG_USE_ERRORHOOK */
214
215 exit_no_errorhook:
216 LOG_TERTSK_LEAVE(ercd);
217 return(ercd);
218}
219
220#endif /* TOPPERS_TerminateTask */
221
222/*
223 * 自タスクの終了とタスクの起動
224 */
225#ifdef TOPPERS_ChainTask
226
227StatusType
228ChainTask(TaskType TaskID)
229{
230 /*
231 * ここでの ercd の初期化は本来は不要であるが,コンパイラの警
232 * 告メッセージを避けるために初期化している
233 */
234 StatusType ercd = E_OK;
235 TCB *p_tcb;
236 OSAPCB *p_osapcb;
237
238 LOG_CHNTSK_ENTER(TaskID);
239 CHECK_DISABLEDINT();
240 CHECK_CALLEVEL(CALLEVEL_CHAINTASK);
241 CHECK_RESOURCE(p_runtsk->p_lastrescb == NULL);
242 CHECK_ID(TaskID < tnum_task);
243 p_tcb = get_tcb(TaskID);
244 CHECK_RIGHT(p_tcb->p_tinib->acsbtmp);
245
246 p_osapcb = p_tcb->p_tinib->p_osapcb;
247 x_nested_lock_os_int();
248
249 /* 起動するタスク所属のOSAPの状態をチェック */
250 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
251 ((p_osapcb->osap_stat == APPLICATION_RESTARTING) &&
252 (p_osapcb == p_runosap)));
253
254 if (p_tcb == p_runtsk) {
255 make_non_runnable();
256 (void) make_active(p_runtsk);
257 }
258 else {
259 /*
260 * エラー時に副作用が残らないように,エラーチェックは
261 * タスク終了処理の前に行う必要がある
262 */
263 S_D_CHECK_LIMIT((p_tcb->tstat == SUSPENDED)
264 || (p_tcb->actcnt < p_tcb->p_tinib->maxact));
265
266 suspend();
267
268 if (p_tcb->tstat == SUSPENDED) {
269 (void) make_active(p_tcb);
270 }
271 else {
272 p_tcb->actcnt += 1U;
273 }
274 }
275
276 LOG_CHNTSK_LEAVE(E_OK);
277 exit_and_dispatch();
278 ASSERT(0);
279
280#ifdef CFG_USE_ERRORHOOK
281 exit_errorhook:
282 x_nested_lock_os_int();
283 d_exit_errorhook:
284#ifdef CFG_USE_PARAMETERACCESS
285 _errorhook_par1.tskid = TaskID;
286#endif /* CFG_USE_PARAMETERACCESS */
287 call_errorhook(ercd, OSServiceId_ChainTask);
288#endif /* CFG_USE_ERRORHOOK */
289
290 d_exit_no_errorhook:
291 x_nested_unlock_os_int();
292 exit_no_errorhook:
293 LOG_CHNTSK_LEAVE(ercd);
294 return(ercd);
295}
296
297#endif /* TOPPERS_ChainTask */
298
299/*
300 * スケジューラの呼び出し
301 */
302#ifdef TOPPERS_Schedule
303
304StatusType
305Schedule(void)
306{
307 /*
308 * ここでの ercd の初期化は本来は不要であるが,コンパイラの警
309 * 告メッセージを避けるために初期化している
310 */
311 StatusType ercd = E_OK;
312
313 LOG_SCHED_ENTER();
314 CHECK_DISABLEDINT();
315 CHECK_CALLEVEL(CALLEVEL_SCHEDULE);
316 CHECK_RESOURCE(p_runtsk->p_lastrescb == NULL);
317
318 x_nested_lock_os_int();
319 if (p_runtsk->p_tinib->inipri > nextpri) {
320 p_runtsk->curpri = p_runtsk->p_tinib->inipri;
321 preempt();
322 dispatch();
323 p_runtsk->curpri = p_runtsk->p_tinib->exepri;
324 }
325
326 d_exit_no_errorhook:
327 x_nested_unlock_os_int();
328 exit_no_errorhook:
329 LOG_SCHED_LEAVE(ercd);
330 return(ercd);
331
332#ifdef CFG_USE_ERRORHOOK
333 exit_errorhook:
334 x_nested_lock_os_int();
335 call_errorhook(ercd, OSServiceId_Schedule);
336 goto d_exit_no_errorhook;
337#endif /* CFG_USE_ERRORHOOK */
338}
339
340#endif /* TOPPERS_Schedule */
341
342/*
343 * 実行状態のタスクIDの参照
344 */
345#ifdef TOPPERS_GetTaskID
346
347StatusType
348GetTaskID(TaskRefType TaskID)
349{
350 StatusType ercd = E_OK;
351
352 LOG_GETTID_ENTER();
353 CHECK_CALLEVEL(CALLEVEL_GETTASKID);
354 CHECK_PARAM_POINTER(TaskID);
355 CHECK_MEM_WRITE(TaskID, TaskType);
356 *TaskID = (p_runtsk == NULL) ? INVALID_TASK : TSKID(p_runtsk);
357
358 exit_no_errorhook:
359 LOG_GETTID_LEAVE(ercd, TaskID);
360 return(ercd);
361
362#ifdef CFG_USE_ERRORHOOK
363 exit_errorhook:
364 x_nested_lock_os_int();
365#ifdef CFG_USE_PARAMETERACCESS
366 _errorhook_par1.p_tskid = TaskID;
367#endif /* CFG_USE_PARAMETERACCESS */
368 call_errorhook(ercd, OSServiceId_GetTaskID);
369 x_nested_unlock_os_int();
370 goto exit_no_errorhook;
371#endif /* CFG_USE_ERRORHOOK */
372}
373
374#endif /* TOPPERS_GetTaskID */
375
376/*
377 * タスク状態の参照
378 */
379#ifdef TOPPERS_GetTaskState
380
381StatusType
382GetTaskState(TaskType TaskID, TaskStateRefType State)
383{
384 StatusType ercd = E_OK;
385 TCB *p_tcb;
386 OSAPCB *p_osapcb;
387
388 LOG_GETTST_ENTER(TaskID);
389 CHECK_CALLEVEL(CALLEVEL_GETTASKSTATE);
390 CHECK_ID(TaskID < tnum_task);
391 CHECK_PARAM_POINTER(State);
392 CHECK_MEM_WRITE(State, TaskStateType);
393 p_tcb = get_tcb(TaskID);
394 CHECK_RIGHT(p_tcb->p_tinib->acsbtmp);
395
396 p_osapcb = p_tcb->p_tinib->p_osapcb;
397 x_nested_lock_os_int();
398
399 /* 起動するタスク所属のOSAPの状態をチェック */
400 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) ||
401 ((p_osapcb->osap_stat == APPLICATION_RESTARTING) &&
402 (p_osapcb == p_runosap)));
403 *State = (p_tcb == p_runtsk) ? RUNNING : p_tcb->tstat;
404
405 d_exit_no_errorhook:
406 x_nested_unlock_os_int();
407 exit_no_errorhook:
408 LOG_GETTST_LEAVE(ercd, State);
409 return(ercd);
410
411#ifdef CFG_USE_ERRORHOOK
412 exit_errorhook:
413 x_nested_lock_os_int();
414 d_exit_errorhook:
415#ifdef CFG_USE_PARAMETERACCESS
416 _errorhook_par1.tskid = TaskID;
417 _errorhook_par2.p_stat = State;
418#endif /* CFG_USE_PARAMETERACCESS */
419 call_errorhook(ercd, OSServiceId_GetTaskState);
420 goto d_exit_no_errorhook;
421#endif /* CFG_USE_ERRORHOOK */
422}
423
424#endif /* TOPPERS_GetTaskState */
425
426/*
427 * 満了処理専用タスクの起動
428 *
429 * 条件:OS割込み禁止状態で呼ばれる
430 */
431#ifdef TOPPERS_activate_task_action
432
433StatusType
434activate_task_action(OSAPCB *p_expire_osapcb, TaskType TaskID)
435{
436 StatusType ercd = E_OK;
437 TCB *p_tcb;
438 OSAPCB *p_osapcb;
439
440 LOG_ACTTSK_ENTER(TaskID);
441 p_tcb = get_tcb(TaskID);
442
443 p_osapcb = p_tcb->p_tinib->p_osapcb;
444 /* 満了点所属のOSAP及び起動するタスク所属のOSAPの状態をチェック */
445 D_CHECK_ACCESS((p_osapcb->osap_stat == APPLICATION_ACCESSIBLE) || (p_expire_osapcb == p_osapcb));
446
447 if (p_tcb->tstat == SUSPENDED) {
448 (void) make_active(p_tcb);
449 }
450 else {
451 S_D_CHECK_LIMIT(p_tcb->actcnt < p_tcb->p_tinib->maxact);
452
453 p_tcb->actcnt += 1U;
454 }
455
456 d_exit_no_errorhook:
457 LOG_ACTTSK_LEAVE(ercd);
458 return(ercd);
459
460#ifdef CFG_USE_ERRORHOOK
461 d_exit_errorhook:
462#ifdef CFG_USE_PARAMETERACCESS
463 _errorhook_par1.tskid = TaskID;
464#endif /* CFG_USE_PARAMETERACCESS */
465 call_errorhook(ercd, OSServiceId_ActivateTask);
466 goto d_exit_no_errorhook;
467#endif /* CFG_USE_ERRORHOOK */
468
469}
470
471#endif /* TOPPERS_activate_task_action */
Note: See TracBrowser for help on using the repository browser.