source: atk2-sc3_fl850f1l/kernel/osctl_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: 10.9 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: osctl_manage.c 187 2015-06-25 03:39:04Z t_ishikawa $
57 */
58
59/*
60 * OS管理モジュール
61 */
62
63#include "kernel_impl.h"
64#include "check.h"
65#include "interrupt.h"
66
67/*
68 * トレースログマクロのデフォルト定義
69 */
70#ifndef LOG_GETAAM_ENTER
71#define LOG_GETAAM_ENTER()
72#endif /* LOG_GETAAM_ENTER */
73
74#ifndef LOG_GETAAM_LEAVE
75#define LOG_GETAAM_LEAVE(mode)
76#endif /* LOG_GETAAM_LEAVE */
77
78#ifndef LOG_STAOS_ENTER
79#define LOG_STAOS_ENTER(mode)
80#endif /* LOG_STAOS_ENTER */
81
82#ifndef LOG_STAOS_LEAVE
83#define LOG_STAOS_LEAVE()
84#endif /* LOG_STAOS_LEAVE */
85
86#ifndef LOG_STAHOOK_ENTER
87#define LOG_STAHOOK_ENTER()
88#endif /* LOG_STAHOOK_ENTER */
89
90#ifndef LOG_STAHOOK_LEAVE
91#define LOG_STAHOOK_LEAVE()
92#endif /* LOG_STAHOOK_LEAVE */
93
94#ifndef LOG_STAHOOKOSAP_ENTER
95#define LOG_STAHOOKOSAP_ENTER(index)
96#endif /* LOG_STAHOOKOSAP_ENTER */
97
98#ifndef LOG_STAHOOKOSAP_LEAVE
99#define LOG_STAHOOKOSAP_LEAVE(index)
100#endif /* LOG_STAHOOKOSAP_LEAVE */
101
102#ifdef TOPPERS_StartOS
103
104/*
105 * OS実行制御のための変数
106 */
107uint16 callevel_stat = 0U; /* 実行中のコンテキスト */
108AppModeType appmodeid; /* アプリケーションモードID */
109
110/*
111 * カーネル動作状態フラグ
112 */
113boolean kerflg = FALSE;
114
115/*
116 * 特権モードで動作中かを示すフラグ
117 */
118boolean run_trusted;
119
120/*
121 * ファイル名,行番号の参照用の変数
122 */
123const char8 *fatal_file_name = NULL; /* ファイル名 */
124sint32 fatal_line_num = 0; /* 行番号 */
125
126/*
127 * OSの起動
128 */
129
130void
131StartOS(AppModeType Mode)
132{
133#ifdef CFG_USE_STARTUPHOOK
134 void (*volatile startuphook_adr) (void);
135#ifdef CFG_USE_OSAP_STARTUPHOOK
136 ApplicationType i;
137#endif /* CFG_USE_OSAP_STARTUPHOOK */
138#endif /* CFG_USE_STARTUPHOOK */
139
140 LOG_STAOS_ENTER(Mode);
141 if (kerflg != FALSE) {
142 /* OS起動中はエラーフックを呼ぶ */
143#ifdef CFG_USE_ERRORHOOK
144 x_nested_lock_os_int();
145#ifdef CFG_USE_PARAMETERACCESS
146 _errorhook_par1.mode = Mode;
147#endif /* CFG_USE_PARAMETERACCESS */
148 call_errorhook(E_OS_ACCESS, OSServiceId_StartOS);
149 x_nested_unlock_os_int();
150#endif /* CFG_USE_ERRORHOOK */
151 }
152 else {
153
154 /* 全割込み禁止状態に移行 */
155 x_lock_all_int();
156
157#ifdef CFG_USE_STACKMONITORING
158 /*
159 * スタックモニタリング機能の初期化
160 * スタックモニタリング機能のためのマジックナンバー領域の初期化
161 */
162 init_stack_magic_region();
163#endif /* CFG_USE_STACKMONITORING */
164
165 /* アプリケーションモードの設定 */
166 appmodeid = Mode;
167
168 /* ターゲット依存の初期化 */
169 target_initialize();
170
171 /* 各モジュールの初期化 */
172 object_initialize();
173
174 callevel_stat = TCL_NULL;
175
176 /* カーネル動作中 */
177 kerflg = TRUE;
178
179 run_trusted = TRUE;
180
181 /*
182 * Modeが不正であった場合,OSシャットダウンを行う
183 * この時,スタートアップフックは呼び出されない
184 */
185 if (Mode >= tnum_appmode) {
186 /*
187 * internal_shutdownosを呼ぶ前にOS割込み禁止状態へ
188 * 全割込み禁止状態解除
189 */
190 x_nested_lock_os_int();
191 x_unlock_all_int();
192 internal_shutdownos(E_OS_MODE);
193 }
194
195#ifdef CFG_USE_STARTUPHOOK
196 /* OS割込み禁止状態にし,全割込み禁止状態解除 */
197 x_nested_lock_os_int();
198 x_unlock_all_int();
199
200#ifdef CFG_USE_SYSTEM_STARTUPHOOK
201 /*
202 * StartupHook の呼び出し
203 *
204 * C言語の規格では関数のアドレスは0にならないという前提から,
205 * コンパイラの最適化によりStartupHookのアドレス判定分岐が
206 * 削除されてしまう場合があるため, volatile指定したローカル変数に
207 * アドレスを代入してから判定している
208 */
209 startuphook_adr = &StartupHook;
210
211 if (startuphook_adr != NULL) {
212 ENTER_CALLEVEL(TCL_SYS_STARTUP);
213 LOG_STAHOOK_ENTER();
214 StartupHook();
215 LOG_STAHOOK_LEAVE();
216 LEAVE_CALLEVEL(TCL_SYS_STARTUP);
217
218 release_interrupts(OSServiceId_HookMissingEnd);
219 }
220#endif /* CFG_USE_SYSTEM_STARTUPHOOK */
221
222#ifdef CFG_USE_OSAP_STARTUPHOOK
223 /*
224 * OSアプリケーション定義のStartUpHook呼出し
225 *
226 * OSアプリケーション初期化ブロックに設定されたエントリが
227 * NULLでなければ実行する
228 */
229 for (i = 0U; i < tnum_osap; i++) {
230 startuphook_adr = osapinib_table[i].StartupHook;
231 p_runosap = &(osapcb_table[i]);
232 if (startuphook_adr != NULL) {
233 ENTER_CALLEVEL(TCL_OSAP_STARTUP);
234 LOG_STAHOOKOSAP_ENTER(i);
235 if (p_runosap->p_osapinib->osap_trusted != FALSE) {
236 run_trusted = TRUE;
237 startuphook_adr();
238 }
239 else {
240 run_trusted = FALSE;
241 call_nontrusted_hook((void *) startuphook_adr, 0U, STARTUP_HOOK);
242 }
243 LOG_STAHOOKOSAP_LEAVE(i);
244 LEAVE_CALLEVEL(TCL_OSAP_STARTUP);
245
246 release_interrupts(OSServiceId_HookMissingEnd);
247 }
248 }
249 /*
250 * 以下の2行はなくても影響はないが,アイドルループでの状態を信頼・
251 * OSAPなしの状態にする
252 */
253 run_trusted = TRUE;
254 p_runosap = NULL;
255#endif /* CFG_USE_OSAP_STARTUPHOOK */
256
257 /* 元の割込みマスク優先度と全割込み禁止状態に */
258 x_lock_all_int();
259 x_nested_unlock_os_int();
260#endif /* CFG_USE_STARTUPHOOK */
261
262
263 ENTER_CALLEVEL(TCL_TASK);
264 LOG_STAOS_LEAVE();
265 start_dispatch();
266 ASSERT(0);
267 }
268}
269
270#endif /* TOPPERS_StartOS */
271
272/*
273 * 現在のアプリケーションモードの取得
274 */
275#ifdef TOPPERS_GetActiveApplicationMode
276
277AppModeType
278GetActiveApplicationMode(void)
279{
280 AppModeType appmode;
281 StatusType ercd;
282
283 LOG_GETAAM_ENTER();
284 CHECK_DISABLEDINT();
285 CHECK_CALLEVEL(CALLEVEL_GETACTIVEAPPMODE);
286
287 appmode = appmodeid;
288
289 exit_finish:
290 LOG_GETAAM_LEAVE(appmode);
291 return(appmode);
292
293#ifdef CFG_USE_ERRORHOOK
294 exit_errorhook:
295 x_nested_lock_os_int();
296 /*
297 * エラー発生時はINVALID_APPMODETYPEが返るが,エラーが発生したのか実行中の
298 * C2ISRが存在しないのか区別するため,エラーフックを呼ぶ
299 */
300 call_errorhook(ercd, OSServiceId_GetActiveApplicationMode);
301 x_nested_unlock_os_int();
302#endif /* CFG_USE_ERRORHOOK */
303
304 exit_no_errorhook:
305 appmode = INVALID_APPMODETYPE;
306 goto exit_finish;
307}
308
309#endif /* TOPPERS_GetActiveApplicationMode */
310
311/*
312 * OSの終了
313 */
314#ifdef TOPPERS_ShutdownOS
315
316void
317ShutdownOS(StatusType Error)
318{
319 StatusType ercd = Error;
320
321 /*
322 * 呼出し元所属 OSアプリケーションの信頼/非信頼のチェック
323 * 呼出し元が信頼関数,システム定義フックである場合は
324 * ShutdownOS() を実行する
325 */
326 if (run_trusted == FALSE) {
327 /* 非信頼から呼ばれた場合はエラーフックを呼ぶ */
328#ifdef CFG_USE_ERRORHOOK
329 x_nested_lock_os_int();
330#ifdef CFG_USE_PARAMETERACCESS
331 _errorhook_par1.error = Error;
332#endif /* CFG_USE_PARAMETERACCESS */
333 call_errorhook(E_OS_ACCESS, OSServiceId_ShutdownOS);
334 x_nested_unlock_os_int();
335#endif /* CFG_USE_ERRORHOOK */
336 }
337 else {
338
339 /*
340 * 不正な処理単位から呼び出した場合も,ErrorをE_OS_SHUTDOWN_FATALとして
341 * ShutdownOSを呼び出したものとして,シャットダウン処理を行う
342 */
343 if (((callevel_stat & TCLMASK) | (CALLEVEL_SHUTDOWNOS)) != (CALLEVEL_SHUTDOWNOS)) {
344 ercd = E_OS_SHUTDOWN_FATAL;
345 }
346
347 /*
348 * OSで定義されていないエラーコードが指定された場合,ErrorをE_OS_SHUTDOWN_FATALとして
349 * ShutdownOSを呼び出したものとして,シャットダウン処理を行う
350 */
351 if (ercd > ERRCODE_NUM) {
352 ercd = E_OS_SHUTDOWN_FATAL;
353 }
354
355 internal_shutdownos(ercd);
356 }
357}
358#endif /* TOPPERS_ShutdownOS */
359
360/*
361 * 保護違反を起こした処理単位の取得
362 */
363#ifdef TOPPERS_GetFaultyContext
364
365FaultyContextType
366GetFaultyContext(void)
367{
368 FaultyContextType faultycontext = FC_INVALID;
369
370#ifdef CFG_USE_PROTECTIONHOOK
371 if ((callevel_stat & CALLEVEL_GETFAULTYCONTEXT) != 0U) {
372
373 /* C1ISR以外で発生 */
374 if ((callevel_stat & TSYS_ISR1) == 0U) {
375 /* フック中に発生 */
376 if ((callevel_stat & (TCL_ERROR | TCL_PREPOST | TCL_STARTUP | TCL_SHUTDOWN)) != 0U) {
377 if ((callevel_stat & TCL_OSAP_MASK) != 0U) {
378 /* OSAP所属のフック中に発生 */
379 faultycontext = FC_OSAP_HOOK;
380 }
381 else {
382 /* システム定義フック中に発生 */
383 faultycontext = FC_SYSTEM_HOOK;
384 }
385 }
386 else if ((callevel_stat & TCL_ISR2) != 0U) {
387 if (p_runisr->calltfn != FALSE) {
388 /* C2ISRから呼出した信頼関数中に発生 */
389 faultycontext = FC_TRUSTED_FUNC;
390 }
391 else {
392 faultycontext = FC_C2ISR;
393 }
394 }
395 else if ((callevel_stat & TCL_TASK) != 0U) {
396 if (p_runtsk->calltfn != FALSE) {
397 /* タスクから呼出した信頼関数中に発生 */
398 faultycontext = FC_TRUSTED_FUNC;
399 }
400 else {
401 faultycontext = FC_TASK;
402 }
403 }
404 else {
405 /* 上記以外の場合,処理は行わない(戻り値:FC_INVALID) */
406 }
407 }
408 }
409#endif /* CFG_USE_PROTECTIONHOOK */
410
411 return(faultycontext);
412}
413#endif /* TOPPERS_GetFaultyContext */
Note: See TracBrowser for help on using the repository browser.