source: atk2-sc3_fl850f1l/doc/porting.txt@ 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: 68.6 KB
Line 
1
2 TOPPERS/ATK2-SC3
3 ターゲット依存部 ポーティングガイド
4
5このドキュメントは,TOPPERS/ATK2-SC3を,未サポートのターゲットシステム
6にポーティングするために必要となるターゲット依存部の実装方法を説明する
7ものである.
8
9----------------------------------------------------------------------
10TOPPERS ATK2
11 Toyohashi Open Platform for Embedded Real-Time Systems
12 Automotive Kernel Version 2
13
14Copyright (C) 2011-2015 by Center for Embedded Computing Systems
15 Graduate School of Information Science, Nagoya Univ., JAPAN
16Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
17Copyright (C) 2011-2013 by Spansion LLC, USA
18Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
19Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
20Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
21Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
22Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
23Copyright (C) 2011-2015 by Witz Corporation
24Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
25Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
26Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
27
28上記著作権者は,以下の (1)〜(3)の条件を満たす場合に限り,本ドキュメ
29ント(本ドキュメントを改変したものを含む.以下同じ)を使用・複製・改
30変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
31(1) 本ドキュメントを利用する場合には,上記の著作権表示,この利用条件
32 および下記の無保証規定が,そのままの形でドキュメント中に含まれて
33 いること.
34(2) 本ドキュメントを改変する場合には,ドキュメントを改変した旨の記述
35 を,改変後のドキュメント中に含めること.ただし,改変後のドキュメ
36 ントが,TOPPERSプロジェクト指定の開発成果物である場合には,この限
37 りではない.
38(3) 本ドキュメントの利用により直接的または間接的に生じるいかなる損害
39 からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また,
40 本ドキュメントのユーザまたはエンドユーザからのいかなる理由に基づ
41 く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
42
43本ドキュメントは,AUTOSAR(AUTomotive Open System ARchitecture)仕様
44に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するものではな
45い.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利用する
46者に対して,AUTOSARパートナーになることを求めている.
47
48本ドキュメントは,無保証で提供されているものである.上記著作権者およ
49びTOPPERSプロジェクトは,本ドキュメントに関して,特定の使用目的に対す
50る適合性も含めて,いかなる保証も行わない.また,本ドキュメントの利用
51により直接的または間接的に生じたいかなる損害に関しても,その責任を負
52わない.
53
54$Id: porting.txt 187 2015-06-25 03:39:04Z t_ishikawa $
55----------------------------------------------------------------------
56
57○目次
58
59◎0.本マニュアルの位置づけ
601.共通事項
61 1.1 ターゲット依存部の構成
62 1.2 多重インクルードの防止
63 1.3 アセンブリ言語とのヘッダファイルの共用
64 1.4 インクルード記述の方法
65 1.5 クリティカルセクションの出入処理の実現に関する制約
662.システム構築環境のターゲット依存部
67 2.1 ターゲット略称とターゲット依存部のディレクトリ
68 2.2 Makefileのターゲット依存部
69 2.3 開発環境名とコマンド名の設定
70 2.4 コンパイルオプションとオブジェクトファイルの設定
71 2.5 オフセットファイルの生成方法
72 2.5.1 ジェネレータを用いる方法
73 ○2.6 リンク方法の設定
74 ○2.7 依存関係の定義
75 2.8 その他の設定
763.AUTOSAR共通定義のターゲット依存部
77 3.1 整数型の最大値・最小値・ビット数
78 3.2 整数型
79 3.3 論理型,論理型の値
80 3.4 その他の型
81 3.5 コンパイラの拡張機能のためのマクロ定義
82 3.6 標準的な定義の上書き
834.システムインタフェースレイヤ(SIL)のターゲット依存部
84 4.1 全割込み禁止状態の管理
85 4.2 プロセッサのエンディアン
86 4.3 I/O空間アクセス関数
875.カーネルAPIのターゲット依存部
88 5.1 メモリ領域確保のための型定義
89 5.2 メモリ領域確保のためのマクロ
90 ○5.3 オブジェクト型の上書き
916.カーネル実装のターゲット依存部
92 6.1 カーネル実装のターゲット依存部の共通事項
93 ○6.1.1 カーネル実装のターゲット依存部の構成要素
94 6.1.2 ターゲット依存部の関数の命名規則
95 6.2 トレースログ機能への対応
96 6.3 システム状態の管理
97 6.3.1 全割込み禁止状態の管理
98 6.3.2 コンテキストの管理
99 6.3.3 OS割込み禁止状態の管理
100 6.4 割込みに関連するシステム状態の管理
101 6.4.1 割込み優先度マスクの管理
102 6.4.2 割込みハンドラの先頭処理と末尾処理
103 ◎6.4.3 個別割込み禁止状態の管理
104 6.5 タスクディスパッチャ
105 ○6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
106 6.5.2 ディスパッチャ本体
107 6.5.3 タスクコンテキストからのディスパッチ
108 6.5.4 ディスパッチャの動作開始
109 ○6.5.5 現在のコンテキストを捨ててディスパッチ
110 ○6.5.6 タスクの起動処理
111 6.6 割込みハンドラ
112 ○6.6.1 割込みハンドラの出入口処理
113 ○6.6.2 割込み要求ラインの属性の設定
114 ○6.6.3 割込み管理機能の初期化処理の変更
115 6.6.4 デフォルトのC2ISR
116 6.6.5 カーネル管理外の割込み
117 6.6.6 DisableAllInterrupts/EnableAllInterruptsの処理内容の変更
118 ◎6.6.7 割込み禁止解除
119 6.7 スタックモニタリング
120 ◎6.7.1 ディスパッチャとC2ISRの出入口処理でのスタックモニタリング
121 ◎6.7.2 信頼関数実行の出口処理でのスタックモニタリング
122 ○6.8 CPU例外ハンドラ
123 ◎6.9 ソフトウェア割込みハンドラ
124 ◎6.10 信頼OSAPと非信頼OSAPからのシステムサービス呼出し
125 ◎6.10.1 システムサービス呼出しの定義
126 ◎6.10.2 信頼OSAPからのシステムサービス呼出し
127 ◎6.10.3 非信頼OSAPからのシステムサービス呼出し
128 ◎6.10.4 ターゲット依存システムサービスの追加
129 ◎6.11 メモリ保護機構(MPU)制御
130 ◎6.11.1 スタックのMPU設定情報ブロック(STKMPUINFOB)
131 ◎6.11.2 OSAP固有MPU設定情報ブロック(OSAPMPUINFOB)
132 ◎6.11.3 MPU初期化処理
133 ◎6.11.4 OSAP固有MPU情報設定処理
134 ◎6.11.5 MPU依存のバックグラウンド領域チェック
135 ◎6.12 メモリ管理のチューニング
136 ◎6.12.1 メモリオブジェクトの管理
137 ◎6.12.2 メモリアクセス権チェックのためのマクロ
138 6.13 エラーフック,シャットダウンフック呼び出し
139 ○6.14 カーネルの起動・終了とスタック領域など
140 6.15 カーネル内部のチューニング
141 6.15.1 ビットマップサーチ
142 6.16 カーネル実装に関するその他の定義
143 6.16.1 エラーチェック方法の指定
144 6.16.2 非タスクコンテキスト用のスタック領域
145 6.16.3 空ラベルの定義
146 ○6.16.4 各スタックのデフォルト値
147 ○6.16.5 スタックマジックナンバー領域操作マクロの定義
148 ◎6.16.6 標準以外メモリリージョン属性の定義
149 6.17 トレースログ機能に関する設定
150 6.17.1 取得できるトレースログの種類とマクロ
151 6.17.2 トレースログ記録のサンプルコード
152 ◎6.18 信頼フック,シャットダウンフックの強制終了
153 ◎6.19 コア起動
154 ◎6.20 フックの確認
155 ◎6.21 スタック切り替え
156 ◎6.22 非信頼フックルーチンスタック領域
157 6.14 ハードウェアカウンタ
158 6.14.1 ハードウェアカウンタのファイル構成
159 6.14.2 ハードウェアカウンタの情報提供
1607.ジェネレータ設定ファイルのターゲット依存部
161 7.1 設定ファイルとターゲット依存部の位置付け
162 7.2 パス2のテンプレートファイルのターゲット依存部
163 ○7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
164 ○7.2.2 ターゲット非依存部で定義される変数
165 7.3 パス3のテンプレートファイルのターゲット依存部
166 ○7.3.1 ターゲット非依存部をインクルードする前に定義すべき変数
167 ◎7.4 パス4のテンプレートファイルのターゲット依存部
168 ◎7.4.1 ターゲット非依存部をインクルードする前に定義すべき変数
169 ○7.5 cfg1_out.cのリンクに必要なスタブの定義ファイル
170 ◎7.6 data/bssセクション初期化ブロックの生成
1718.システムモジュール等のターゲット依存部
172 8.1 システムモジュールのターゲット依存部
173 ○8.2 システムログ機能のターゲット依存定義
174 8.3 シリアルインタフェースドライバのターゲット依存部
175 8.3.1 変数,データ型,管理関数
176 8.3.2 デバイスサービスルーチン
177 8.3.3 コールバックルーチン
178 8.4 カーネル起動メッセージの出力のターゲット依存定義
179 8.5 サンプルプログラムとテストプログラムのターゲット依存定義
180 8.6 実行時間分布集計モジュールのターゲット依存定義
181 8.7 タイマドライバ
182 8.7.1 タイマドライバのファイル構成
183 8.7.2 ソフトウェアカウンタの定義
184 8.7.3 時間型の定義
185 8.7.4 タイマの初期化・終了処理・割込み処理
186 8.7.5 現在の時刻の取得
1879.その他
188 9.1 ドキュメント
18910.リファレンス
190 ○10.1 ターゲット依存部のファイル一覧
191
192○がついている項目はATK2-SC1から変更があった箇所を,◎はATK2-SC3で
193新規に追加された箇所を示し,それぞれ差分のみを記述している.
194
195
1960.本マニュアルの位置づけ
197TOPPERS/ATK2-SC3は,TOPPERS/ATK2-SC1をベースとしているため,多くのポー
198ティング項目はTOPPERS/ATK2-SC1と同一である.本ドキュメントでは,TOPPER
199S/ATK2-SC1と異なる点について説明する.そのため,まずTOPPERS/ATK2-SC1の
200ポーティングガイドを参照の後,本ドキュメントを参照すること.
201
202
2031.共通事項
204
2051.1 ターゲット依存部の構成
206
207ATK2-SC1から変更なし.
208
2091.2 多重インクルードの防止
210
211ATK2-SC1から変更なし.
212
2131.3 アセンブリ言語とのヘッダファイルの共用
214
215ATK2-SC1から変更なし.
216
2171.4 インクルード記述の方法
218
219ATK2-SC1から変更なし.
220
2211.5 クリティカルセクションの出入処理の実現に関する制約
222
223ATK2-SC1から変更なし.
224
2252.システム構築環境のターゲット依存部
226
2272.1 ターゲット略称とターゲット依存部のディレクトリ
228
229ATK2-SC1から変更なし.
230
2312.2 Makefileのターゲット依存部
232
233ATK2-SC1から変更なし.
234
2352.3 開発環境名とコマンド名の設定
236
237ATK2-SC1から変更なし.
238
2392.4 コンパイルオプションとオブジェクトファイルの設定
240
241ATK2-SC1から変更なし.
242
2432.5 オフセットファイルの生成方法
244
245ATK2-SC1から変更なし.
246
2472.6 リンク方法の設定
248
249ATK2-SC3カーネルは,メモリの最適化を行うため,以下のマクロは,使用でき
250ない.
251
252(2-6-2) TEXT_START_ADDRESS テキストセクションの先頭番地
253(2-6-3) DATA_START_ADDRESS データセクションの先頭番地
254
2552.7 依存関係の定義
256
257ジェネレータの各パスに対して,ターゲット依存のファイルへの依存関係を定
258義する.具体的には,パス1,パス2,パス3,パス4が依存するファイルを,そ
259れぞれcfg1_out.c,Os_Lcfg.timestamp,kernel_mem3.c,kernel_mem.c,
260$(OBJFILE)に対する依存関係の形で記述する.
261
262ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,
263以下の記述を含める必要がある.
264
265----------------------------------------
266kernel_mem3.c: $(TARGETDIR)/target_mem.tf
267kernel_mem.c: $(TARGETDIR)/target_mem2.tf $(TARGETDIR)/target_check.tf
268----------------------------------------
269
2702.8 その他の設定
271
272ATK2-SC1から変更なし.
273
2743.AUTOSAR共通定義のターゲット依存部
275
2763.1 整数型の最大値・最小値・ビット数
277
278ATK2-SC1から変更なし.
279
2803.2 整数型
281
282ATK2-SC1から変更なし.
283
2843.3 論理型,論理型の値
285
286ATK2-SC1から変更なし.
287
2883.4 その他の型
289
290ATK2-SC1から変更なし.
291
2923.5 コンパイラの拡張機能のためのマクロ定義
293
294ATK2-SC1から変更なし.
295
2963.6 標準的な定義の上書き
297
298ATK2-SC1から変更なし.
299
3004.システムインタフェースレイヤ(SIL)のターゲット依存部
301
3024.1 全割込み禁止状態の管理
303
304ATK2-SC1から変更なし.
305
3064.2 プロセッサのエンディアン
307
308ATK2-SC1から変更なし.
309
3105.カーネルAPIのターゲット依存部
311
3125.1 メモリ領域確保のための型定義
313
314ATK2-SC1から変更なし.
315
3165.2 メモリ領域確保のためのマクロ
317
318ATK2-SC1から変更なし.
319
3205.3 オブジェクト型の上書き
321
322(5-3-1) OMIT_DATA_TYPE (オプション)
323
324OMIT_DATA_TYPEマクロをターゲット依存部で定義した場合は,一部のオブジェ
325クトの型をターゲット依存部で定義することができる.
326
327(5-3-15) TrustedFunctionIndexType (オプション,デフォルトはuint32)
328(5-3-16) IocType (オプション,デフォルトはuint32)
329(5-3-17) SenderIdType (オプション,デフォルトはuint8)
330
331
3326.カーネル実装のターゲット依存部
333
3346.1 カーネル実装のターゲット依存部の共通事項
335
3366.1.1 カーネル実装のターゲット依存部の構成要素
337
338(c) ジェネレータ設定ファイル
339
340ジェネレータの設定ファイルのターゲット依存部を,target_def.csv,
341target.tf,target_mem.tf,target_mem2.tf,target_check.tfに用意する.
342ジェネレータ設定ファイルの記述方法については,7章で説明する.
343
3446.1.2 ターゲット依存部の関数の命名規則
345
346ATK2-SC1から変更なし.
347
3486.2 トレースログ機能への対応
349
350ATK2-SC1から変更なし.
351
3526.3 システム状態の管理
353
3546.3.1 全割込み禁止状態の管理
355
356ATK2-SC1から変更なし.
357
3586.3.2 コンテキストの管理
359
360ATK2-SC1から変更なし.
361
3626.3.3 OS割込み禁止状態の管理
363
364ATK2-SC1から変更なし.
365
3666.4 割込みに関連するシステム状態の管理
367
3686.4.1 割込み優先度マスクの管理
369
370ATK2-SC1から変更なし.
371
3726.4.2 割込みハンドラの先頭処理と末尾処理
373
374ATK2-SC1から変更なし.
375
3766.4.3 個別割込み禁止状態の管理
377
378(6-4-3-1) void x_disable_int(InterruptNumberType intno)
379
380intnoで指定された割込み番号の割込みを禁止する.
381
382(6-4-3-2) void x_enable_int(InterruptNumberType intno)
383
384intnoで指定された割込み番号の割込みを許可する.
385
3866.5 タスクディスパッチャ
387
3886.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
389
390(6-5-1-4) OMIT_STKMPUINFOB(オプション)
391(6-5-1-5) STKMPUINFOB(オプション)
392
393MPU情報はターゲット依存なので,タスク初期化ブロック(TINIB)に入れたく
394ない場合は,OMIT_STKMPUINFOBをマクロ定義し,TINIB中からSTKMPUINFOBを外
395すことができる.
396
397OMIT_STKMPUINFOBをマクロ定義すると,TINIB中にMPU設定情報が含まれなくな
398るため,それに代わる情報は,ターゲット依存部で管理する必要がある.
399
400また,OMIT_STKMPUINFOBを定義した場合,ジェネレータテンプレートファイル
401から参照するtarget_def.csv(または,同等の役割を持つファイル)からTINIB
402関連のSTKMPUINFOB生成情報を削除することをお勧め.削除しない場合は,
403TINIB関連のSTKMPUINFOB情報定義は,無意味値となるため,使用してはいけな
404い.
405
406STKMPUINFOB管理する情報に関しては,「6.11.1 スタックのMPU設定情報ブロ
407ック(STKMPUINFOB)」を参照.
408
409(6-5-1-6) OMIT_OSAPMPUINFOB(オプション)
410(6-5-1-7) OSAPMPUINFOB(オプション)
411
412MPU情報はターゲット依存なので,OSアプリケーション初期化ブロック(OSAPINIB)
413に入れたくない場合は,OMIT_OSAPMPUINFOBをマクロ定義し,OSAPINIB中から
414OSAPMPUINFOBを外すことができる.
415
416OMIT_OSAPMPUINFOBをマクロ定義すると,OSAPINIB中にMPU設定情報が含まれな
417くなるため,それに代わる情報は,ターゲット依存部で管理する必要がある.
418
419また,OMIT_OSAPMPUINFOBを定義した場合,ジェネレータテンプレートファイル
420から参照するtarget_def.csv(または,同等の役割を持つファイル)から
421OSAPINIB関連のOSAPMPUINFOB生成情報を削除する必要がある.
422
423OSAPMPUINFOB管理する情報に関しては,「6.11.2 OSAP固有MPU設定情報ブロック
424(OSAPMPUINFOB)」を参照.
425
4266.5.2 ディスパッチャ本体
427
428ディスパッチャ本体(dispatcher)は,ターゲット非依存部から直接呼び出さ
429れることはなく,カーネルのターゲット依存部の内部からのみ呼び出される.
430dispatcherは,タスクコンテキスト・OS割込み禁止状態・割込み優先度マスク
431全解除状態から呼び出される.
432
433dispatcherの処理内容は次の通り.
434
435----------------------------------------
436void
437dispatcher(void)
438{
439#ifdef CFG_USE_STACKMONITORING
440 スタックポインタ方式によるスタックモニタリング
441 マジックナンバー方式によるスタックモニタリング
442#endif /* CFG_USE_STACKMONITORING */
443
444#ifdef CFG_USE_POSTTASKHOOK
445 if (PostTaskHook != 0) {
446 非タスクコンテキストに切り替える
447 call_posttaskhook();
448 コンテキストを戻す
449 }
450#endif /* CFG_USE_POSTTASKHOOK */
451
452 dispatcher_0:
453#ifdef LOG_DSP_ENTER
454 log_dsp_enter(p_runtsk);
455#endif /* LOG_DSP_ENTER */
456
457 if (callevel_stat & TSYS_DISALLINT) {
458 callevel_stat &= ~TSYS_DISALLINT;
459 全割込み禁止を解除する
460 }
461
462 dispatcher_1:
463 while ((p_runtsk = p_schedtsk) == NULL) {
464 割込みを許可したらOS割込み禁止解除状態になるよう準備する
465 非タスクコンテキストに切り換える
466 OS割込み禁止を解除し,割込み発生を待つ … (*1)
467 OS割込み禁止状態に戻す … (*2)
468 タスクコンテキストに戻す
469 }
470 p_runosap = p_runtsk->p_osapinib … (*3)
471 自タスク(p_runtsk)のTCBからスタックポインタを復帰する
472
473 /* タスクディスパッチ時にMPU情報も切替える */
474 if(タスクディスパッチする && p_runosapは非信頼OSアプリケーション){
475 スタック情報のMPU設定 … (*4)
476 if(p_runosapが切替えた){
477 OSアプリケーション情報のMPU設定 … (*5)
478 }
479 }
480
481#ifdef LOG_DSP_LEAVE
482 log_dsp_leave(p_runtsk);
483#endif /* LOG_DSP_LEAVE */
484
485#ifdef CFG_USE_PRETASKHOOK
486 if (PreTaskHook != 0) {
487 非タスクコンテキストに切り替える
488 call_pretaskhook();
489 タスクコンテキストに戻す
490 }
491#endif /* CFG_USE_PRETASKHOOK */
492
493 自タスクのTCBから実行再開番地を復帰し,そこへ分岐する
494}
495----------------------------------------
496
497割込み発生を待つ間に非タスクコンテキストに切り換えるのは,この間に実行
498される割込みハンドラ内で,タスクディスパッチをしないようにするためであ
499る.この時,割込みハンドラが,非タスクコンテキスト用のスタックを使うよ
500うにしなければならない.通常は,非タスクコンテキストに切り換える際に非
501タスクコンテキスト用のスタックに切り換え,タスクコンテキストに戻す際に
502元のスタックに切り換える.
503
504ターゲットによっては(特に,シミュレーション環境の場合),強制的に非タ
505スクコンテキストに切り換えることが難しい場合がある.その場合には,この
506間に実行される割込みハンドラ内でタスクディスパッチをしないような仕組み
507を実装することで,非タスクコンテキストへの切換えを省略することができる.
508
509(*1)において,割込みを許可する処理と,割込み発生を待つ処理とは,不可分
510に行なう必要がある.これを不可分に行なわない場合,割込みを許可した直後
511に割込みが入り,その中でタスクが実行可能状態になると,実行すべきタスク
512があるにもかかわらずプロセッサが割込み待ちになってしまう.
513
514また,(*1)において,割込み発生を待つ命令が用意されていない場合や,それ
515を発行するのが不都合な場合には,割込みをすべて許可して割込みを受け付け
516られる状態になった後に,割込み発生を待たずに次に進んでもよい.この場合,
517whileループによって,割込み発生を待つことになる.
518
519OS割込み禁止を解除するための情報(例えば,OS割込み禁止前の割込み優先度
520マスク)を変数に保持している場合には,(*2)でOS割込み禁止状態に戻す際に,
521その変数の値も元に戻っている必要がある.特に,その変数が,割込み待ちの
522間に実行した割込みハンドラ内で書き換えられる場合は,元の値に戻すことが
523必要である.
524
525割込み待ちの間は,p_runtskをNULL(=0)に設定しなければならない(上の
526処理内容をそのまま実装すればこうなる).このように設定しないと,割込み
527ハンドラからGetTaskIDを呼び出した際の動作が仕様に合致しなくなる.
528
529(*3)のp_runosapは,(p_runtskに相当) 現在 RUNNING のタスクが所属するOS
530アプリケーションを示すグローバル変数である.
531
532メモリ保護機能において,ディスパッチする時に,(*4)(*5)では,MPUに情報を
533設定する.また,(*5)のOSアプリケーション情報のMPU設定において,OSアプリ
534ケーションのプライベート領域は,現在のOSアプリケーションと切替え先のOS
535アプリケーションが同じである場合,情報が同じなので再設定しない.
536
537タスクディスパッチによるタスク切り替え前に,CFG_USE_POSTTASKHOOK定義さ
538れ,ユーザがポストタスクフックを定義した場合(PostTaskHook != NULL),
539ポストタスクフック呼び出しインターフェース(call_posttaskhook)を呼出
540す必要がある.
541その一方,タスクディスパッチによるタスク切り替え後に,
542CFG_USE_PRETASKHOOK定義され,ユーザがプレタスクフックを定義した場合
543(PreTaskHook != NULL),プレタスクフック呼び出しインターフェース
544(call_pretaskhook)を呼出す必要がある.
545そこで,アセンブリ言語で記述されているディスパッチャ処理中にプレ/ポス
546トタスクフックの呼び出しを埋め込む.標準的なプレ/ポストタスクフックが
547C言語で記述されていると想定して,それを呼び出すようにコーディングする.
548
549dispatcherをアセンブリ言語で記述する場合には,トレースログ取得処理は,
550「6.2 トレースログ機能への対応」の節で記述した方法でコーディングするこ
551と.なお,log_dsp_enterは切換え前のタスクのスタックで,log_dsp_leave
552は切換え後のタスクのスタックで実行する.
553
5546.5.3 タスクコンテキストからのディスパッチ
555
556ATK2-SC1から変更なし.
557
5586.5.4 ディスパッチャの動作開始
559
560ATK2-SC1から変更なし.
561
5626.5.5 現在のコンテキストを捨ててディスパッチ
563
564(6-5-5-2) void exit_and_dispatch_nohook(void)
565
566現在のコンテキストを捨てて,ポストフック呼出さないディスパッチ
567(exit_and_dispatch_nohook)は,自タスクを強制終了させる処理関数から呼
568び出される.exit_and_dispatch_nohookは,リターンすることのない関数であ
569る.
570
571exit_and_dispatch_nohookは,タスクコンテキスト・OS割込み禁止状態・割込
572み優先度マスク全解除状態で呼び出される.
573
574exit_and_dispatch_nohookとexit_and_dispatchは,ポストタスクフック呼ぶ
575かどうか以外,同じである(タスク強制終了なので,p_runtsk=NULLとして実
576行).
577
578exit_and_dispatch_nohookの処理内容は次の通り.
579
580----------------------------------------
581void
582exit_and_dispatch_nohook(void)
583{
584 dispatcher_0に分岐する
585}
586----------------------------------------
587
5886.5.6 タスクの起動処理
589
590(6-5-6-1) void activate_context(TCB *p_tcb)
591
592タスクの起動処理(activate_context)は,タスクを休止状態から実行できる
593状態にする時に呼ばれ,p_tcbで指定されたタスク(対象タスク)のTCB中のス
594タックポインタをタスクのシステムスタックに初期化する.また,p_tcbが信
595頼OSアプリケーションに所属する場合は,実行再開番地を信頼タスク開始時処
596理(start_stask_r)に設定し,p_tcbが非信頼OSアプリケーションに所属する
597場合は,実行再開番地を非信頼タスク開始時処理(start_utask_r)に設定す
598る.この時点では,後述する理由で,対象タスクのスタック領域を使ってはな
599らない.
600
601対象タスクが最初に実行される時には,対象タスクを自タスクとして,実行再
602開番地として登録したstart_utask_r(信頼タスクの場合はstart_stask_r)に
603分岐してくる.start_utask_r(信頼タスクの場合はstart_stask_r)には,
604dispatcherのみから分岐し,その時の状態は,タスクコンテキスト・OS割込み
605禁止状態・割込み優先度マスク全解除状態である.
606
607start_stask_rは,OS割込み禁止状態を解除した後,タスクの起動番地を呼び
608出す.
609さらに,タスクの起動番地から戻ってきた場合には,exit_taskを呼び出す.
610
611start_utask_rは,OS割込み禁止状態を解除した後,CPUを非特権モードへ設定
612する同時にタスクの起動番地を呼び出す.さらに,タスクの起動番地から戻っ
613てきた場合には,exit_utaskを呼び出す.
614
615activate_contextとstart_rの処理内容は次の通り.
616
617----------------------------------------
618void
619activate_context(TCB *p_tcb)
620{
621 指定されたタスク(p_tcb)のTCB中のスタックポインタを初期化する
622 if (指定されたタスクが非信頼タスク) {
623 start_utask_rを,実行再開番地として自タスクのTCBに保存する … (*a)
624 }
625 else {
626 start_stask_rを,実行再開番地として自タスクのTCBに保存する … (*a)
627 }
628 return;
629
630 start_stask_r:
631 呼出し関数をexit_taskとして設定する … (*c)
632 特権モードで動作するよう準備
633 start_rに分岐する
634
635 start_utask_r:
636 呼出し関数をexit_utaskとして設定する … (*c)
637 非特権モードで動作するよう準備
638 スタックをシステムスタックからユーザスタックに切り替える
639 start_rに分岐する
640
641 start_r:
642#ifdef CFG_USE_STACKMONITORING
643 タスク起動毎にタスクのシステムスタックのマジックナンバーを初期化する … (*d)
644#endif /* CFG_USE_STACKMONITORING */
645 p_runtsk->curpri = p_runtsk->p_tinib->exepri;
646 自タスクの起動番地へ分岐するように準備する
647 OS割込み禁止解除状態にする
648 動作モード設定する同時に,
649 自タスク(p_runtsk)の起動番地を呼び出す … (*e)
650}
651----------------------------------------
652
653(*c)で自タスクの起動番地を呼び出す時の返り番地をexit_utask(信頼タスク
654の場合exit_task)の番地としておき,タスクが不正終了した場合,保護処理を
655行う.
656
657ここで,タスクの起動処理において対象タスクのスタック領域を使ってはなら
658ない理由は,次の通り.複数の基本タスクがスタック領域を共有している場合
659に,タスクの起動時点では,そのタスクとスタック領域を共有しているタスク
660が,スタック領域を使用している可能性があるためである.
661
662このポーティングガイドでは,タスクの実行再開番地をTCBに保存している
663(*a).これをスタックに保存する方法も考えられるが,タスクの起動処理でス
664タック領域が使えないことから,タスクの起動処理だけは例外扱いしなければ
665ならない.例えば,タスクの起動処理においてはTCB中のスタックポインタを
666特殊な値(例えば0)に設定しておき,ディスパッチャ本体でTCB中のスタック
667ポインタがその値の場合にはstart_utask_r(信頼の場合は,start_stask_r)
668に分岐させ,start_utask_r(信頼の場合は,start_stask_r)においてスタッ
669クポインタを初期化する方法が考えられる.
670
671(*d)において,SC3ではタスク強制終了があるので,タスク起動毎にマジック
672ナンバーを初期化する.
673
674(*e)において,CPU動作モードとタスクの呼出しは,同時に行う必要がある.
675start_utask_r(信頼の場合は,start_stask_r)は,特権モードで呼出される
676が,信頼OSアプリケーションに所属するタスクの場合,特権モードで,非信頼
677OSアプリケーションに所属するタスクは,非特権モードで実行する必要がある
678.例外/割込みからのリターン命令を使用するのが1つの方法である.
679
6806.6 割込みハンドラ
681
6826.6.1 割込みハンドラの出入口処理
683
684C2ISRの割込みの出入口処理の方法は,プロセッサによって大きく異なるが,
685ATK2-SC3においては,おおよその処理内容は次の通り.
686
687----------------------------------------
688void
689<割込みの出入口処理>(void)
690{
691 if (非特権モードで割込み発生) {
692 スタックを実行状態のタスクのシステムスタックに切り換える
693 }
694 少なくともOS割込みを禁止した状態にする … (*f)
695 スクラッチレジスタをスタックに保存する
696 if (タスクコンテキストで割込み発生) {
697 スタックを非タスクコンテキスト用のスタックに切り換え,
698 非タスクコンテキストに切り換える
699 }
700 割込み優先度マスクを,受け付けた割込み要求の割込優先度に設定し,
701 OS割込み禁止解除状態にする(受け付けた割込みよりも
702 優先度の高い割込みを受け付けるようにする)… (*i)
703
704#ifdef CFG_USE_STACKMONITORING
705 if (タスクコンテキストで割込み発生) {
706 スタックポインタチェック方式でタスクシステムスタックの
707 スタックモニタリングを行う
708 マジックナンバーチェック方式でタスクシステムスタックの
709 スタックモニタリングを行う
710 }
711 else {
712 スタック残量チェック方式でC2ISR用スタックのスタックモニタ
713 リングを行う
714 マジックナンバーチェック方式でC2ISR用スタックのスタックモニタ
715 リングを行う
716 }
717#endif /* CFG_USE_STACKMONITORING */
718
719 callevel_statを保存
720 callevel_statに割込みビットを立てる
721 run_trustedを保存
722 p_runosapを保存
723 p_runisrを保存
724 p_runisrを実行するC2ISRに対応するisrcb_tableの要素に設定する
725 p_runosapを実行するC2ISRが所属するOSアプリケーションに設定する
726
727 C2ISRを呼び出す
728
729#ifdef CFG_USE_STACKMONITORING
730 マジックナンバーチェック方式でC2ISR用スタックのスタックモニタリン
731 グを行う
732#endif /* CFG_USE_STACKMONITORING */
733
734 exit_isr2(); /* C2ISRの不正終了チェック */
735
736 p_runisrを復帰
737 p_runosapを復帰
738 run_trustedを復帰
739 callevel_statを復帰
740
741 ret_int:
742 if (タスクコンテキストで割込み発生) {
743 (少なくとも)OS割込みを禁止した状態にする
744 スタックをタスク用のスタックに戻し,タスクコンテキストに切り換える
745 スタックポインタを復帰
746 if (p_runtsk == NULL) {
747 OS割込み禁止状態にする … (*e)
748 割込み優先度マスクを,全解除状態(TIPM_ENAALL)に設定する
749 … (*h)
750 dispatcherに分岐する
751 }
752 else if (p_runtsk != p_schedtsk) {
753 OS割込み禁止状態にする … (*e)
754 割込み優先度マスクを,全解除状態(TIPM_ENAALL)に設定する
755 … (*h)
756 スクラッチレジスタを除くすべてのレジスタをスタックに保存す
757
758 スタックポインタを自タスク(p_runtsk)のTCBに保存する
759 ret_int_rを,実行再開番地として自タスクのTCBに保存する
760
761 dispatcherに分岐する
762
763 ret_int_r:
764 スクラッチレジスタを除くすべてのレジスタをスタックから復帰
765 する
766 }
767 }
768 割込み処理からのリターン後に,割込み優先度マスクが
769 割込み処理前の値に戻るように準備する
770 割込み処理からのリターン後に,OS割込み禁止解除状態に戻るように準備
771 する
772 スクラッチレジスタをスタックから復帰する
773 割込み処理からのリターン
774}
775----------------------------------------
776
7776.6.2 割込み要求ラインの属性の設定
778
779(6-6-2-1) void x_config_int(InterruptNumber intno,
780 AttributeType intatr,
781 PriorityType intpri)
782
783intatrとして設定できる割込み属性は次の通り.ATK2-SC3の場合は,intatrに
784DISABLE/ENABLEいずれかが含まれ,ENABLEを指定した場合は,OS起動時に割込
785みが許可され,DISABLEを指定した場合は禁止される.
786
787 DISABLE 0x00 割込み要求禁止フラグをセット
788 ENABLE 0x01 割込み要求禁止フラグをクリア
789
7906.6.3 割込み管理機能の初期化処理の変更
791
792(6-6-3-9) intatr:割込み属性
793
7946.6.4 デフォルトのC2ISR
795
796ATK2-SC1から変更なし.
797
7986.6.5 カーネル管理外の割込み
799
800ATK2-SC1から変更なし.
801
8026.6.6 DisableAllInterrupts/EnableAllInterruptsの処理内容の変更
803
804ATK2-SC1から変更なし.
805
8066.6.7 割込み禁止解除
807
808(6-6-7-1) LOCAL_INLINE void x_clear_nested_os_int(void)
809
8106.7 スタックモニタリング
811
812SC3でもスタックモニタリング機能を実装する.非信頼タスクのユーザスタッ
813クスタックは,メモリ保護ユニット(MPU)より保護されるが,以下のスタッ
814クをスタックモニタリング機能で保護する.
815(1)非信頼タスクのシステムスタック
816(2)信頼タスクのシステムスタック
817(3)システムスタック
818(4)信頼関数実行時のスタック
819
8206.7.1 ディスパッチャとC2ISRの出入口処理でのスタックモニタリング
821
822ディスパッチャとC2ISRの出入口処理でのスタックモニタリングでスタックオ
823ーバーフローが検出された場合の処理は以下の通り.ATK2-SC3ではスタックオ
824ーバーフロー検出時のcall_protectionhook_mainからはリターンする可能性が
825ある.
826
827----------------------------------------
828#ifdef CFG_USE_STACKMONITORING
829void
830スタックオーバーフロー検出処理(void)
831{
832 uint32 ret;
833
834 if (C2ISRの出入口処理でのスタックモニタリング) {
835 OS割込み禁止状態にする
836 ret = E_OS_STACKFAULT | PEOB_STACKMONITORING_INTERRUPT;
837 }
838 if (タスクコンテキスト) {
839 非タスクコンテキストに切り替える
840 ret = E_OS_STACKFAULT | PEOB_STACKMONITORING_DISPATCHER;
841 }
842 call_protectionhook_main(ret);
843}
844#endif /* CFG_USE_STACKMONITORING */
845----------------------------------------
846
847現状,上記スタックモニタリングでスタックオーバー検出箇所による後処理
848は,区別していないため,以下のように定義している.スタック発生箇所によ
849る処理が変わる場合,別々で定義することが出来る.
850#define PROTECTION_ERROR_OPTIONAL_BIT (0x80)
851#define PEOB_STACKMONITORING_INTERRUPT PROTECTION_ERROR_OPTIONAL_BIT
852#define PEOB_STACKMONITORING_DISPATCHER PROTECTION_ERROR_OPTIONAL_BIT
853
8546.7.2 信頼関数実行の出口処理でのスタックモニタリング
855
856一方,信頼関数実行の出口処理でのスタックモニタリングでスタックオーバー
857フローが検出された場合の処理は以下の通り.ATK2-SC3ではスタックオーバー
858フロー検出時のcall_protectionhook_mainからはリターンしない.
859
860----------------------------------------
861StatusType
862CallTrustedFunction(...)
863{
864 ...
865
866 信頼関数実行
867
868#ifdef CFG_USE_STACKMONITORING
869 if (C2ISR処理レベル) {
870 if (システムスタックマジックナンバーチェックNG) {
871 OS割込み禁止状態にする
872 call_protectionhk_main(E_OS_STACKFAULT);
873 /* ここには戻ってこない */
874 }
875 }
876 else {
877 if (実行中タスクシステムスタックマジックナンバーチェックNG) {
878 OS割込み禁止状態にする
879 call_protectionhk_main(E_OS_STACKFAULT);
880 /* ここには戻ってこない */
881 }
882 }
883#endif /* CFG_USE_STACKMONITORING */
884
885 ...
886}
887----------------------------------------
888
889信頼関数実行前に,信頼関数使用するスタックの量と,使用するスタックの空
890き量を照合している.
891
892信頼関数実行後使用したスタックに対してマジックナンバー方式のみ,チェッ
893クしている理由は,チェックする時点で,スタックポインタは,信頼関数実行
894する前の状態に戻ったことである.
895
896
8976.8 CPU例外ハンドラ
898
899CPU例外の出入口処理の方法はプロセッサによって大きく異なるが,おおよそ
900の処理内容は次の通り.
901
902----------------------------------------
903void
904<CPU例外の出入口処理>(void)
905{
906 if (非特権モードで発生 && フック処理中で発生) {
907 if (CPU例外発生が未ネスト && C1ISR処理中以外でCPU例外発生) {
908 スタックを非タスクコンテキスト用のスタックに切り換え準備
909 }
910 }
911
912 スクラッチレジスタ及びスタックポインタを非タスクコンテキストスタッ
913 クに保存する
914
915 if (OS割込み禁止状態でない &&
916 C1ISR実行中のCPU例外でない && 全割込み禁止状態でない){
917 OS割込み禁止状態にする
918 }
919
920 ターゲット依存のCPU例外情報を取得する … (*h)
921
922 if (全割込み禁止解除状態でCPU例外発生) {
923 全割込み禁止状態を解除する … (*i)
924 }
925
926 ターゲット依存のCPU例外情報を退避する … (*j)
927 ターゲット依存のCPU例外情報を保存する
928
929 if (例外要因番号 > TNUM_EXCH) {
930 エラーコード = E_OS_PROTECTION_EXCEPTIONとする
931 }
932 else {
933 例外コード変換テーブルからエラーコードを取得する
934 }
935
936 call_protectionhook_main(エラーコード);
937
938 ターゲット依存のCPU例外情報を復帰する
939
940 ret_exc:
941 割込み・例外のネスト回数(except_nest_cnt)をディクリメントする
942
943 CPU例外処理からのリターン後に,CPU例外発生前の割込み禁止状態に戻る
944 ように準備する … (*k)
945
946 CPU例外処理中に変更した全割込み状態をリターン後にも反映
947 するため,準備する … (*l)
948
949 全割込み禁止状態にする
950
951 ret_int_1:
952 スクラッチレジスタをスタックから復帰する
953 退避したスタックポインタを復帰する
954 CPU例外処理からのリターン
955}
956----------------------------------------
957
958全割込み禁止状態でCPU例外が発生した場合は,全割込み禁止状態でプロテク
959ションフックを呼び出す.
960
961割込み応答性向上するには,全割込み禁止している状態の処理をなるべく少な
962くする必要があるので,例外発生要因情報の保存は,(*h)ではなく,(*i)処理
963の後にすべきである.上記の例では,(*j)で保存している.
964
965プロテクションフックを実行する際に経由する部分では,CPU例外が起こる可
966能性を極力減らすとともに,CPU例外を起こす可能性がある場合(例えば,ス
967クラッチレジスタをスタックに保存する時に,バスエラーなどのCPU例外が発
968生する可能性が考えられる)には,その可能性をターゲット依存部のユーザー
969ズマニュアルに記載しなければならない.
970
971ret_exc以降の処理は,割込みの出入口処理のret_int以降の処理とほぼ同じで
972あるため,ターゲットによっては,共通のルーチンを用いることができる可能
973性がある.
974
975CPU例外処理中に,全割込み禁止した場合,CPU例外戻った側に反映しなければ
976ならないので,(*l)で変更した全割込み状態をリターン後にも反映するため,
977工夫する.
978
9796.9 ソフトウェア割込みハンドラ
980
981ソフトウェア割込みハンドラは,SC3よりシステムサービスのエントリルーチ
982ンとして機能する.
983ソフトウェア割込みハンドラには,システムサービスの機能コード,システム
984サービスのパラメータを入力値として,渡す.システムサービス実行の戻り値
985を呼出し側に返す.
986
987ソフトウェア割込み本体は,以下の処理を行う.
988(a) 呼出し元のコンテキストの保存(リターン時の復帰に使用)
989
990(b) スタックの切替え(ユーザスタックからシステムスタックへ切替え)
991呼出元が特権モードの場合は切替えない(すでにシステムスタックか割込みス
992タックを使用しているため切替え不要).
993
994(c) カーネルサービスの特定
995呼出し元から渡されたシステムサービスの機能コードを利用して,システムサ
996ービスの先頭アドレスを特定する.
997
998(d)システムサービス本体の呼出し
999上記(c)より取得したシステムサービスを呼出し, システムサービスの戻り値
1000を呼出し元に返す準備を行う.
1001
1002(e) ソフトウェア割込みルーチンの終了処理
1003上記(a)で保存した呼出し元のコンテキストを復帰し,呼出し元へリターンす
1004る.
1005
1006ソフトウェア割込みによるシステムサービス呼出しのおおよその処理内容は次
1007の通り.
1008
1009----------------------------------------
1010uint32
1011trap_handler(FunctionCodeType fncd, システムサービスパラメータリスト)
1012{
1013 uint32 retval;
1014
1015 if (非特権モードからの呼び出し) {
1016 if (非信頼フック実行中からの呼び出し) {
1017 スタックを非信頼フック実行前のスタックに切換える … (*a)
1018 }
1019 else {
1020 スタックを実行状態のタスクのシステムスタックに切換える
1021 }
1022 }
1023 呼出し元コンテキストの保存
1024
1025 if (fncd > TMAX_SVCID) {
1026 /*
1027 * システムサービス不正呼出しの場合
1028 */
1029 no_support_service();
1030 }
1031 else {
1032 カーネルサービスの先頭アドレスの特定(svc_table[fncd])
1033 ソフトウェア割込みによりシステム状態が変化する場合には,
1034 ソフトウェア割込み前のシステム状態に戻す … (*b)
1035 システムサービス実行後の戻り番地(trp_SVC_ret)指定
1036 システムサービスの実行:
1037 retval = (*(svc_table[fncd]))(システムサービスパラメータリスト);
1038 }
1039
1040
1041 trp_SVC_ret:
1042 ソフトウェア割込みからリターン後のシステム状態が,
1043 この時点でのシステム状態になるよう準備する … (*c)
1044 全割込み禁止状態にする
1045
1046 /* 性能測定用 キャッシュパージ処理 */
1047#ifdef PERF_TEST
1048 if (キャッシュパージフラグ != 0) {
1049 命令キャッシュ領域クリア
1050 }
1051#endif /* PERF_TEST */
1052
1053 呼出し元コンテキストの復帰
1054 return(retval);
1055}
1056----------------------------------------
1057
1058(*a)において,非信頼のフックルーチン実行中は,スタックポインタ保持変数
1059(hook_savedsp)が非信頼のフックルーチンを実行前のスタックになっている
1060ので,その続きからスタックを使う.
1061
1062(*b)において,ソフトウェア割込みより,システム状態が変化した場合,ソフ
1063トウェア発生前の状態に戻して,システムサービスを呼出す.要は,システム
1064サービスは,ソフトウェア割込み使用かどうかに関わらずシステム呼出し時点
1065の状態で実行する.
1066
1067(*c)において,システムサービス処理中に,変更したシステム状態(例えば,
1068全割込み禁止など)は,ソフトウェア割込みリターン後にも反映する.
1069
1070svc_tableは,システムサービステーブルと呼び,ソフトウェア割込みによる
1071実行したいシステムサービスの先頭アドレスが登録される.ソフトウェア割込
1072みによるシステムサービス指定する場合は,システムサービスコードを用い
1073る.
1074
1075no_support_service()関数は,不正な機能コードを指定して,システムサービ
1076ス発行時の処理であり,エラーコードにE_OS_SERVICEIDを設定し,サービスID
1077にOSServiceId_INVALIDを設定して,エラーフックを呼出す.
1078
10796.10 信頼OSAPと非信頼OSAPからのシステムサービス呼出し
1080
1081SC3のメモリ保護機能を実現するため,プロセッサは少なくとも特権モードと
1082非特権モードをサポートする必要がある.カーネル及び信頼OSアプリケーショ
1083ンに所属する処理単位は特権モードで実行し,メモリ保護機構(MPU)が働か
1084ない(※1).非信頼OSアプリケーションに所属する処理単位は非特権モード
1085で実行し,メモリ保護機構(MPU)が働く.また,プロセッサは,ソフトウェ
1086ア割込みなど非特権モードから特権モードへ遷移できる機能(命令)を有する.
1087
1088信頼OSアプリケーションは,システムサービスを直接関数呼び出しできるが,
1089非信頼OSアプリケーションから,システムサービスを呼出すため,ソフトウェ
1090ア割込みによる呼出し機能をターゲット依存部でカーネルのサービスコールの
1091インタフェースを実装する.
1092
10936.10.1 システムサービス呼出しの定義
1094
1095(1) システムサービスの関数呼出しの定義(svc_funcall.h):
1096
1097----------------------------------------
1098#define SVC_CALL(system_service) _kernel_ ## system_service
1099
1100#ifdef TOPPERS_SVC_FUNCCALL
1101#define StartOS _kernel_StartOS
1102#define ActivateTask _kernel_ActivateTask
1103...
1104#endif
1105----------------------------------------
1106
1107(2) システムサービスのソフトウェア割込み呼出しの定義(tool_svc.h):
1108
1109----------------------------------------
1110#define SVC_TRAP(system_service) _trap_ ## system_service
1111
1112#ifndef TOPPERS_SVC_FUNCCALL
1113#define StartOS _trap_StartOS
1114#define ActivateTask _trap_ActivateTask
1115...
1116#endif
1117
1118void
1119_trap_StartOS(AppModeType Mode)
1120{
1121 CAL_SVC_1N(void, TFN_STARTOS, AppModeType, Mode);
1122}
1123
1124StatusType
1125_trap_ActivateTask(TaskType TaskID)
1126{
1127 CAL_SVC_1M(StatusType, TFN_ACTIVATETASK, TaskType, TaskID);
1128}
1129----------------------------------------
1130
1131TFN_STARTOSなどは,呼び出したいシステムサービスコードであり,システム
1132サービステーブル(svc_table)に登録したシステムサービスの添字である.
1133
1134(3) ソフトウェア割込み(例:trap)によるシステムサービス呼出し定義
1135 (prc_svc.h):
1136
1137----------------------------------------
1138#define CAL_SVC_1N(TYPE, FNCD, TYPE1, PAR1) \
1139 register FunctionCodeType input_fncd_r = (FNCD); \
1140 register TYPE1 input_param_r = (TYPE1) (PAR1); \
1141 register FunctionCodeType output_r; \
1142 Asm ( \
1143 "trap \n\t" \
1144 : input_fncd_r, input_param_r \
1145 : output_r \
1146 : "...", "memory" \
1147 ); \
1148----------------------------------------
1149
1150----------------------------------------
1151#define CAL_SVC_1M(TYPE, FNCD, TYPE1, PAR1) \
1152 register FunctionCodeType input_fncd_r = (FNCD); \
1153 register TYPE1 input_param_r = (TYPE1) (PAR1); \
1154 register FunctionCodeType ret_r; \
1155 register FunctionCodeType output_r; \
1156 Asm ( \
1157 "trap \n\t" \
1158 : input_fncd_r, input_param_r \
1159 : ret_r, output_r \
1160 : "...","memory" \
1161 ); \
1162 return ((TYPE) output_r);
1163----------------------------------------
1164
1165※GCCの拡張アセンブリ構文:
1166 asm(アセンブリテンプレート
1167 : 出力オペランド
1168 : 入力オペランド
1169 : 破壊されるレジスタのリスト
1170 )
1171
1172上記マクロ関数定義時,以下のルールを従う.
1173マクロ名は,CAL_SVC_nxとし,nxは,意味を持つ.
1174n:パラメータ数
1175 範囲:0〜3(システムサービスのパラメータ数)
1176 ※ターゲット定義のシステムサービス追加した場合,その最大数に合わせ
1177
1178x:戻り値
1179 範囲:N(戻り値なし),M(戻り値あり)
1180
11816.10.2 信頼OSAPからのシステムサービス呼出し
1182
1183基本的にシステムサービスの呼出しは,ソフトウェア割込み経由で呼出しが基
1184本であるが,システムサービス呼出しのオーバヘッドを削減するため,信頼OS
1185アプリケーションに所属する処理単位からシステムサービスを呼出す場合,シ
1186ステムサービスの呼出しは,(直接)関数呼出しも出来る.
1187
1188関数呼出しを指定するため,関数呼出しをしたいソースの先頭に,以下のマク
1189ロを定義するか,SVC_CALL(system_service)より明示的に関数呼び出しのシス
1190テムサービス実行をするかが出来る.
1191
1192(6.10.2.1) TOPPERS_SVC_FUNCCALL
1193
1194このマクロをソース先頭定義することで,ソースファイル内のシステムサービ
1195スの呼出しは,_kernel_<system_service>に置換われ,関数呼出しとなる.
1196
11976.10.3 非信頼OSAPからのシステムサービス呼出し
1198
1199ソースの先頭に,TOPPERS_SVC_FUNCCALLマクロを定義していない場合,システ
1200ムサービスの実行は,ソフトウェア割込みよるシステムサービス実行となる.
1201また,SVC_TRAP(system_service)より明示的にソフトウェア割込みによるシス
1202テムサービス実行も出来る.
1203
12046.10.4 ターゲット依存システムサービスの追加
1205
1206ターゲット依存のシステムサービスを追加したい場合,ターゲット依存システ
1207ムサービステーブルテーブルは,以下のマクロを用いて定義する.
1208
1209(6.10.4.1) PRC_SVC_TABLE
1210(6.10.4.2) PRC_SVC_NUM
1211
1212ターゲット依存で,追加したいシステムサービスの先頭アドレスを
1213PRC_SVC_TABLEマクロの定義に追加し,システムサービス定義の数を
1214PRC_SVC_NUMマクロに定義することで,システムサービステーブル(svc_table)
1215に反映される.
1216
1217(6.10.4.3) OTHER_PRC_SVC_TABLE
1218
1219ターゲット依存で,追加したいシステムサービス関連マクロ(PRC_SVC_TABLE
1220とPRC_SVC_NUM)は,別のヘッダファイル(*.h)に定義されている場合,上記マ
1221クロOTHER_PRC_SVC_TABLEをインクルードファイル名に定義することが出来る.
1222
1223例:#define OTHER_PRC_SVC_TABLE target_svc_table_test.hを定義すること
1224で,prc_config.hに#include "target_svc_table_test.h"として展開され,
1225target_svc_table_test.hファイル定義しているPRC_SVC_TABLEとPRC_SVC_NUM
1226が有効となる.
1227
1228上記ソフトウェア割込みによるシステムサービス呼び出し関係のファイルの生
1229成は,utils/gensvc_atk(サービスコールインタフェース生成プログラム)に
1230よる自動生成が出来る.
1231
12326.11 メモリ保護機構(MPU)制御
1233
12346.11.1 スタックのMPU設定情報ブロック(STKMPUINFOB)
1235
1236MPUによるスタック領域保護するため,MPUに設定する情報を保持するブロック
1237をターゲット依存部に定義する.MPU設定情報は,ターゲット依存であるが,
1238保持する情報は,以下である.
1239
1240(6.11.1.1) 領域の先頭番地
1241(6.11.1.2) 領域の終端番地(若しくは領域のサイズ)
1242
12436.11.2 OSAP固有MPU設定情報ブロック(OSAPMPUINFOB)
1244
1245MPUによるOSAP固有領域保護するため,MPUに設定する情報を保持するブロック
1246をターゲット依存部に定義する.MPU設定情報は,ターゲット依存であるが,
1247保持する情報は,以下である.
1248
1249(6.11.2.1) 領域の先頭番地(複数の命令領域・データ領域)
1250(6.11.2.2) 領域の終端番地(複数の命令領域・データ領域)
1251(6.11.2.3) アクセスパターン(読み・書き・実行)(複数の命令領域・デー
1252 タ領域)
1253(6.11.2.4) 命令領域数
1254(6.11.2.5) データ領域数
1255
12566.11.3 MPU初期化処理
1257
1258MPU機能を有効するため,MPUの初期化を行う処理は,以下の通りである.
1259
1260----------------------------------------
1261void
1262prc_init_mpu(void)
1263{
1264
1265 現在MPUに設定している情報の管理変数の初期化
1266
1267 /* MPU初期情報を設定するため */
1268 MPU機能を無効にする
1269
1270 /* 全命令・データMPUの0サイズ領域全アクセス権なしで初期化
1271 * 必要の場合,バックグラウンド領域MPU設定
1272 * 共有領域のMPU設定
1273 */
1274 MPU初期情報を設定する
1275
1276 MPU機能を有効にする
1277}
1278----------------------------------------
1279
1280
12816.11.4 OSAP固有MPU情報設定処理
1282
1283各OSAP固有MPU情報をMPUに設定する機能は,以下の通りである.
1284
1285----------------------------------------
1286void
1287prc_set_osap_mpu(const OSAPINIB *p_osapinib)
1288{
1289
1290 if (既に設定中のOSAP != 設定するOSAP) {
1291 既に設定中のOSAP = 設定するOSAP;
1292
1293 設定するOSAPのMPU情報を取得して,MPUに設定する … (*a)
1294 }
1295}
1296----------------------------------------
1297
1298(*a)では,OSAP固有に命令領域とデータ領域は,複数存在する場合,全ての命
1299令領域・データ領域に対して,アクセス権限を設定する.
1300
13016.11.5 MPU依存のバックグラウンド領域チェック
1302
1303先頭番地及び終端番地により,引数で指定される領域は,命令バックグラウン
1304ド領域に入っている場合,AP_Executable権あり,データバックグラウンド領
1305域に入っている場合,AP_Writable | AP_Readable権あり,それ以外の場合,
1306NO_ACCESS権を返す.
1307
1308----------------------------------------
1309AccessType
1310probe_trusted_osap_mem(const MemoryStartAddressType sadr,
1311 const MemoryStartAddressType eadr)
1312{
1313 AccessType ret;
1314
1315 ret |= (領域[sadr1,eadr1] ⊆ 命令バックグラウンド領域)?
1316 AP_Executable : NO_ACCESS; … (*a)
1317 ret |= (領域[sadr1,eadr1] ⊆ データバックグラウンド領域) ?
1318 (AP_Writable | AP_Readable) : NO_ACCESS; … (*b)
1319
1320 return(ret);
1321}
1322----------------------------------------
1323
1324(*a)(*b)また,特権モード実行時,MPUの機能停止する設計において,バック
1325グラウンド領域持たないため,AP_Executable | AP_Writable | AP_Readable
1326のように全てのアクセス権ありで返しても良い.
1327
13286.12 メモリ管理のチューニング
1329
13306.12.1 メモリオブジェクトの管理
1331
1332(6.12.1.1) OMIT_STANDARD_MEMINIB(オプション)
1333
1334ターゲット非依存部に含まれる標準のメモリオブジェクト管理機能を用いない
1335場合や,メモリオブジェクト管理機能の構造体,変数,関数をターゲット依存
1336部で用意し,標準のメモリオブジェクト管理と同等の情報をターゲット依存の
1337データ構造で管理する場合には,このシンボルをマクロ定義する.
1338
1339このシンボルをマクロ定義する場合,ターゲット依存部にメモリアクセスチェ
1340ック用関数(check_osap_memory),C2ISRメモリアクセスチェック関数
1341(check_isr_memory),タスクメモリアクセスチェック(check_task_memory)
1342を用意する必要がある.
1343
1344check_osap_memory関数は,引数で指定したOSアプリケーションに対して,引
1345数で指定するメモリ領域のアクセス権のチェックを行う.信頼OSアプリケーシ
1346ョンの場合は,バックグラウンドをチェックする(現実装では全領域アクセス
1347可能).非信頼OSアプリケーションの場合は,メモリオブジェクトのアクセス
1348属性(リード,ライト,実行)を返却する.
1349
1350check_isr_memory関数は,引数で指定した割込みにおいて,引数で指定したメ
1351モリ開始アドレスとサイズのメモリ領域に対して,アクセス属性(リード,ラ
1352イト,実行,スタック)を返す.また,引数で指定したメモリ領域は,メモリ
1353オブジェクトを跨いだ場合,その情報を引数より返す必要がある.
1354
1355check_task_memory関数は,引数で指定したタスクにおいて,引数で指定したメ
1356モリ開始アドレスとサイズのメモリ領域に対して,アクセス属性(リード,ラ
1357イト,実行,スタック)を返す.また,引数で指定したメモリ領域は,メモリ
1358オブジェクトを跨いだ場合,その情報を引数より返す必要がある.
1359
1360----------------------------------------
1361
1362AccessType
1363check_osap_memory(const OSAPINIB *p_osapinib,
1364 const MemoryStartAddressType adr,
1365 MemorySizeType size)
1366{
1367 AccessType ret;
1368
1369 if (p_osapinib == 信頼OSアプリケーション) {
1370 ret |= (領域[adr,adr + size] ⊆ バックグラウンド領域)?
1371 (AP_Executable | AP_Writable | AP_Readable) :
1372 NO_ACCESS;
1373 }
1374 else {
1375 ret |= (領域[adr,adr + size] メモリオブジェクト跨ぐ)?
1376 (NO_ACCESS, *over_region = true):
1377 (領域[adr,adr + size]のアクセス権) ;
1378 }
1379 return (ret);
1380}
1381
1382AccessType
1383check_isr_memory(ISRCB *p_isrcb, const MemoryStartAddressType adr,
1384 MemorySizeType size, boolean *over_region)
1385{
1386 AccessType ret;
1387
1388 *over_region = false;
1389 if (領域[adr,adr + size] メモリオブジェクト跨ぐ) {
1390 *over_region = true;
1391 }
1392 else {
1393 ret = (領域[adr,adr + size] ⊆ 割込みスタック領域)?
1394 (AP_Readable | AP_Writable | AP_StackSpace):
1395 NO_ACCESS;
1396 }
1397
1398 /* FL2では割込みは信頼OSアプリケーションにしか属さない */
1399 ret |= AP_Readable | AP_Writable | AP_Executable;
1400
1401 return (ret);
1402}
1403
1404AccessType
1405check_task_memory(const TCB *p_tcb, const MemoryStartAddressType adr,
1406 MemorySizeType size, boolean *over_region)
1407{
1408 AccessType ret;
1409
1410 *over_region = false;
1411 if (領域[adr,adr + size] メモリオブジェクト跨ぐ) {
1412 *over_region = true;
1413 }
1414
1415 if (p_tcbは信頼OSアプリケーションに所属) {
1416 ret = (領域[adr,adr + size] ⊆ タスクシステムスタック領域)?
1417 (AP_Readable | AP_Writable | AP_StackSpace):
1418 NO_ACCESS;
1419
1420 /* 信頼タスクの場合は全アクセス可能 */
1421 ret |= (AP_Readable | AP_Writable | AP_Executable);
1422 }
1423 else if (*over_region == false) {
1424 ret = (領域[adr,adr + size] ⊆ タスクユーザスタック領域)?
1425 (AP_Writable | AP_Readable | AP_StackSpace):
1426 (領域[adr,adr + size]のアクセス権);
1427 }
1428
1429 return (ret);
1430}
1431
1432----------------------------------------
1433
14346.12.2 メモリアクセス権チェックのためのマクロ
1435
1436カーネル内標準で,実行中OSアプリケーションに対して,引数で指定した変
1437数アドレスと変数タイプのアクセス(リード,ライド)権限のチェックマク
1438ロが用意されている.メモリオブジェクトの依存部管理などにより,依存部
1439でPROBE_MEM_WRITEとPROBE_MEM_RWを定義することで,標準のチェックマクロ
1440を無効にすることができる.
1441
1442(6.12.2.1) PROBE_MEM_WRITE(オプション)
1443(6.12.2.2) PROBE_MEM_RW(オプション)
1444
1445----------------------------------------
1446
1447#define PROBE_MEM_WRITE(p_var, type) \
1448 (領域[p_var,adr + sizeof(type)] & AP_Writable)
1449
1450#define PROBE_MEM_RW(p_var, type) \
1451 (領域[p_var,adr + sizeof(type)] & (AP_Readable | AP_Writable))
1452
1453----------------------------------------
1454
1455
14566.13 エラーフック,シャットダウンフック呼び出し
1457
1458節番号以外,ATK2-SC1から変更なし.
1459
14606.14 カーネルの起動・終了とスタック領域など
1461
1462(6-14-1) スタートアップモジュール
1463
1464(c) void initialize_sections(void)でbssセクションとdataセクションの初
1465 期化
1466
1467各dataセクションに初期値を設定し,各bssセクションをクリアする.
1468
1469まず,初期値ありデータセクションの初期化(dataセクション)の初期化を行
1470う.初期値ありデータセクションを初期化する時に,dataセクション初期化テ
1471ーブルにある初期化データ領域の先頭番地から,dataセクションに値を取得し
1472て,セットする.dataセクション初期化テーブルは,dataセクションの初期化
1473に依存してはいけないので,コンフィギュレーションのメモリ配置時に,読み
1474専用データ領域(rodataセクション)に配置すればよい.
1475
1476dataセクション初期化後に,bssセクションを初期化すれば,bssセクション初
1477期化ブロックは,する時,dataセクションは,読み専用データ領域に配置する
1478必要がない.
1479
1480また,OMIT_INITIALIZE_SECTIONSマクロを定義することで,非依存部定義した
1481bssセクションとdataセクションの初期化処理を無効化して,
1482initialize_sectionsを依存部で実装することができる.
1483
1484カーネル本体は,kerflgがfalse(=0)に初期化される以外に,bssセクショ
1485ンが初期化されることに依存していないため,initialize_sectionsを依存部
1486で用意する場合,bssセクション初期化分のシステムの起動時間を短縮するた
1487めに,kerflgをfalseに初期化するだけで十分である.
1488
14896.15 カーネル内部のチューニング
1490
14916.15.1 ビットマップサーチ
1492
1493節番号以外,ATK2-SC1から変更なし.
1494
14956.16 カーネル実装に関するその他の定義
1496
14976.16.1 エラーチェック方法の指定
1498
1499節番号以外,ATK2-SC1から変更なし.
1500
15016.16.2 非タスクコンテキスト用のスタック領域
1502
1503節番号以外,ATK2-SC1から変更なし.
1504
15056.16.3 空ラベルの定義
1506
1507節番号以外,ATK2-SC1から変更なし.
1508
15096.16.4 各スタックのデフォルト値
1510
1511(6-16-4-3) DEFAULT_TASKSYSTEMSTKSZ(オプション)
1512(6-16-4-4) DEFAULT_ISRSYSTEMSTKSZ(オプション)
1513(6-16-4-5) DEFAULT_HOOKSTKSZ(オプション)
1514(6-16-4-6) DEFAULT_NONTRUSTEDHOOKSTKSZ(オプション)
1515(6-16-4-7) DEFAULT_TRUSTEDFUNCTIONSTKSZ(オプション)
1516(6-16-4-8) DEFAULT_OSSTKSZ(オプション)
1517
15186.16.5 スタックマジックナンバー領域操作マクロの定義
1519
1520(6-16-5-2) TOPPERS_SSTK_MAGIC_REGION(オプション)
1521
1522スタックモニタリングで使用するタスクシステムスタック用マジックナンバー
1523の格納位置を返すマクロであり,スタックの成長方向がアドレスの大きい方か
1524ら小さい方へ成長することをデフォルト実装としている.スタック成長方向に
1525よりターゲットで再定義することができる.p_tinibで指定ししたタスク初期
1526化ブロックを基づいて,スタック成長方向によりターゲットで再定義すること
1527ができる.
1528
15296.16.6 標準以外メモリリージョン属性の定義
1530
1531ハードウェアにどのような性質のメモリリージョンが存在するかは,ターゲッ
1532トに依存するので,標準ROM,標準RAM以外のメモリリージョンが存在する場合,
1533ターゲット依存部で,属性を識別するため以下のマクロを定義する.
1534
1535(6-16-6-1)TARGET_REGATR
1536
1537ただし,非依存部で以下の定義値は,既にビット単位で予約されているので,
1538定義値を注意する.
1539 0x00 /* オブジェクト属性を指定しない */
1540 0x01 /* 書込みアクセス禁止 */
1541 0x02 /* 標準ROMリージョン */
1542 0x04 /* 標準RAMリージョン */
1543
1544コンフィギュレーション時,非依存部のでTARGET_REGATRを用いて,定義した
1545メモリリージョンの有効性をチェックしている.
1546
15476.17 トレースログ機能に関する設定
1548
15496.17.1 取得できるトレースログの種類とマクロ
1550
1551節番号以外,ATK2-SC1から変更なし.
1552
15536.17.2 トレースログ記録のサンプルコード
1554
1555節番号以外,ATK2-SC1から変更なし.
1556
15576.18 フック,シャットダウンフックの強制終了
1558
1559(6-18-1) void call_trusted_hook(void *hook, StatusType arg)
1560
1561call_trusted_hookはシャットダウンフック実行時にターゲット非依存部から呼
1562び出される.信頼フックの強制終了処理と,実行再開可能にするためレジスタ
1563の退避を行う.
1564また,信頼シャットダウンフック実行中にエラーフックが発生して,更にエラー
1565フック実行中にプロテクションフックが上がるようなフックのネストができた状
1566態で,信頼シャットダウンフックを強制終了する可能性があるため,フックのネ
1567ストがあっても実行最再開出来るようにする必要がある.そのため,処理単位を
1568管理する変数(callevel_stat),割込みネスト管理変数(except_nest_cnt),信頼
1569フックスタックポインタ退避変数(trusted_hook_savedsp)をスタックに退避する
1570必要がある.
1571上記のレジスタ及び変数をスタックに退避した後,信頼フック用スタックのスタ
1572ックポインタを信頼フックスタックポインタ退避変数(trusted_hook_savedsp)に
1573退避する.
1574
1575(6-18-2) void exit_trusted_shutdown_hook(void)
1576
1577exit_trusted_shutdown_hookはcall_trusted_hookにより実行されるフック
1578ルーチンから呼び出されることを想定している.信頼シャットダウンフックの
1579強制終了処理を行う.
1580信頼フックスタックポインタ退避変数(trusted_hook_savedsp)を使用して,ス
1581タックに退避されているデータはcall_trusted_hook実行時にスタックに退避さ
1582れたもの(trusted_hook_savedsp,except_nest_cnt,callevel_stat)である.
1583
1584(6-18-3)
1585void call_nontrusted_hook(void *hook, StatusType arg, uint32 HookType)
1586
1587call_nontrusted_hookは非信頼フック呼出し時にターゲット非依存部から呼び
1588出される.非信頼フックの呼出しについて必要な処理を行う.
1589
1590----------------------------------------
1591void call_nontrusted_hook(void *hook, StatusType arg, uint32 HookType)
1592{
1593 Callee-Savedレジスタ(r16-r23),fpレジスタ,raレジスタをスタック退避
1594 非信頼フック実行前スタックポインタ退避変数をスタックに退避
1595 非信頼シャットダウンフック実行前スタックポインタ退避変数をスタック
1596 に退避
1597 非信頼フック実行前スタックポインタ退避変数に現在のスタックポインタ
1598 を退避
1599 if (HookTypeがシャットダウンフックではない場合) {
1600 if (非信頼フックルーチンがネストしていない) {
1601 非信頼フック用スタックのアドレスを元にmpubase設定値を生成
1602 非信頼フック用スタックの先頭を格納
1603 格納したスタックポインタを元にmpuacc設定値を生成
1604 mpubaseレジスタ,mpuaccレジスタに生成した値を書き込み
1605 }
1606
1607 if (異なる非信頼OSAP所属フックがネストしている) {
1608 [in]*hookをスタックに退避
1609 [in]argをスタックに退避
1610 非信頼フック使用スタックポインタ緒をスタックに退避
1611 OSAPの専有領域のMPU設定を実施
1612 退避していたスタックを復帰
1613 現在MPUに設定しているスタックを所有するタスクのTCBの
1614 スタックをスタックに退避
1615 現在MPUに設定しているスタックを所有するタスクのTCBの
1616 スタックを0クリア
1617 }
1618 スタックポインタを,非信頼フックルーチンのスタックに切替え
1619 全割込み禁止状態に移行
1620 estatusレジスタに,STATUS_Uビットを立て非特権モードの値を格納
1621 eaレジスタに,パラメータ[in]Hookを格納
1622 r4レジスタに,パラメータ[in]argを格納
1623 raレジスタに,フック関数実行後の戻り番地として
1624 exit_nontrusted_hook_trapを格納
1625 eret命令により,非特権モード状態でパラメータ[in]Hook関数を実行
1626 trapの機能コードとして,TFN_HOOK_RETURNを発行
1627 trap命令実施し,例外ハンドラから
1628 call_nontrusted_hook_trap_retを実行
1629 } else {
1630 非信頼シャットダウンフック実行前スタックポインタ退避変数に現在
1631 のスタックポインタを退避
1632 呼び出し元の処理単位を退避
1633 非信頼フックのネスト値を退避
1634 非信頼シャットダウンの強制終了
1635 }
1636}
1637----------------------------------------
1638
1639(6-18-4) void exit_nontrusted_hook(void)
1640
1641exit_nontrusted_hookはcall_nontrusted_hookにより実行されるフックルーチ
1642ンから呼び出されることを想定している.非信頼フックの強制終了処理を行い,
1643呼び出し元には戻らない.
1644
16456.19 コア起動
1646
1647(6-19-1) LOCAL_INLINE boolean x_start_core(CoreIdType coreid)
1648
1649指定されたコアの起動処理を行う.
1650
1651----------------------------------------
1652LOCAL_INLINE boolean x_start_core(CoreIdType coreid)
1653{
1654 if (指定されたコアID<サポートしているコア数) {
1655 (SYSVER_REG5 + 4 * coreid )に,MAGIC_STARTを書き込む
1656 TRUEを返す
1657 } else {
1658 FALSEを返す
1659 }
1660 返り値をリターン
1661}
1662----------------------------------------
1663
1664(6-19-2) LOCAL_INLINE boolean is_halt(CoreIdType coreid)
1665
1666指定されたコアが起動されたかの確認を行う.
1667
1668----------------------------------------
1669LOCAL_INLINE boolean is_halt(CoreIdType coreid)
1670{
1671 if (SYSVER_REG5 + 4 * coreid )にMAGIC_STARTが書き込まれていない {
1672 TRUEを返す
1673 } else {
1674 FALSEを返す
1675 }
1676}
1677----------------------------------------
1678
16796.20 フックの確認
1680
1681(6-20-1) LOCAL_INLINE boolean is_running_nontrusted_hook(void)
1682
1683非信頼フックルーチンが実行中であるかを確認する.
1684
1685----------------------------------------
1686LOCAL_INLINE boolean is_running_nontrusted_hook(void)
1687{
1688 if (非信頼フックルーチン実行中) {
1689 TRUEを返す
1690 } else {
1691 FALSEを返す
1692 }
1693}
1694----------------------------------------
1695
1696(6-20-2) LOCAL_INLINE boolean is_running_nontrusted_shtdwnhk(void)
1697
1698非信頼シャットダウンフックルーチンが実行中であるかを確認する.
1699
1700----------------------------------------
1701LOCAL_INLINE boolean is_running_nontrusted_shtdwnhk(void)
1702{
1703 if (非信頼フックルーチン実行中) {
1704 TRUEを返す
1705 } else {
1706 FALSEを返す
1707 }
1708}
1709----------------------------------------
1710
17116.21 スタック切り替え
1712
1713call_protectionhk_main_stkchg (ercd)
1714
1715フック用スタックへの切り替えを実施した上でフックルーチンの実行を行う.
1716
17176.22 非信頼フックルーチンスタック領域
1718
1719(6-22-1) AccessType probe_nthkstk(MemorySizeType start, MemorySizeType end)
1720
1721指定メモリ領域が非信頼フックルーチンスタック領域に存在するか確認する.
1722
1723----------------------------------------
1724AccessType probe_nthkstk(MemorySizeType start, MemorySizeType end)
1725{
1726 戻り値変数をアクセス権なしで初期化
1727 if (非信頼フック実行前のスタックポインタ変数が0でない場合) {
1728 if ([in]start,[in]endで指定した領域が非信頼フックスタック領域に含まれる場合) {
1729 戻り値変数に読書き権限+スタックアクセス権限をアクセス権として設定
1730 }
1731 }
1732 戻り値変数を返す
1733}
1734----------------------------------------
1735
1736(6-22-2) void cancel_nontrusted_hook(void)
1737
1738cancel_nontrusted_hookはタスク強制終了時に,ターゲット非依存部から呼び出される.
1739非信頼フック実行中に非信頼フックスタック領域のMPU設定を無効化する.
1740
1741----------------------------------------
1742void cancel_nontrusted_hook(void)
1743{
1744 if (非信頼フック実行前のスタックポインタ変数が0でない場合) {
1745 非信頼フック実行前のスタックポインタ変数に0を設定
1746 非信頼フックスタック領域に対して以下のように設定
1747 ・開始アドレス=0
1748 ・終了アドレス=0
1749 ・特権:読書き不可
1750 ・非特権:読書き不可
1751 }
1752}
1753----------------------------------------
1754
17556.14 ハードウェアカウンタ
1756
1757ATK2-SC1から変更なし.
1758
17596.14.1 ハードウェアカウンタのファイル構成
1760
1761ATK2-SC1から変更なし.
1762
17636.14.2 ハードウェアカウンタの情報提供
1764
1765ATK2-SC1から変更なし.
1766
1767
17687.ジェネレータ設定ファイルのターゲット依存部
1769
17707.1 設定ファイルとターゲット依存部の位置付け
1771
1772ATK2-SC3のジェネレータは,設定ファイルの記述に従ってファイルの生成およ
1773びエラーチェックを行う.ジェネレータの設定ファイルには,以下の5つがあ
1774る.
1775
1776(a) XMLコンテナテーブル
1777
1778ATK2-SC1から変更なし.
1779
1780(b) 値取得シンボルテーブル
1781
1782ATK2-SC1から変更なし.
1783
1784(c) パス2のテンプレートファイル
1785
1786ジェネレータのパス2は,テンプレートファイルに従って,カーネルの構成・
1787初期化ファイル(Os_Lcfg.c),構成・初期化ヘッダファイル(Os_Lcfg.h),
1788メモリ構成・初期化ファイル(kernel_mem2.c),リンカスクリプトファイル
1789(ldscript.ld),パス3, パス4に渡すテンプレート情報ファイル
1790(cfg2_out.tf)などを生成する.このテンプレートファイルは,ターゲット非
1791依存部とターゲット依存部に切り分けてあるが,他のファイルのターゲット依
1792存部とは逆に,ターゲット依存部からターゲット非依存部をインクルードする
1793形になっている.
1794
1795具体的には,targetディレクトリに置かれたtarget.tfで,必要な変数を定義
1796した後,テンプレートファイルのターゲット非依存部(kernel/kernel.tf)を
1797インクルードする.kernel.tfでは,カーネルのターゲット非依存部で使用す
1798る変数定義等を生成する.kernel.tfをインクルードした後,target.tfでは,
1799カーネルのターゲット依存部で使用する変数定義等を生成する.target.tfか
1800ら,プロセッサ依存部,チップ依存部を,開発環境依存部を切り分けてもよい.
1801
1802パス2では,メモリ構成・初期化ファイルに,meminib_table, memtop_table,
1803datasecinib_table, bsssecinib_table, mpuinfo_shared(共有領域に対する
1804MPUINFOB),OSAP専有領域に対するMPUINFOBの情報を出力する.
1805
1806(d) パス3のテンプレートファイル
1807
1808ジェネレータのパス3は,テンプレートファイルに従って,パス2で生成した,
1809meminib_table, memtop_table, datasecinib_table, bsssecinib_table,
1810mpuinfo_shared(共有領域に対するMPUINFOB), OSAP専有領域に対するMPUINFOB
1811の最適化を行う.このテンプレートファイルも,ターゲット非依存部とターゲ
1812ット依存部に切り分けてあり,ターゲット依存部からターゲット非依存部をイ
1813ンクルードする形になっている.
1814
1815具体的には,targetディレクトリに置かれたtarget_mem.tfで,必要な変数を
1816定義した後,テンプレートファイルのターゲット非依存部
1817(kernel/kernel_mem.tf)をインクルードする.kernel_mem.tfでは,カーネ
1818ルのターゲット非依存部で,パス2で生成した各ファイルから情報を読込み,
1819メモリ構成・初期化データ構造の最適化(隣接領域の統合・0サイズ領域の削
1820除など)を行い,最適化したメモリ構成・初期化ファイル(kernel_mem3.c)
1821を出力する.target_mem.tfから,プロセッサ依存部,チップ依存部を,開発
1822環境依存部を切り分けてもよい.
1823
1824(e) パス4のテンプレートファイル
1825
1826ジェネレータのパス4は,テンプレートファイルに従って,パス3で生成した,
1827meminib_table, memtop_table, datasecinib_table, bsssecinib_table,
1828mpuinfo_shared(共有領域に対するMPUINFOB), OSAP専有領域に対するMPUINFOB
1829を更に最適化を行い,最終のメモリ構成・初期化ファイル(kernel_mem.c)を
1830出力する.このテンプレートファイルも,ターゲット非依存部とターゲット依
1831存部に切り分けてあり,ターゲット依存部からターゲット非依存部をインクル
1832ードする形になっている.
1833
1834具体的には,targetディレクトリに置かれたtarget_mem2.tfで,必要な変数を
1835定義した後,テンプレートファイルのターゲット非依存部
1836(kernel/kernel_mem2.tf)をインクルードする.kernel_mem2.tfでは,カー
1837ネルのターゲット非依存部で,パス3で生成した各ファイルから情報を読込み,
1838メモリ構成・初期化データ構造再度最適化を行い,パス3と変わらない最終の
1839メモリ構成・初期化ファイル(kernel_mem.c)を出力する.target_mem.tfか
1840ら,プロセッサ依存部,チップ依存部を,開発環境依存部を切り分けてもよ
1841い.
1842
1843ジェネレータのパス4は,基本的にはパス3と同じ処理を行うが,パス3と違い,
1844各メモリオブジェクトの開始と終端アドレスが最終のアドレスになるため,違
1845うメモリリージョンに配置されるメモリオブジェクトの統合や,リンカで配置
1846しないメモリオブジェクトの統合が可能になる.パス3とパス4ではメモリマッ
1847プが変わらないようにするため,パス4での最適化により,配列のサイズが小
1848さくできる場合でもサイズを変えないようにする.
1849ジェネレータのパス4では,メモリオブジェクトの重なりのチェック等のエラー
1850チェックも行う.
1851
1852なお,ジェネレータの詳細仕様と設定ファイルの記述方法については,別途
1853PDFファイルの形で配布している「TOPPERS新世代カーネル用ジェネレータ仕様」
1854および「TOPPERS新世代カーネル用ジェネレータ内蔵マクロプロセッサ仕様」
1855を参照すること.
1856
18577.2 パス2のテンプレートファイルのターゲット依存部
1858
1859
18607.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
1861
1862
1863(7-2-1-5) TARGET_SEC_ALIGN_STR セクションのアラインサイズの定義
1864(7-2-1-6) TARGET_PAGE_SIZE_STR ページのアラインサイズの定義
1865
1866(7-2-1-7) TARGET_MEMATR_USTACK ユーザスタック領域のメモリオブジェクト
1867 属性
1868
1869以下の標準セクションのメモリオブジェクト属性を定義する
1870(7-2-1-8) MEMATR_TEXT コード領域の属性
1871(7-2-1-9) MEMATR_RODATA 読込み専用領域の属性
1872(7-2-1-10) MEMATR_DATA データ領域の属性
1873(7-2-1-11) MEMATR_BSS 0初期化領域の属性
1874(7-2-1-12) MEMATR_PRSV プレザーブド領域の属性
1875(7-2-1-13) MEMATR_SDATA 初期値ありショート領域の属性
1876(7-2-1-14) MEMATR_SBSS 初期値なしショート領域の属性
1877
1878(7-2-1-15) START_OBJS スタートアップモジュールの定義
1879
1880(7-2-1-16) SECTION_USTACK ユーザスタック領域のセクション名生成関数
1881
1882(7-2-1-17) ALLOC_USTACK(taskid, ustksz) ユーザスタック領域の確保関数
1883
1884(7-2-1-18) USTACK_ALIGN_SIZE(ustksz) ユーザスタックのアライメント制
1885 約に合わせたサイズを返す関数
1886
1887(7-2-1-19) SECTION_SHARED_USTACK(共有スタックID) 基本タスクの共有ス
1888 タックのセクション名を返す関数
1889
1890(7-2-1-20) ALLOC_SHARED_USTACK(...) 基本タスクの共有スタックの確保関数
1891 第1引数 共有スタック名
1892 第2引数 共有スタックID(タスク優先度)
1893 第3引数 スタックサイズ(アライメント調整済み)
1894
1895(7-2-1-21) ALLOC_SSTACK(...) システムスタック領域の確保関数
1896 第1引数 スタック名
1897 第2引数 スタックサイズ
1898 第3引数 変数定義に付与する指定子
1899
1900(7-2-1-22) ALLOC_HSTACK(...) 非信頼フックスタックの確保関数
1901 第1引数 スタック名
1902 第2引数 スタックサイズ
1903
1904
1905(7-2-1-23) HSTACK_SIZE_STR(stksz) 非信頼フックスタックサイズのアライ
1906 メント制約を満たすように拡張したサ
1907 イズの文字列を返す関数
1908
1909(7-2-1-24) DEFINE_DSEC(void) 標準のセクションの定義関数
1910 上記(7-2-1-9)〜(7-2-1-15)の標準のセクション(名前,属性,配置リージョ
1911 ン名)の定義
1912
1913(7-2-1-25) SECTION_DESCRIPTION(secname) リンクするセクション名記述の生
1914 成関数
1915
1916
1917(7-2-1-26) HOOK_ERRORCHECK_SEC(secid)(オプション) ATT_SECに関するタ
1918 ーゲット依存のエラーチェック関数
1919
1920
1921
1922(7-2-1-27) HOOK_ERRORCHECK_MEM(secid)(オプション) ATT_MEMに関するタ
1923 ーゲット依存のエラーチェック関数
1924
1925(7-2-1-28) TARGET_PROVIDE_GP(void) gpレジスタの設定関数
1926
1927(7-2-1-29) TARGET_CODE_FILLER(moid)(オプション) text領域をNOP命令
1928 で埋める関数
1929 text領域のシンボル名をNOP命令で埋める
1930
1931(7-2-1-30) GENERATE_OUTPUT(void)(オプション)ターゲット依存のOUTPUT記
1932 述の生成関数
1933 出力するファイルの形式(BFD),ターゲットアーキテクチャ及びエントリ
1934 を指定する.
1935
1936(7-2-1-31) GENERATE_PROVIDE(void) ターゲット依存のPROVIDE記述の生成
1937 関数
1938
1939
1940(7-2-1-32) GENERATE_SECTION_FIRST(void) ターゲット依存のセクション記述
1941 の生成関数
1942
1943(7-2-1-33) GENERATE_STKMPUINFOB(taskid) タスクスタックのMPUレジスタ設
1944 定値を出力する関数
1945 メモリサイズ確定のため,コンパイラ用ダミーのMPUレジスタ設定値を出力
1946 する.
1947
1948(7-2-1-34) $CFG_PASS3 = 0$
1949(7-2-1-35) $CFG_PASS4 = 0$
1950
1951また,パス2,パス3,パス4共通定義を共通処理ファイル(prc_common.tf)に定
1952義し,各パス処理テンプレートファイルを処理前にインクルードする.
1953
1954(7-2-1-36) MEMORY_ALIGN メモリのアライメント
1955
1956(7-2-1-37) CHECK_MP_ALIGN 第1引数と,第2引数がメモリ保護のアライメン
1957 ト制約を満たしているかチェックする関数
1958
1959(7-2-1-38) GENERATE_OSAPINIB_MPUINFOB(osapid) OSAPINIBのMPUINFOBを出
1960 力する関数
1961
1962(7-2-1-39) DEFINE_CONST_VAR(...) rodata領域に配置される変数を定
1963 義する関数
1964 第1引数 変数型名
1965 第2引数 変数名
1966
1967DEFINE_CONST_VARは,非依存部のテンプレートファイルでは,データセクション
1968の初期化前に使用されるデータ(具体的には,ostkpt,tnum_datasec,
1969datasecinib_table)を確実に定数領域(初期化が必要なく,リセット後にも
1970値が保持される不揮発性領域)に配置するために用いられる.
1971
1972(7-2-1-40) GENERATE_STKMPUINFOB(taskid) タスクスタックのMPUレジスタ設
1973 定値を出力関数
1974 この関数は,パス3, パス4のみ有効な定義とする.
1975 上記(7-2-1-33)の定義は,パス2のみ有効
1976
1977(7-2-1-41) DEFINE_VAR_SEC(...) 変数を指定されたセクションに定義す
1978 る関数
1979 第1引数 セクション名
1980 第2引数 型
1981 第3引数 変数名
1982 第4引数 変数の値
1983
1984(7-2-1-42) GENERATE_TARGET_MPUINFOB(void) MPUレジスタ設定値の生成関数
1985 MPU_REGIONを作成,統合し,共有領域及びOSAP専有領域のMPUレジスタ設定
1986 値を生成する.
1987
1988(7-2-1-27) HOOK_ERRORCHECK_REG(regid)(オプション) ATT_REGに関するタ
1989 ーゲット依存のエラーチェック関数
1990
19917.2.2 ターゲット非依存部で定義される変数
1992
1993(7-2-2-3) REG.xxxx[regid] メモリリージョンの連想配列
1994
1995(7-2-2-4) MO.xxxx[moid] メモリオブジェクトの連想配列
1996
1997(7-2-2-5) LNKSEC.xxxx[lsid] LNK_SECで配置するセクションの連想配列
1998
1999(7-2-2-6) OSAP.xxxx[osapid] OSAP情報の連想配列
2000
20017.3 パス3のテンプレートファイルのターゲット依存部
2002
20037.3.1 ターゲット非依存部をインクルードする前に定義すべき変数
2004
2005target_mem.tfからkernel_mem.tfをインクルードする前に,必要に応じて,次
2006の変数を定義しておかなければならない.
2007
2008(7-3-1-2) $CFG_PASS3 = 1$
2009(7-3-1-3) $CFG_PASS4 = 0$
2010
20117.4 パス4のテンプレートファイルのターゲット依存部
2012
2013
2014以下では,パス4のテンプレートファイルのターゲット依存部を記述する上で
2015必要な事項について説明する.
2016
20177.4.1 ターゲット非依存部をインクルードする前に定義すべき変数
2018
2019target_mem2.tfからkernel_mem2.tfをインクルードする前に,必要に応じて,
2020次の変数を定義しておかなければならない.
2021
2022(7-4-1-1) $CFG_PASS3 = 0$
2023(7-4-1-2) $CFG_PASS4 = 1$
2024
2025また,各メモリオブジェクトの領域のサイズチェック・オブジェクトの重なり
2026チェックを必要に応じて,パス4で行う.
2027
2028パス3とパス4ではメモリマップが変わらないようにするため,パス4での最適
2029化により,配列のサイズが小さくできる場合でもサイズを変えないようにす
2030る.
2031
2032
20337.5 cfg1_out.cのリンクに必要なスタブの定義ファイル
2034
2035----------------------------------------
2036...
2037void
2038initialize_sections(void)
2039{
2040}
2041const MPUINFOB _background_code_region;
2042const MPUINFOB _background_data_region;
2043----------------------------------------
2044
20457.6 data/bssセクション初期化ブロックの生成
2046
2047ターゲット依存部において,OMIT_STANDARD_DATASECINIBマクロを定義すると,
2048ターゲット非依存部で,dataセクション初期化ブロックを生成しない.
2049
2050ターゲット依存部において,OMIT_STANDARD_BSSSECINIBマクロを定義すると,
2051ターゲット非依存部で,bssセクション初期化ブロックを生成しない.
2052
2053dataセクションなどの先頭番地のラベルは,使用するコンパイラによっては,
2054非依存部で生成される初期化ブロックから参照されるラベルと異なる場合が
2055ある.
2056そのような場合に,これらのマクロを定義することで,ターゲット依存で
2057独自のdata/bssセクション初期化ブロックの生成処理を,テンプレートファイル
2058によって定義することができる.
2059
20608.システムモジュール等のターゲット依存部
2061
20628.1 システムモジュールのターゲット依存部
2063
2064ATK2-SC1から変更なし.
2065
20668.2 システムログ機能のターゲット依存定義
2067
2068(8-2-3) ターゲット定義のシステムサービスの追加
2069システムログ機能は,ターゲット追加のシステムサービスとして位置付け,シ
2070ステムログ機能使用する/使用しない場合,システムサービステーブルに追加/
2071追加しないオプション(USE_KERNEL_LIBRARY_SYSLOG)をサポートする.
2072
2073USE_KERNEL_LIBRARY_SYSLOGマクロが定義されている場合,システムモジュー
2074ルに用意している_kernel_KernelLibrarySyslog関数をターゲットで追加する
2075システムサービステーブル定義(PRC_SVC_TABLE)に追加する.
2076USE_KERNEL_LIBRARY_SYSLOGマクロが定義されない場合,
2077_kernel_KernelLibrarySyslog関数をターゲットで追加するシステムサービス
2078テーブル定義(PRC_SVC_TABLE)に追加しない.
2079
20808.3 シリアルインタフェースドライバのターゲット依存部
2081
20828.3.1 変数,データ型,管理関数
2083
2084ATK2-SC1から変更なし.
2085
20868.3.2 デバイスサービスルーチン
2087
2088ATK2-SC1から変更なし.
2089
20908.3.3 コールバックルーチン
2091
2092ATK2-SC1から変更なし.
2093
20948.4 カーネル起動メッセージの出力のターゲット依存定義
2095
2096ATK2-SC1から変更なし.
2097
20988.5 サンプルプログラムとテストプログラムのターゲット依存定義
2099
2100ATK2-SC1から変更なし.
2101
21028.6 実行時間分布集計モジュールのターゲット依存定義
2103
2104ATK2-SC1から変更なし.
2105
21068.7 タイマドライバ
2107
21088.7.1 タイマドライバのファイル構成
2109
2110ATK2-SC1から変更なし.
2111
21128.7.2 ソフトウェアカウンタの定義
2113
2114ATK2-SC1から変更なし.
2115
21168.7.3 時間型の定義
2117
2118ATK2-SC1から変更なし.
2119
21208.7.4 タイマの初期化・終了処理・割込み処理
2121
2122ATK2-SC1から変更なし.
2123
21248.7.5 現在の時刻の取得
2125
2126ATK2-SC1から変更なし.
2127
21289.その他
2129
21309.1 ドキュメント
2131
2132ATK2-SC1から変更なし.
2133
213410.リファレンス
2135
213610.1 ターゲット依存部のファイル一覧
2137
2138target_mem.tf ジェネレータのパス3のテンプレートファイルのター
2139 ゲット依存部(7.3 節).
2140target_mem2.tf ジェネレータのパス4のテンプレートファイルのター
2141 ゲット依存部(7.4 節).
2142target_mem.arxml ターゲット依存の標準ROM/RAMなどメモリリージョ
2143 ン定義のXMLコンテナコンフィギュレーション
2144 ファイル.
2145target_svc.h ターゲット依存のソフトウェア割込みによるサービ
2146 スコールインタフェースヘッダーファイル.
2147target_serial_obj.arxml シリアルドライバのシステムコンフィギュレーショ
2148 ンファイル.
2149target_serial_osap.arxmlシリアルドライバのシステムコンフィギュレーショ
2150 ンファイル.
2151target_test_obj.arxml テストプログラムのターゲット依存定義のコンフィ
2152 ギュレーションファイル.
2153target_test_osap.arxml テストプログラムのターゲット依存定義のコンフィ
2154 ギュレーションファイル.
2155target_timer_obj.arxml タイマドライバのXMLコンテナ用システムコンフィ
2156 ュレーションファイル.
2157target_timer_osap.arxml タイマドライバのXMLコンテナ用システムコンフィ
2158 ュレーションファイル.
2159
2160
2161以上
Note: See TracBrowser for help on using the repository browser.