source: atk2-sc3_fl850f1l/kernel/osctl.c@ 117

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

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

File size: 17.2 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.c 187 2015-06-25 03:39:04Z t_ishikawa $
57 */
58
59/*
60 * OS制御モジュール
61 */
62
63#include "kernel_impl.h"
64#include "interrupt.h"
65#include "task.h"
66
67/*
68 * トレースログマクロのデフォルト定義
69 */
70
71#ifndef LOG_ERRHOOK_ENTER
72#define LOG_ERRHOOK_ENTER(ercd)
73#endif /* LOG_ERRHOOK_ENTER */
74
75#ifndef LOG_ERRHOOK_LEAVE
76#define LOG_ERRHOOK_LEAVE()
77#endif /* LOG_ERRHOOK_LEAVE */
78
79#ifndef LOG_ERRHOOKOSAP_ENTER
80#define LOG_ERRHOOKOSAP_ENTER(p_runosap, ercd)
81#endif /* LOG_ERRHOOKOSAP_ENTER */
82
83#ifndef LOG_ERRHOOKOSAP_LEAVE
84#define LOG_ERRHOOKOSAP_LEAVE(p_runosap)
85#endif /* LOG_ERRHOOKOSAP_LEAVE */
86
87#ifndef LOG_PROHOOK_ENTER
88#define LOG_PROHOOK_ENTER(ercd)
89#endif /* LOG_PROHOOK_ENTER */
90
91#ifndef LOG_PROHOOK_LEAVE
92#define LOG_PROHOOK_LEAVE(pret)
93#endif /* LOG_PROHOOK_LEAVE */
94
95#ifndef LOG_SHUTHOOK_ENTER
96#define LOG_SHUTHOOK_ENTER(ercd)
97#endif /* LOG_SHUTHOOK_ENTER */
98
99#ifndef LOG_SHUTHOOK_LEAVE
100#define LOG_SHUTHOOK_LEAVE()
101#endif /* LOG_SHUTHOOK_LEAVE */
102
103#ifndef LOG_SHUTHOOKOSAP_ENTER
104#define LOG_SHUTHOOKOSAP_ENTER(index, ercd)
105#endif /* LOG_SHUTHOOKOSAP_ENTER */
106
107#ifndef LOG_SHUTHOOKOSAP_LEAVE
108#define LOG_SHUTHOOKOSAP_LEAVE(index)
109#endif /* LOG_SHUTHOOKOSAP_LEAVE */
110
111#ifndef LOG_STUTOS_ENTER
112#define LOG_STUTOS_ENTER(ercd)
113#endif /* LOG_STUTOS_ENTER */
114
115#ifndef LOG_STUTOS_LEAVE
116#define LOG_STUTOS_LEAVE()
117#endif /* LOG_STUTOS_LEAVE */
118
119#ifdef CFG_USE_ERRORHOOK
120/*
121 * エラーフックに渡す情報を格納する変数
122 */
123#ifdef TOPPERS_internal_call_errorhook
124
125#ifdef CFG_USE_GETSERVICEID
126DEFINE_VAR_SEC_NOBITS(OSServiceIdType, _errorhook_svcid, ".srpw_bss_kernel");
127#endif /* CFG_USE_GETSERVICEID */
128
129#ifdef CFG_USE_PARAMETERACCESS
130_ErrorHook_Par _errorhook_par1;
131_ErrorHook_Par _errorhook_par2;
132_ErrorHook_Par _errorhook_par3;
133DEFINE_VAR_SEC_NOBITS(_ErrorHook_Par, errorhook_par1, ".srpw_bss_kernel");
134DEFINE_VAR_SEC_NOBITS(_ErrorHook_Par, errorhook_par2, ".srpw_bss_kernel");
135DEFINE_VAR_SEC_NOBITS(_ErrorHook_Par, errorhook_par3, ".srpw_bss_kernel");
136#endif /* CFG_USE_PARAMETERACCESS */
137
138/*
139 * エラーフックの呼び出し
140 */
141void
142internal_call_errorhook(StatusType ercd, OSServiceIdType svcid)
143{
144 void (*volatile errorhook_adr) (StatusType Error);
145 uint8 saved_sus_all_cnt_ctx;
146 uint8 saved_sus_os_cnt_ctx;
147
148 boolean saved_run_trusted = run_trusted;
149
150 saved_sus_all_cnt_ctx = sus_all_cnt_ctx;
151 saved_sus_os_cnt_ctx = sus_os_cnt_ctx;
152
153 sus_all_cnt_ctx = 0U;
154 sus_os_cnt_ctx = 0U;
155
156#ifdef CFG_USE_SYSTEM_ERRORHOOK
157 /*
158 * C言語の規格では関数のアドレスは0にならないという前提から,
159 * コンパイラの最適化によりErrorHookのアドレス判定分岐が
160 * 削除されてしまう場合があるため, volatile指定したローカル変数に
161 * アドレスを代入してから判定している
162 */
163 errorhook_adr = &ErrorHook;
164
165 if (errorhook_adr != NULL) {
166 if ((callevel_stat & (TCL_ERROR | TSYS_ISR1)) == TCL_NULL) {
167
168#ifdef CFG_USE_GETSERVICEID
169 _errorhook_svcid = svcid;
170#endif /* CFG_USE_GETSERVICEID */
171
172#ifdef CFG_USE_PARAMETERACCESS
173 errorhook_par1 = _errorhook_par1;
174 errorhook_par2 = _errorhook_par2;
175 errorhook_par3 = _errorhook_par3;
176#endif /* CFG_USE_PARAMETERACCESS */
177
178 ENTER_CALLEVEL(TCL_SYS_ERROR);
179 run_trusted = TRUE;
180
181 LOG_ERRHOOK_ENTER(ercd);
182 ErrorHook(ercd);
183 LOG_ERRHOOK_LEAVE();
184 LEAVE_CALLEVEL(TCL_SYS_ERROR);
185
186 release_interrupts(OSServiceId_HookMissingEnd);
187 }
188 }
189#endif /* CFG_USE_SYSTEM_ERRORHOOK */
190
191#ifdef CFG_USE_OSAP_ERRORHOOK
192 /* OSアプリケーション定義のエラーフック呼出し */
193 errorhook_adr = NULL;
194 if (p_runosap != NULL) {
195 errorhook_adr = p_runosap->p_osapinib->ErrorHook;
196 }
197
198 if (errorhook_adr != NULL) {
199 if ((callevel_stat & (TCL_ERROR | TSYS_ISR1)) == TCL_NULL) {
200#ifdef CFG_USE_GETSERVICEID
201 _errorhook_svcid = svcid;
202#endif /* CFG_USE_GETSERVICEID */
203
204#ifdef CFG_USE_PARAMETERACCESS
205 errorhook_par1 = _errorhook_par1;
206 errorhook_par2 = _errorhook_par2;
207 errorhook_par3 = _errorhook_par3;
208#endif /* CFG_USE_PARAMETERACCESS */
209
210 ENTER_CALLEVEL(TCL_OSAP_ERROR);
211
212 LOG_ERRHOOKOSAP_ENTER(p_runosap, ercd);
213 if (p_runosap->p_osapinib->osap_trusted != FALSE) {
214 run_trusted = TRUE;
215 errorhook_adr(ercd);
216 }
217 else {
218 run_trusted = FALSE;
219 call_nontrusted_hook((void *) errorhook_adr, ercd, ERROR_HOOK);
220 }
221 LOG_ERRHOOKOSAP_LEAVE(p_runosap);
222
223 LEAVE_CALLEVEL(TCL_OSAP_ERROR);
224
225 release_interrupts(OSServiceId_HookMissingEnd);
226 }
227 }
228#endif /* CFG_USE_OSAP_ERRORHOOK */
229
230 sus_all_cnt_ctx = saved_sus_all_cnt_ctx;
231 sus_os_cnt_ctx = saved_sus_os_cnt_ctx;
232
233 run_trusted = saved_run_trusted;
234}
235
236#endif /* TOPPERS_internal_call_errorhook */
237
238#endif /* CFG_USE_ERRORHOOK */
239
240#ifdef CFG_USE_POSTTASKHOOK
241/*
242 * ポストタスクフックの呼び出し
243 */
244#ifdef TOPPERS_call_posttaskhook
245
246void
247call_posttaskhook(void)
248{
249 boolean saved_run_trusted;
250
251 ENTER_CALLEVEL(TCL_PREPOST);
252 saved_run_trusted = run_trusted;
253 run_trusted = TRUE;
254
255 PostTaskHook();
256
257 run_trusted = saved_run_trusted;
258
259 LEAVE_CALLEVEL(TCL_PREPOST);
260
261 release_interrupts(OSServiceId_HookMissingEnd);
262}
263
264#endif /* TOPPERS_call_posttaskhook */
265
266#endif /* CFG_USE_POSTTASKHOOK */
267
268#ifdef CFG_USE_PRETASKHOOK
269/*
270 * プレタスクフックの呼び出し
271 */
272#ifdef TOPPERS_call_pretaskhook
273
274void
275call_pretaskhook(void)
276{
277 boolean saved_run_trusted;
278
279 ENTER_CALLEVEL(TCL_PREPOST);
280 saved_run_trusted = run_trusted;
281 run_trusted = TRUE;
282
283 PreTaskHook();
284
285 run_trusted = saved_run_trusted;
286
287 LEAVE_CALLEVEL(TCL_PREPOST);
288
289 release_interrupts(OSServiceId_HookMissingEnd);
290}
291
292#endif /* TOPPERS_call_pretaskhook */
293
294#endif /* CFG_USE_PRETASKHOOK */
295
296#ifdef CFG_USE_STACKMONITORING
297
298#ifdef TOPPERS_init_stack_magic_region
299
300/*
301 * スタックモニタリング機能の初期化
302 * スタックモニタリング機能のためのマジックナンバー領域の初期化
303 */
304void
305init_stack_magic_region(void)
306{
307 StackType *p_stack_magic_region;
308
309 /*
310 * スタックモニタリング機能のため,スタック成長方向考慮した
311 * 非タスクスタックのマジックナンバー領域の初期化
312 */
313 p_stack_magic_region = TOPPERS_ISTK_MAGIC_REGION(_ostk, _ostksz);
314 *p_stack_magic_region = STACK_MAGIC_NUMBER;
315}
316
317#endif /* TOPPERS_init_stack_magic_region */
318
319#endif /* CFG_USE_STACKMONITORING */
320
321/*
322 * シャットダウンフックの強制終了
323 */
324#ifdef TOPPERS_cancel_shutdown_hook
325
326void
327cancel_shutdown_hook(void)
328{
329
330 if (is_running_nontrusted_shtdwnhk() != FALSE) {
331 /* 非信頼フックの強制終了 */
332 exit_nontrusted_hook();
333 }
334 else {
335 /* 信頼フックの強制終了 */
336 exit_trusted_shutdown_hook();
337 }
338 ASSERT(0);
339}
340#endif /* TOPPERS_cancel_shutdown_hook */
341
342/*
343 * 処理レベルチェック付きのOSシャットダウン
344 * プロテクションフックの呼び出し処理から呼ばれる
345 * シャットダウンフック実行中に発生した場合,
346 * シャットダウンフックをキャンセルして後続シャット
347 * ダウン処理を続ける
348 *
349 */
350#ifdef TOPPERS_callevel_chk_shutdown
351
352void
353callevel_chk_shutdown(StatusType ercd)
354{
355
356 if ((callevel_stat & TCL_SHUTDOWN) != TCL_NULL) {
357 if (((callevel_stat & TCL_OSAP_SHUTDOWN) != TCL_NULL) && (p_runosap != NULL)) {
358 p_runosap->osap_stat = APPLICATION_TERMINATED;
359 }
360 cancel_shutdown_hook();
361 }
362 else {
363 internal_shutdownos(ercd);
364 }
365}
366#endif /* TOPPERS_callevel_chk_shutdown */
367
368/*
369 * プロテクションフックの呼び出し
370 * 引数の最上位ビットは,呼び出し箇所を示す役割がある
371 */
372#ifdef TOPPERS_call_protectionhk_main
373
374void
375call_protectionhk_main(StatusType peob_ercd)
376{
377 StatusType protection_error = peob_ercd & (~PROTECTION_ERROR_OPTIONAL_BIT);
378
379#ifdef CFG_USE_PROTECTIONHOOK
380
381 boolean saved_run_trusted;
382
383 ProtectionReturnType pret;
384 ProtectionReturnType (*volatile protectionhook_adr) (StatusType FatalError);
385 uint8 saved_sus_all_cnt_ctx;
386 uint8 saved_sus_os_cnt_ctx;
387
388 /* プロテクションフック実行中に保護違反が発生した場合 */
389 if ((callevel_stat & TCL_PROTECT) == TCL_PROTECT) {
390 callevel_chk_shutdown(E_OS_PROTECTION_FATAL);
391 }
392
393 /*
394 * C言語の規格では関数のアドレスは0にならないという前提から,
395 * コンパイラの最適化によりProtectionHookのアドレス判定分岐が
396 * 削除されてしまう場合があるため, volatile指定したローカル変数に
397 * アドレスを代入してから判定している
398 */
399 protectionhook_adr = &ProtectionHook;
400
401 /* 以下 システム定義のプロテクションフックを呼出す処理 */
402 if (protectionhook_adr != NULL) {
403
404 saved_sus_all_cnt_ctx = sus_all_cnt_ctx;
405 saved_sus_os_cnt_ctx = sus_os_cnt_ctx;
406
407 sus_all_cnt_ctx = 0U;
408 sus_os_cnt_ctx = 0U;
409
410 ENTER_CALLEVEL(TCL_PROTECT);
411 saved_run_trusted = run_trusted;
412
413 run_trusted = TRUE;
414 LOG_PROHOOK_ENTER(protection_error);
415 pret = protectionhook_adr(protection_error);
416 LOG_PROHOOK_LEAVE(pret);
417 run_trusted = saved_run_trusted;
418
419 LEAVE_CALLEVEL(TCL_PROTECT);
420
421 release_interrupts(OSServiceId_HookMissingEnd);
422
423 sus_all_cnt_ctx = saved_sus_all_cnt_ctx;
424 sus_os_cnt_ctx = saved_sus_os_cnt_ctx;
425
426 /* 以下 ProtectionHook 実行後の処理 */
427 switch (pret) {
428 case PRO_SHUTDOWN:
429 callevel_chk_shutdown(protection_error);
430 break;
431 case PRO_TERMINATETASKISR:
432 if ((callevel_stat & TCL_SHUTDOWN) != TCL_NULL) {
433 if (((callevel_stat & TCL_OSAP_SHUTDOWN) != TCL_NULL) && (p_runosap != NULL)) {
434 p_runosap->osap_stat = APPLICATION_TERMINATED;
435 }
436 cancel_shutdown_hook();
437 }
438 if ((callevel_stat & TSYS_ISR1) != TSYS_NULL) {
439 internal_shutdownos(E_OS_PROTECTION_FATAL);
440 }
441 if ((callevel_stat & (TCL_STARTUP | TCL_ERROR | TCL_PREPOST)) != TCL_NULL) {
442 /* スタートアップフック実行中はシャットダウン */
443 internal_shutdownos(E_OS_PROTECTION_FATAL);
444 }
445
446 if (p_runisr != NULL) {
447 /* 機能レベル2ではC2ISR実行中はシャットダウン */
448 internal_shutdownos(E_OS_PROTECTION_FATAL);
449 }
450 else if ((p_runtsk != NULL) && (p_runtsk->calltfn == FALSE)) {
451 /* タスクの場合 */
452 force_terminate_task(p_runtsk, peob_ercd, FALSE);
453
454 /*
455 * ディスパッチャ,割込み入口処理でのスタックモニタリング
456 * の場合は,ここに戻るが,それ以外の場合ここに戻らない
457 */
458 }
459 else {
460 /* 機能レベル2でタスク,C2ISRが存在しない場合 */
461 internal_shutdownos(E_OS_PROTECTION_FATAL);
462 }
463 break;
464 case PRO_IGNORE:
465 if (protection_error != E_OS_PROTECTION_EXCEPTION) {
466 callevel_chk_shutdown(E_OS_PROTECTION_FATAL);
467 }
468 break;
469 case PRO_TERMINATEAPPL:
470 if ((callevel_stat & TCL_SHUTDOWN) != TCL_NULL) {
471 if (((callevel_stat & TCL_OSAP_SHUTDOWN) != TCL_NULL) && (p_runosap != NULL)) {
472 p_runosap->osap_stat = APPLICATION_TERMINATED;
473 }
474 cancel_shutdown_hook();
475 }
476 if ((callevel_stat & TSYS_ISR1) != TSYS_NULL) {
477 internal_shutdownos(E_OS_PROTECTION_FATAL);
478 }
479 if ((callevel_stat & (TCL_SYS_STARTUP | TCL_SYS_ERROR | TCL_PREPOST)) != TCL_NULL) {
480 internal_shutdownos(E_OS_PROTECTION_FATAL);
481 }
482 if ((p_runosap == NULL) || (run_trusted != FALSE)) {
483 internal_shutdownos(E_OS_PROTECTION_FATAL);
484 }
485 else {
486 internal_term_osap(p_runosap, NO_RESTART);
487 }
488 break;
489 case PRO_TERMINATEAPPL_RESTART:
490 if ((callevel_stat & TCL_SHUTDOWN) != TCL_NULL) {
491 if (((callevel_stat & TCL_OSAP_SHUTDOWN) != TCL_NULL) && (p_runosap != NULL)) {
492 p_runosap->osap_stat = APPLICATION_TERMINATED;
493 }
494 cancel_shutdown_hook();
495 }
496 if ((callevel_stat & TSYS_ISR1) != TSYS_NULL) {
497 internal_shutdownos(E_OS_PROTECTION_FATAL);
498 }
499 if ((callevel_stat & (TCL_STARTUP | TCL_SYS_ERROR | TCL_PREPOST)) != TCL_NULL) {
500 internal_shutdownos(E_OS_PROTECTION_FATAL);
501 }
502 if ((p_runosap == NULL) || (run_trusted != FALSE)) {
503 internal_shutdownos(E_OS_PROTECTION_FATAL);
504 }
505 else {
506 internal_term_osap(p_runosap, RESTART);
507 }
508 break;
509 default:
510 /* ProtectionHookから不正な値が返った場合 */
511 callevel_chk_shutdown(E_OS_PROTECTION_FATAL);
512 break;
513 }
514 }
515 else {
516 callevel_chk_shutdown(protection_error);
517 }
518
519#else /* CFG_USE_PROTECTIONHOOK */
520
521 /*
522 * プロテクションフックがコンフィギュレーション時に無効と
523 * されている場合,OSは保護違反時処理としてOSシャットダウンを
524 * 行う
525 * このとき,OSシャットダウンのパラメータとして,
526 * 違反の区別を示すエラーコードを指定する
527 */
528 callevel_chk_shutdown(protection_error);
529#endif /* CFG_USE_PROTECTIONHOOK */
530
531}
532
533#endif /* TOPPERS_call_protectionhk_main */
534
535/*
536 * OS内部からのShutdownOSの呼び出し
537 */
538#ifdef TOPPERS_internal_shutdownos
539
540void
541internal_shutdownos(StatusType ercd)
542{
543 LOG_STUTOS_ENTER(ercd);
544
545 x_nested_lock_os_int();
546
547#ifdef CFG_USE_SHUTDOWNHOOK
548 call_shutdownhook(ercd);
549#endif /* CFG_USE_SHUTDOWNHOOK */
550
551 /* 各モジュールの終了処理 */
552 object_terminate();
553
554 /* 全割込み禁止状態に移行 */
555 x_lock_all_int();
556
557 LOG_STUTOS_LEAVE();
558
559 /* ターゲット依存の終了処理 */
560 target_exit();
561
562 /*
563 * ターゲット依存部から処理が返ってきた場合,
564 * 無限ループを行う
565 */
566 while (1) {
567 }
568
569}
570
571#endif /* TOPPERS_internal_shutdownos */
572
573#ifdef TOPPERS_internal_call_shtdwnhk
574
575#ifdef CFG_USE_SHUTDOWNHOOK
576
577void
578internal_call_shtdwnhk(StatusType ercd)
579{
580
581 void (*volatile shutdownhook_adr) (StatusType Error);
582#ifdef CFG_USE_OSAP_SHUTDOWNHOOK
583 ApplicationType i;
584#endif /* CFG_USE_OSAP_SHUTDOWNHOOK */
585
586 /*
587 * シャットダウンフック中のシャットダウンではシャットダウンフック
588 * は呼び出さない
589 */
590 if ((callevel_stat & TCL_SHUTDOWN) == TCL_NULL) {
591
592 sus_all_cnt_ctx = 0U;
593 sus_os_cnt_ctx = 0U;
594
595#ifdef CFG_USE_OSAP_SHUTDOWNHOOK
596 /*
597 * OSアプリケーション定義のShutdownHook呼出し
598 *
599 * OSアプリケーション初期化ブロックに設定されたエントリが
600 * NULLでなければ実行する
601 */
602
603 for (i = 0U; i < tnum_osap; i++) {
604 shutdownhook_adr = osapinib_table[i].ShutdownHook;
605 p_runosap = &(osapcb_table[i]);
606 if ((shutdownhook_adr != NULL) && (p_runosap->osap_stat == APPLICATION_ACCESSIBLE)) {
607 ENTER_CALLEVEL(TCL_OSAP_SHUTDOWN);
608 LOG_SHUTHOOKOSAP_ENTER(i, ercd);
609 if (p_runosap->p_osapinib->osap_trusted != FALSE) {
610 run_trusted = TRUE;
611 call_trusted_hook((void *) shutdownhook_adr, ercd);
612 }
613 else {
614 run_trusted = FALSE;
615 call_nontrusted_hook((void *) shutdownhook_adr, ercd, SHUTDOWN_HOOK);
616 }
617 LOG_SHUTHOOKOSAP_LEAVE(i);
618 LEAVE_CALLEVEL(TCL_OSAP_SHUTDOWN);
619
620 release_interrupts(OSServiceId_HookMissingEnd);
621 }
622 }
623#endif /* CFG_USE_OSAP_SHUTDOWNHOOK */
624
625#ifdef CFG_USE_SYSTEM_SHUTDOWNHOOK
626 p_runosap = NULL;
627
628 /*
629 * ShutdownHook の呼び出し
630 *
631 * C言語の規格では関数のアドレスは0にならないという前提から,
632 * コンパイラの最適化によりShutdownHookのアドレス判定分岐が
633 * 削除されてしまう場合があるため, volatile指定したローカル変数に
634 * アドレスを代入してから判定している
635 */
636 shutdownhook_adr = &ShutdownHook;
637
638 if (shutdownhook_adr != NULL) {
639 ENTER_CALLEVEL(TCL_SYS_SHUTDOWN);
640 run_trusted = TRUE;
641 LOG_SHUTHOOK_ENTER(ercd);
642 call_trusted_hook((void *) &ShutdownHook, ercd);
643 LOG_SHUTHOOK_LEAVE();
644 LEAVE_CALLEVEL(TCL_SYS_SHUTDOWN);
645
646 release_interrupts(OSServiceId_HookMissingEnd);
647 }
648#endif /* CFG_USE_SYSTEM_SHUTDOWNHOOK */
649 }
650}
651#endif /* CFG_USE_SHUTDOWNHOOK */
652
653#endif /* TOPPERS_internal_call_shtdwnhk */
Note: See TracBrowser for help on using the repository browser.