source: atk2-sc3-1.4.0-ntisr/kernel/task_manage.c@ 172

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

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

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