source: atk2-sc3-1.4.0-ntisr/doc/porting.txt

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

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

  • Property svn:executable set to *
File size: 86.0 KB
RevLine 
[172]1
2 TOPPERS/ATK2-SC3
3 ターゲット依存部 ポーティングガイド
4
5このドキュメントは,TOPPERS/ATK2-SC3を,未サポートのターゲットシステム
6にポーティングするために必
7要となるターゲット依存部の実装
8方法を説明する
9ものである.
10
11----------------------------------------------------------------------
12TOPPERS ATK2
13 Toyohashi Open Platform for Embedded Real-Time Systems
14 Automotive Kernel Version 2
15
16Copyright (C) 2011-2015 by Center for Embedded Computing Systems
17 Graduate School of Information Science, Nagoya Univ., JAPAN
18Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
19Copyright (C) 2011-2013 by Spansion LLC, USA
20Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
21Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
22Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
23Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
24Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
25Copyright (C) 2011-2015 by Witz Corporation
26Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
27Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
28Copyright (C) 2014-2015 by SCSK Corporation, JAPAN
29Copyright (C) 2015 by SUZUKI MOTOR CORPORATION
30
31上記著作権者
32は,以下の (1)〜(3)の条件を満たす場合に限り,本ドキュメ
33ント(本ドキュメントを改変したものを含む.以下同じ)を使用・複製・改
34変・再é…
35å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
36(1) 本ドキュメントを利用する場合には,上記の著作権表示,この利用条件
37 および下記の無保証規定が,そのままの形でドキュメント中に含まれて
38 いること.
39(2) 本ドキュメントを改変する場合には,ドキュメントを改変した旨の記述
40 を,改変後のドキュメント中に含めること.ただし,改変後のドキュメ
41 ントが,TOPPERSプロジェクト指定の開発成果物である場合には,この限
42 りではない.
43(3) 本ドキュメントの利用により直接的または間接的に生じるいかなる損害
44 からも,上記著作権者
45およびTOPPERSプロジェクトをå…
46è²¬ã™ã‚‹ã“と.また,
47 本ドキュメントのユーザまたはエンドユーザからのいかなる理由に基づ
48 く請求からも,上記著作権者
49およびTOPPERSプロジェクトをå…
50è²¬ã™ã‚‹ã“と.
51
52本ドキュメントは,AUTOSAR(AUTomotive Open System ARchitecture)仕様
53に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するものではな
54い.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利用する
55者
56に対して,AUTOSARパートナーになることを求めている.
57
58本ドキュメントは,無保証で提供されているものである.上記著作権者
59およ
60びTOPPERSプロジェクトは,本ドキュメントに関して,特定の使用目的に対す
61る適合性も含めて,いかなる保証も行わない.また,本ドキュメントの利用
62により直接的または間接的に生じたいかなる損害に関しても,その責任を負
63わない.
64
65$Id: porting.txt 517 2015-12-24 10:41:42Z witz-itoyo $
66----------------------------------------------------------------------
67
68○目次
69
70◎0.本マニュアルの位置づけ
711.å…
72±é€šäº‹é …
73
74 1.1 ターゲット依存部の構成
75 1.2 多重インクルードの防止
76 1.3 アセンブリ言語とのヘッダファイルのå…
77±ç”¨
78 1.4 インクルード記述の方法
79 1.5 クリティカルセクションの出å…
80¥å‡¦ç†ã®å®Ÿç¾ã«é–¢ã™ã‚‹åˆ¶ç´„
812.システム構築環境のターゲット依存部
82 2.1 ターゲット略称とターゲット依存部のディレクトリ
83 2.2 Makefileのターゲット依存部
84 2.3 開発環境名とコマンド名の設定
85 2.4 コンパイルオプションとオブジェクトファイルの設定
86 2.5 オフセットファイルの生成方法
87 2.5.1 ジェネレータを用いる方法
88 ○2.6 リンク方法の設定
89 ○2.7 依存関係の定義
90 2.8 その他の設定
913.AUTOSARå…
92±é€šå®šç¾©ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨
93 3.1 整数型の最大値・最小値・ビット数
94 3.2 整数型
95 3.3 論理型,論理型の値
96 3.4 その他の型
97 3.5 コンパイラの拡張機能のためのマクロ定義
98 3.6 標準的な定義の上書き
994.システムインタフェースレイヤ(SIL)のターゲット依存部
100 4.1 å…
101¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
102‹ã®ç®¡ç†
103 4.2 プロセッサのエンディアン
104 4.3 I/O空間アクセス関数
1055.カーネルAPIのターゲット依存部
106 5.1 メモリ領域確保のための型定義
107 5.2 メモリ領域確保のためのマクロ
108 ○5.3 オブジェクト型の上書き
1096.カーネル実装
110のターゲット依存部
111 6.1 カーネル実装
112のターゲット依存部のå…
113±é€šäº‹é …
114
115 ○6.1.1 カーネル実装
116のターゲット依存部の構成要素
117 6.1.2 ターゲット依存部の関数の命名規則
118 6.2 トレースログ機能への対応
119 6.3 システム状æ…
120‹ã®ç®¡ç†
121 6.3.1 å…
122¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
123‹ã®ç®¡ç†
124 6.3.2 コンテキストの管理
125 6.3.3 OS割込み禁止状æ…
126‹ã®ç®¡ç†
127 6.4 割込みに関連するシステム状æ…
128‹ã®ç®¡ç†
129 6.4.1 割込み優å…
130ˆåº¦ãƒžã‚¹ã‚¯ã®ç®¡ç†
131 6.4.2 割込みハンドラのå…
132ˆé ­å‡¦ç†ã¨æœ«å°¾å‡¦ç†
133 6.4.3 個別割込み禁止状æ…
134‹ã®ç®¡ç†
135 6.5 タスクディスパッチャ
136 ○6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
137 6.5.2 ディスパッチャ本体
138 6.5.3 タスクコンテキストからのディスパッチ
139 6.5.4 ディスパッチャの動作開始
140 ○6.5.5 現在のコンテキストを捨ててディスパッチ
141 ○6.5.6 タスクの起動処理
142 6.6 割込みハンドラ
143 ○6.6.1 割込みハンドラの出å…
144¥å£å‡¦ç†
145 6.6.2 割込み要求ラインの属性の設定
146 ○6.6.3 割込み管理機能の初期化処理の変更
147 6.6.4 デフォルトのC2ISR
148 6.6.5 カーネル管理外の割込み
149 6.6.6 DisableAllInterrupts/EnableAllInterruptsの処理内
150容の変更
151 ◎6.6.7 割込み禁止解除
152 6.7 スタックモニタリング
153 ◎6.7.1 ディスパッチャとC2ISRの出å…
154¥å£å‡¦ç†ã§ã®ã‚¹ã‚¿ãƒƒã‚¯ãƒ¢ãƒ‹ã‚¿ãƒªãƒ³ã‚°
155 ◎6.7.2 信頼関数実行の出口処理でのスタックモニタリング
156 ○6.8 CPU例外ハンドラ
157 ◎6.9 ソフトウェア割込みハンドラ
158 ◎6.10 信頼OSAPと非信頼OSAPからのシステムサービス呼出し
159 ◎6.10.1 システムサービス呼出しの定義
160 ◎6.10.2 信頼OSAPからのシステムサービス呼出し
161 ◎6.10.3 非信頼OSAPからのシステムサービス呼出し
162 ◎6.10.4 ターゲット依存システムサービスの追加
163 ◎6.11 メモリ保護機構(MPU)制御
164 ◎6.11.1 スタックのMPU設定情
165報ブロック(STKMPUINFOB)
166 ◎6.11.2 OSAP固有MPU設定情
167報ブロック(OSAPMPUINFOB)
168 ◎6.11.3 MPU初期化処理
169 ◎6.11.4 OSAP固有MPU情
170報設定処理
171 ◎6.11.5 MPU依存のバックグラウンド領域チェック
172 ◎6.12 メモリ管理のチューニング
173 ◎6.12.1 メモリオブジェクトの管理
174 ◎6.12.2 メモリアクセス権チェックのためのマクロ
175 6.13 エラーフック,シャットダウンフック呼び出し
176 ○6.14 カーネルの起動・終了とスタック領域など
177 6.15 カーネル内
178部のチューニング
179 6.15.1 ビットマップサーチ
180 6.16 カーネル実装
181に関するその他の定義
182 6.16.1 エラーチェック方法の指定
183 6.16.2 非タスクコンテキスト用のスタック領域
184 6.16.3 空ラベルの定義
185 ○6.16.4 各スタックのデフォルト値
186 ○6.16.5 スタックマジックナンバー領域操作マクロの定義
187 ◎6.16.6 標準以外メモリリージョン属性の定義
188 6.17 トレースログ機能に関する設定
189 6.17.1 取得できるトレースログの種類とマクロ
190 6.17.2 トレースログ記録のサンプルコード
191 ◎6.18 信頼フック,シャットダウンフックの強制終了
192 ◎6.19 コア起動
193 ◎6.20 フックの確認
194 ◎6.21 スタック切り替え
195 ◎6.22 非信頼フックルーチンスタック領域
196 6.23 ハードウェアカウンタ
197 6.23.1 ハードウェアカウンタのファイル構成
198 6.23.2 ハードウェアカウンタの情
199報提供
200 ◎6.24 OSAP強制終了
2017.ジェネレータ設定ファイルのターゲット依存部
202 7.1 設定ファイルとターゲット依存部の位置付け
203 7.2 パス2のテンプレートファイルのターゲット依存部
204 ○7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
205 ○7.2.2 ターゲット非依存部で定義される変数
206 7.3 パス3のテンプレートファイルのターゲット依存部
207 ○7.3.1 ターゲット非依存部をインクルードする前に定義すべき変数
208 ◎7.4 パス4のテンプレートファイルのターゲット依存部
209 ◎7.4.1 ターゲット非依存部をインクルードする前に定義すべき変数
210 ○7.5 cfg1_out.cのリンクに必
211要なスタブの定義ファイル
212 ◎7.6 data/bssセクション初期化ブロックの生成
2138.システムモジュール等のターゲット依存部
214 8.1 システムモジュールのターゲット依存部
215 ○8.2 システムログ機能のターゲット依存定義
216 8.3 シリアルインタフェースドライバのターゲット依存部
217 8.3.1 変数,データ型,管理関数
218 8.3.2 デバイスサービスルーチン
219 8.3.3 コールバックルーチン
220 8.4 カーネル起動メッセージの出力のターゲット依存定義
221 8.5 サンプルプログラムとテストプログラムのターゲット依存定義
222 8.6 実行時間分布集計モジュールのターゲット依存定義
223 8.7 タイマドライバ
224 8.7.1 タイマドライバのファイル構成
225 8.7.2 ソフトウェアカウンタの定義
226 8.7.3 時間型の定義
227 8.7.4 タイマの初期化・終了処理・割込み処理
228 8.7.5 現在の時刻の取得
2299.その他
230 9.1 ドキュメント
23110.リファレンス
232 ○10.1 ターゲット依存部のファイル一覧
233
234○がついている項
235目はATK2-SC1から変更があった箇所を,◎はATK2-SC3で
236新規に追加された箇所を示し,それぞれ差分のみを記述している.
237
238
2390.本マニュアルの位置づけ
240TOPPERS/ATK2-SC3は,TOPPERS/ATK2-SC1をベースとしているため,多くのポー
241ティング項
242目はTOPPERS/ATK2-SC1と同一である.本ドキュメントでは,TOPPER
243S/ATK2-SC1と異なる点について説明する.そのため,まずTOPPERS/ATK2-SC1の
244ポーティングガイドを参ç…
245§ã®å¾Œï¼Œæœ¬ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆã‚’参ç…
246§ã™ã‚‹ã“と.
247
248
2491.å…
250±é€šäº‹é …
251
252
2531.1 ターゲット依存部の構成
254
255ATK2-SC1から変更なし.
256
2571.2 多重インクルードの防止
258
259ATK2-SC1から変更なし.
260
2611.3 アセンブリ言語とのヘッダファイルのå…
262±ç”¨
263
264ATK2-SC1から変更なし.
265
2661.4 インクルード記述の方法
267
268ATK2-SC1から変更なし.
269
2701.5 クリティカルセクションの出å…
271¥å‡¦ç†ã®å®Ÿç¾ã«é–¢ã™ã‚‹åˆ¶ç´„
272
273ATK2-SC1から変更なし.
274
2752.システム構築環境のターゲット依存部
276
2772.1 ターゲット略称とターゲット依存部のディレクトリ
278
279ATK2-SC1から変更なし.
280
2812.2 Makefileのターゲット依存部
282
283ATK2-SC1から変更なし.
284
2852.3 開発環境名とコマンド名の設定
286
287ATK2-SC1から変更なし.
288
2892.4 コンパイルオプションとオブジェクトファイルの設定
290
291ATK2-SC1から変更なし.
292
2932.5 オフセットファイルの生成方法
294
295ATK2-SC1から変更なし.
296
2972.6 リンク方法の設定
298
299ATK2-SC3カーネルは,メモリの最適化を行うため,以下のマクロは,使用でき
300ない.
301
302(2-6-2) TEXT_START_ADDRESS テキストセクションのå…
303ˆé ­ç•ªåœ°
304(2-6-3) DATA_START_ADDRESS データセクションのå…
305ˆé ­ç•ªåœ°
306
3072.7 依存関係の定義
308
309ジェネレータの各パスに対して,ターゲット依存のファイルへの依存関係を定
310義する.å…
311·ä½“的には,パス1,パス2,パス3,パス4が依存するファイルを,そ
312れぞれcfg1_out.c,Os_Lcfg.timestamp,kernel_mem3.c,kernel_mem.c,
313$(OBJFILE)に対する依存関係の形で記述する.
314
315ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,
316以下の記述を含める必
317要がある.
318
319----------------------------------------
320kernel_mem3.c: $(TARGETDIR)/target_mem.tf
321kernel_mem.c: $(TARGETDIR)/target_mem2.tf $(TARGETDIR)/target_check.tf
322----------------------------------------
323
3242.8 その他の設定
325
326ATK2-SC1から変更なし.
327
3283.AUTOSARå…
329±é€šå®šç¾©ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨
330
3313.1 整数型の最大値・最小値・ビット数
332
333ATK2-SC1から変更なし.
334
3353.2 整数型
336
337ATK2-SC1から変更なし.
338
3393.3 論理型,論理型の値
340
341ATK2-SC1から変更なし.
342
3433.4 その他の型
344
345ATK2-SC1から変更なし.
346
3473.5 コンパイラの拡張機能のためのマクロ定義
348
349ATK2-SC1から変更なし.
350
3513.6 標準的な定義の上書き
352
353ATK2-SC1から変更なし.
354
3554.システムインタフェースレイヤ(SIL)のターゲット依存部
356
3574.1 å…
358¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
359‹ã®ç®¡ç†
360
361ATK2-SC1から変更なし.
362
3634.2 プロセッサのエンディアン
364
365ATK2-SC1から変更なし.
366
3675.カーネルAPIのターゲット依存部
368
3695.1 メモリ領域確保のための型定義
370
371ATK2-SC1から変更なし.
372
3735.2 メモリ領域確保のためのマクロ
374
375ATK2-SC1から変更なし.
376
3775.3 オブジェクト型の上書き
378
379(5-3-1) OMIT_DATA_TYPE (オプション)
380
381OMIT_DATA_TYPEマクロをターゲット依存部で定義した場合は,一部のオブジェ
382クトの型をターゲット依存部で定義することができる.
383
384(5-3-15) TrustedFunctionIndexType (オプション,デフォルトはuint32)
385(5-3-16) IocType (オプション,デフォルトはuint32)
386(5-3-17) SenderIdType (オプション,デフォルトはuint8)
387
388
3896.カーネル実装
390のターゲット依存部
391
3926.1 カーネル実装
393のターゲット依存部のå…
394±é€šäº‹é …
395
396
3976.1.1 カーネル実装
398のターゲット依存部の構成要素
399
400(c) ジェネレータ設定ファイル
401
402ジェネレータの設定ファイルのターゲット依存部を,target_def.csv,
403target.tf,target_mem.tf,target_mem2.tf,target_check.tfに用意する.
404ジェネレータ設定ファイルの記述方法については,7章で説明する.
405
4066.1.2 ターゲット依存部の関数の命名規則
407
408ATK2-SC1から変更なし.
409
4106.2 トレースログ機能への対応
411
412ATK2-SC1から変更なし.
413
4146.3 システム状æ…
415‹ã®ç®¡ç†
416
4176.3.1 å…
418¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
419‹ã®ç®¡ç†
420
421ATK2-SC1から変更なし.
422
4236.3.2 コンテキストの管理
424
425ATK2-SC1から変更なし.
426
4276.3.3 OS割込み禁止状æ…
428‹ã®ç®¡ç†
429
430ATK2-SC1から変更なし.
431
4326.4 割込みに関連するシステム状æ…
433‹ã®ç®¡ç†
434
4356.4.1 割込み優å…
436ˆåº¦ãƒžã‚¹ã‚¯ã®ç®¡ç†
437
438ATK2-SC1から変更なし.
439
4406.4.2 割込みハンドラのå…
441ˆé ­å‡¦ç†ã¨æœ«å°¾å‡¦ç†
442
443ATK2-SC1から変更なし.
444
4456.4.3 個別割込み禁止状æ…
446‹ã®ç®¡ç†
447
448ATK2-SC1から変更なし.
449
4506.5 タスクディスパッチャ
451
4526.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
453
454(6-5-1-4) OMIT_STKMPUINFOB(オプション)
455(6-5-1-5) STKMPUINFOB(オプション)
456
457MPU情
458報はターゲット依存なので,タスク初期化ブロック(TINIB)にå…
459¥ã‚ŒãŸã
460ない場合は,OMIT_STKMPUINFOBをマクロ定義し,TINIB中からSTKMPUINFOBを外
461すことができる.
462
463OMIT_STKMPUINFOBをマクロ定義すると,TINIB中にMPU設定情
464報が含まれなくな
465るため,それに代わる情
466報は,ターゲット依存部で管理する必
467要がある.
468
469また,OMIT_STKMPUINFOBを定義した場合,ジェネレータテンプレートファイル
470から参ç…
471§ã™ã‚‹target_def.csv(または,同等の役割を持つファイル)からTINIB
472関連のSTKMPUINFOB生成情
473報を削除することをお勧め.削除しない場合は,
474TINIB関連のSTKMPUINFOB情
475報定義は,無意味値となるため,使用してはいけな
476い.
477
478STKMPUINFOB管理する情
479報に関しては,「6.11.1 スタックのMPU設定情
480報ブロ
481ック(STKMPUINFOB)」を参ç…
482§ï¼Ž
483
484(6-5-1-6) OMIT_OSAPMPUINFOB(オプション)
485(6-5-1-7) OSAPMPUINFOB(オプション)
486
487MPU情
488報はターゲット依存なので,OSアプリケーション初期化ブロック(OSAPINIB)
489にå…
490¥ã‚ŒãŸããªã„場合は,OMIT_OSAPMPUINFOBをマクロ定義し,OSAPINIB中から
491OSAPMPUINFOBを外すことができる.
492
493OMIT_OSAPMPUINFOBをマクロ定義すると,OSAPINIB中にMPU設定情
494報が含まれな
495くなるため,それに代わる情
496報は,ターゲット依存部で管理する必
497要がある.
498
499また,OMIT_OSAPMPUINFOBを定義した場合,ジェネレータテンプレートファイル
500から参ç…
501§ã™ã‚‹target_def.csv(または,同等の役割を持つファイル)から
502OSAPINIB関連のOSAPMPUINFOB生成情
503報を削除する必
504要がある.
505
506OSAPMPUINFOB管理する情
507報に関しては,「6.11.2 OSAP固有MPU設定情
508報ブロック
509(OSAPMPUINFOB)」を参ç…
510§ï¼Ž
511
5126.5.2 ディスパッチャ本体
513
514ディスパッチャ本体(dispatcher)は,ターゲット非依存部から直接呼び出さ
515れることはなく,カーネルのターゲット依存部の内
516部からのみ呼び出される.
517dispatcherは,タスクコンテキスト・OS割込み禁止状æ…
518‹ãƒ»å‰²è¾¼ã¿å„ªå…
519ˆåº¦ãƒžã‚¹ã‚¯
520å…
521¨è§£é™¤çŠ¶æ…
522‹ã‹ã‚‰å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
523
524dispatcherの処理内
525容は次の通り.
526
527----------------------------------------
528void
529dispatcher(void)
530{
531#ifdef CFG_USE_STACKMONITORING
532 スタックポインタ方式によるスタックモニタリング
533 マジックナンバー方式によるスタックモニタリング
534#endif /* CFG_USE_STACKMONITORING */
535
536#ifdef CFG_USE_POSTTASKHOOK
537 if (PostTaskHook != 0) {
538 非タスクコンテキストに切り替える
539 call_posttaskhook();
540 コンテキストを戻す
541 }
542#endif /* CFG_USE_POSTTASKHOOK */
543
544 dispatcher_0:
545#ifdef LOG_DSP_ENTER
546 log_dsp_enter(p_runtsk);
547#endif /* LOG_DSP_ENTER */
548
549 if (callevel_stat & TSYS_DISALLINT) {
550 callevel_stat &= ~TSYS_DISALLINT;
551 å…
552¨å‰²è¾¼ã¿ç¦æ­¢ã‚’解除する
553 }
554
555 dispatcher_1:
556 while ((p_runtsk = p_schedtsk) == NULL) {
557 割込みを許可したらOS割込み禁止解除状æ…
558‹ã«ãªã‚‹ã‚ˆã†æº–備する
559 非タスクコンテキストに切り換える
560 OS割込み禁止を解除し,割込み発生を待
561つ … (*1)
562 OS割込み禁止状æ…
563‹ã«æˆ»ã™ … (*2)
564 タスクコンテキストに戻す
565 }
566 p_runosap = p_runtsk->p_osapinib … (*3)
567 自タスク(p_runtsk)のTCBからスタックポインタを復帰する
568
569 /* タスクディスパッチ時にMPU情
570報も切替える */
571 if(タスクディスパッチする && p_runosapは非信頼OSアプリケーション){
572 スタック情
573報のMPU設定 … (*4)
574 if(p_runosapが切替えた){
575 OSアプリケーション情
576報のMPU設定 … (*5)
577 }
578 }
579
580#ifdef LOG_DSP_LEAVE
581 log_dsp_leave(p_runtsk);
582#endif /* LOG_DSP_LEAVE */
583
584#ifdef CFG_USE_PRETASKHOOK
585 if (PreTaskHook != 0) {
586 非タスクコンテキストに切り替える
587 call_pretaskhook();
588 タスクコンテキストに戻す
589 }
590#endif /* CFG_USE_PRETASKHOOK */
591
592 自タスクのTCBから実行再開番地を復帰し,そこへ分岐する
593}
594----------------------------------------
595
596割込み発生を待
597つ間に非タスクコンテキストに切り換えるのは,この間に実行
598される割込みハンドラ内
599で,タスクディスパッチをしないようにするためであ
600る.この時,割込みハンドラが,非タスクコンテキスト用のスタックを使うよ
601うにしなければならない.通常は,非タスクコンテキストに切り換える際に非
602タスクコンテキスト用のスタックに切り換え,タスクコンテキストに戻す際に
603å…
604ƒã®ã‚¹ã‚¿ãƒƒã‚¯ã«åˆ‡ã‚Šæ›ãˆã‚‹ï¼Ž
605
606ターゲットによっては(特に,シミュレーション環境の場合),強制的に非タ
607スクコンテキストに切り換えることが難しい場合がある.その場合には,この
608間に実行される割込みハンドラ内
609でタスクディスパッチをしないような仕組み
610を実装
611することで,非タスクコンテキストへの切換えを省略することができる.
612
613(*1)において,割込みを許可する処理と,割込み発生を待
614つ処理とは,不可分
615に行なう必
616要がある.これを不可分に行なわない場合,割込みを許可した直後
617に割込みがå…
618¥ã‚Šï¼Œãã®ä¸­ã§ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡Œå¯èƒ½çŠ¶æ…
619‹ã«ãªã‚‹ã¨ï¼Œå®Ÿè¡Œã™ã¹ãã‚¿ã‚¹ã‚¯
620があるにもかかわらずプロセッサが割込み待
621ちになってしまう.
622
623また,(*1)において,割込み発生を待
624つ命令が用意されていない場合や,それ
625を発行するのが不都合な場合には,割込みをすべて許可して割込みを受け付け
626られる状æ…
627‹ã«ãªã£ãŸå¾Œã«ï¼Œå‰²è¾¼ã¿ç™ºç”Ÿã‚’å¾…
628たずに次に進んでもよい.この場合,
629whileループによって,割込み発生を待
630つことになる.
631
632OS割込み禁止を解除するための情
633報(例えば,OS割込み禁止前の割込み優å…
634ˆåº¦
635マスク)を変数に保持している場合には,(*2)でOS割込み禁止状æ…
636‹ã«æˆ»ã™éš›ã«ï¼Œ
637その変数の値もå…
638ƒã«æˆ»ã£ã¦ã„ã‚‹å¿…
639要がある.特に,その変数が,割込み待
640ちの
641間に実行した割込みハンドラ内
642で書き換えられる場合は,å…
643ƒã®å€¤ã«æˆ»ã™ã“とが
644必
645要である.
646
647割込み待
648ちの間は,p_runtskをNULL(=0)に設定しなければならない(上の
649処理内
650容をそのまま実装
651すればこうなる).このように設定しないと,割込み
652ハンドラからGetTaskIDを呼び出した際の動作が仕様に合致しなくなる.
653
654(*3)のp_runosapは,(p_runtskに相当) 現在 RUNNING のタスクが所属するOS
655アプリケーションを示すグローバル変数である.
656
657メモリ保護機能において,ディスパッチする時に,(*4)(*5)では,MPUに情
658報を
659設定する.また,(*5)のOSアプリケーション情
660報のMPU設定において,OSアプリ
661ケーションのプライベート領域は,現在のOSアプリケーションと切替えå…
662ˆã®OS
663アプリケーションが同じである場合,情
664報が同じなので再設定しない.
665
666タスクディスパッチによるタスク切り替え前に,CFG_USE_POSTTASKHOOK定義さ
667れ,ユーザがポストタスクフックを定義した場合(PostTaskHook != NULL),
668ポストタスクフック呼び出しインターフェース(call_posttaskhook)を呼出
669す必
670要がある.
671その一方,タスクディスパッチによるタスク切り替え後に,
672CFG_USE_PRETASKHOOK定義され,ユーザがプレタスクフックを定義した場合
673(PreTaskHook != NULL),プレタスクフック呼び出しインターフェース
674(call_pretaskhook)を呼出す必
675要がある.
676そこで,アセンブリ言語で記述されているディスパッチャ処理中にプレ/ポス
677トタスクフックの呼び出しを埋め込む.標準的なプレ/ポストタスクフックが
678C言語で記述されていると想定して,それを呼び出すようにコーディングする.
679
680dispatcherをアセンブリ言語で記述する場合には,トレースログ取得処理は,
681「6.2 トレースログ機能への対応」の節で記述した方法でコーディングするこ
682と.なお,log_dsp_enterは切換え前のタスクのスタックで,log_dsp_leave
683は切換え後のタスクのスタックで実行する.
684
6856.5.3 タスクコンテキストからのディスパッチ
686
687ATK2-SC1から変更なし.
688
6896.5.4 ディスパッチャの動作開始
690
691ATK2-SC1から変更なし.
692
6936.5.5 現在のコンテキストを捨ててディスパッチ
694
695(6-5-5-2) void exit_and_dispatch_nohook(void)
696
697現在のコンテキストを捨てて,ポストフック呼出さないディスパッチ
698(exit_and_dispatch_nohook)は,自タスクを強制終了させる処理関数から呼
699び出される.exit_and_dispatch_nohookは,リターンすることのない関数であ
700る.
701
702exit_and_dispatch_nohookは,タスクコンテキスト・OS割込み禁止状æ…
703‹ãƒ»å‰²è¾¼
704み優å…
705ˆåº¦ãƒžã‚¹ã‚¯å…
706¨è§£é™¤çŠ¶æ…
707‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
708
709exit_and_dispatch_nohookとexit_and_dispatchは,ポストタスクフック呼ぶ
710かどうか以外,同じである(タスク強制終了なので,p_runtsk=NULLとして実
711行).
712
713exit_and_dispatch_nohookの処理内
714容は次の通り.
715
716----------------------------------------
717void
718exit_and_dispatch_nohook(void)
719{
720 dispatcher_0に分岐する
721}
722----------------------------------------
723
7246.5.6 タスクの起動処理
725
726(6-5-6-1) void activate_context(TCB *p_tcb)
727
728タスクの起動処理(activate_context)は,タスクを休止状æ…
729‹ã‹ã‚‰å®Ÿè¡Œã§ãã‚‹
730状æ…
731‹ã«ã™ã‚‹æ™‚に呼ばれ,p_tcbで指定されたタスク(対象タスク)のTCB中のス
732タックポインタをタスクのシステムスタックに初期化する.また,p_tcbが信
733頼OSアプリケーションに所属する場合は,実行再開番地を信頼タスク開始時処
734理(start_stask_r)に設定し,p_tcbが非信頼OSアプリケーションに所属する
735場合は,実行再開番地を非信頼タスク開始時処理(start_utask_r)に設定す
736る.この時点では,後述する理由で,対象タスクのスタック領域を使ってはな
737らない.
738
739対象タスクが最初に実行される時には,対象タスクを自タスクとして,実行再
740開番地として登録したstart_utask_r(信頼タスクの場合はstart_stask_r)に
741分岐してくる.start_utask_r(信頼タスクの場合はstart_stask_r)には,
742dispatcherのみから分岐し,その時の状æ…
743‹ã¯ï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒ»OS割込み
744禁止状æ…
745‹ãƒ»å‰²è¾¼ã¿å„ªå…
746ˆåº¦ãƒžã‚¹ã‚¯å…
747¨è§£é™¤çŠ¶æ…
748‹ã§ã‚る.
749
750start_stask_rは,OS割込み禁止状æ…
751‹ã‚’解除した後,タスクの起動番地を呼び
752出す.
753さらに,タスクの起動番地から戻ってきた場合には,exit_taskを呼び出す.
754
755start_utask_rは,OS割込み禁止状æ…
756‹ã‚’解除した後,CPUを非特権モードへ設定
757する同時にタスクの起動番地を呼び出す.さらに,タスクの起動番地から戻っ
758てきた場合には,exit_utaskを呼び出す.
759
760activate_contextとstart_rの処理内
761容は次の通り.
762
763----------------------------------------
764void
765activate_context(TCB *p_tcb)
766{
767 指定されたタスク(p_tcb)のTCB中のスタックポインタを初期化する
768 if (指定されたタスクが非信頼タスク) {
769 start_utask_rを,実行再開番地として自タスクのTCBに保存する … (*a)
770 }
771 else {
772 start_stask_rを,実行再開番地として自タスクのTCBに保存する … (*a)
773 }
774 return;
775
776 start_stask_r:
777 呼出し関数をexit_taskとして設定する … (*c)
778 特権モードで動作するよう準備
779 start_rに分岐する
780
781 start_utask_r:
782 呼出し関数をexit_utaskとして設定する … (*c)
783 非特権モードで動作するよう準備
784 スタックをシステムスタックからユーザスタックに切り替える
785 start_rに分岐する
786
787 start_r:
788#ifdef CFG_USE_STACKMONITORING
789 タスク起動毎にタスクのシステムスタックのマジックナンバーを初期化する … (*d)
790#endif /* CFG_USE_STACKMONITORING */
791 p_runtsk->curpri = p_runtsk->p_tinib->exepri;
792 自タスクの起動番地へ分岐するように準備する
793 OS割込み禁止解除状æ…
794‹ã«ã™ã‚‹
795 動作モード設定する同時に,
796 自タスク(p_runtsk)の起動番地を呼び出す … (*e)
797}
798----------------------------------------
799
800(*c)で自タスクの起動番地を呼び出す時の返り番地をexit_utask(信頼タスク
801の場合exit_task)の番地としておき,タスクが不正終了した場合,保護処理を
802行う.
803
804ここで,タスクの起動処理において対象タスクのスタック領域を使ってはなら
805ない理由は,次の通り.複数の基本タスクがスタック領域をå…
806±æœ‰ã—ている場合
807に,タスクの起動時点では,そのタスクとスタック領域をå…
808±æœ‰ã—ているタスク
809が,スタック領域を使用している可能性があるためである.
810
811このポーティングガイドでは,タスクの実行再開番地をTCBに保存している
812(*a).これをスタックに保存する方法も考えられるが,タスクの起動処理でス
813タック領域が使えないことから,タスクの起動処理だけは例外扱いしなければ
814ならない.例えば,タスクの起動処理においてはTCB中のスタックポインタを
815特殊な値(例えば0)に設定しておき,ディスパッチャ本体でTCB中のスタック
816ポインタがその値の場合にはstart_utask_r(信頼の場合は,start_stask_r)
817に分岐させ,start_utask_r(信頼の場合は,start_stask_r)においてスタッ
818クポインタを初期化する方法が考えられる.
819
820(*d)において,SC3ではタスク強制終了があるので,タスク起動毎にマジック
821ナンバーを初期化する.
822
823(*e)において,CPU動作モードとタスクの呼出しは,同時に行う必
824要がある.
825start_utask_r(信頼の場合は,start_stask_r)は,特権モードで呼出される
826が,信頼OSアプリケーションに所属するタスクの場合,特権モードで,非信頼
827OSアプリケーションに所属するタスクは,非特権モードで実行する必
828要がある
829.例外/割込みからのリターン命令を使用するのが1つの方法である.
830
8316.6 割込みハンドラ
832
8336.6.1 割込みハンドラの出å…
834¥å£å‡¦ç†
835
836C2ISRの割込みの出å…
837¥å£å‡¦ç†ã®æ–¹æ³•ã¯ï¼Œãƒ—ロセッサによって大きく異なるが,
838ATK2-SC3においては,おおよその処理内
839容は次の通り.
840
841----------------------------------------
842void
843<割込みの出å…
844¥å£å‡¦ç†>(void)
845{
846 if (非特権モードで割込み発生) {
847 スタックを実行状æ…
848‹ã®ã‚¿ã‚¹ã‚¯ã®ã‚·ã‚¹ãƒ†ãƒ ã‚¹ã‚¿ãƒƒã‚¯ã«åˆ‡ã‚Šæ›ãˆã‚‹
849 }
850 少なくともOS割込みを禁止した状æ…
851‹ã«ã™ã‚‹ … (*f)
852 スクラッチレジスタをスタックに保存する
853 if (タスクコンテキストで割込み発生) {
854 スタックを非タスクコンテキスト用のスタックに切り換え,
855 非タスクコンテキストに切り換える
856 }
857 割込み優å…
858ˆåº¦ãƒžã‚¹ã‚¯ã‚’,受け付けた割込み要求の割込優å…
859ˆåº¦ã«è¨­å®šã—,
860 OS割込み禁止解除状æ…
861‹ã«ã™ã‚‹ï¼ˆå—け付けた割込みよりも
862 優å…
863ˆåº¦ã®é«˜ã„割込みを受け付けるようにする)… (*i)
864
865#ifdef CFG_USE_STACKMONITORING
866 if (タスクコンテキストで割込み発生) {
867 スタックポインタチェック方式でタスクシステムスタックの
868 スタックモニタリングを行う
869 マジックナンバーチェック方式でタスクシステムスタックの
870 スタックモニタリングを行う
871 }
872 else {
873 スタック残量チェック方式でC2ISR用スタックのスタックモニタ
874 リングを行う
875 マジックナンバーチェック方式でC2ISR用スタックのスタックモニタ
876 リングを行う
877 }
878#endif /* CFG_USE_STACKMONITORING */
879
880 callevel_statを保存
881 callevel_statに割込みビットを立てる
882 run_trustedを保存
883 p_runosapを保存
884 p_runisrを保存
885 p_runisrを実行するC2ISRに対応するisrcb_tableの要素に設定する
886 p_runosapを実行するC2ISRが所属するOSアプリケーションに設定する
887
888 C2ISRを呼び出す
889
890#ifdef CFG_USE_STACKMONITORING
891 マジックナンバーチェック方式でC2ISR用スタックのスタックモニタリン
892 グを行う
893#endif /* CFG_USE_STACKMONITORING */
894
895 exit_isr2(); /* C2ISRの不正終了チェック */
896
897 p_runisrを復帰
898 p_runosapを復帰
899 run_trustedを復帰
900 callevel_statを復帰
901
902 ret_int:
903 if (タスクコンテキストで割込み発生) {
904 (少なくとも)OS割込みを禁止した状æ…
905‹ã«ã™ã‚‹
906 スタックをタスク用のスタックに戻し,タスクコンテキストに切り換える
907 スタックポインタを復帰
908 if (p_runtsk == NULL) {
909 OS割込み禁止状æ…
910‹ã«ã™ã‚‹ … (*e)
911 割込み優å…
912ˆåº¦ãƒžã‚¹ã‚¯ã‚’,å…
913¨è§£é™¤çŠ¶æ…
914‹ï¼ˆTIPM_ENAALL)に設定する
915 … (*h)
916 dispatcherに分岐する
917 }
918 else if (p_runtsk != p_schedtsk) {
919 OS割込み禁止状æ…
920‹ã«ã™ã‚‹ … (*e)
921 割込み優å…
922ˆåº¦ãƒžã‚¹ã‚¯ã‚’,å…
923¨è§£é™¤çŠ¶æ…
924‹ï¼ˆTIPM_ENAALL)に設定する
925 … (*h)
926 スクラッチレジスタを除くすべてのレジスタをスタックに保存す
927 る
928 スタックポインタを自タスク(p_runtsk)のTCBに保存する
929 ret_int_rを,実行再開番地として自タスクのTCBに保存する
930
931 dispatcherに分岐する
932
933 ret_int_r:
934 スクラッチレジスタを除くすべてのレジスタをスタックから復帰
935 する
936 }
937 }
938 割込み処理からのリターン後に,割込み優å…
939ˆåº¦ãƒžã‚¹ã‚¯ãŒ
940 割込み処理前の値に戻るように準備する
941 割込み処理からのリターン後に,OS割込み禁止解除状æ…
942‹ã«æˆ»ã‚‹ã‚ˆã†ã«æº–å‚™
943 する
944 スクラッチレジスタをスタックから復帰する
945 割込み処理からのリターン
946}
947----------------------------------------
948
9496.6.2 割込み要求ラインの属性の設定
950
951ATK2-SC1から変更なし.
952
9536.6.3 割込み管理機能の初期化処理の変更
954
955(6-6-3-9) intatr:割込み属性
956
9576.6.4 デフォルトのC2ISR
958
959ATK2-SC1から変更なし.
960
9616.6.5 カーネル管理外の割込み
962
963ATK2-SC1から変更なし.
964
9656.6.6 DisableAllInterrupts/EnableAllInterruptsの処理内
966容の変更
967
968ATK2-SC1から変更なし.
969
9706.6.7 割込み禁止解除
971
972(6-6-7-1) LOCAL_INLINE void x_clear_nested_os_int(void)
973
9746.7 スタックモニタリング
975
976SC3でもスタックモニタリング機能を実装
977する.非信頼タスクのユーザスタッ
978クスタックは,メモリ保護ユニット(MPU)より保護されるが,以下のスタッ
979クをスタックモニタリング機能で保護する.
980(1)非信頼タスクのシステムスタック
981(2)信頼タスクのシステムスタック
982(3)システムスタック
983(4)信頼関数実行時のスタック
984
9856.7.1 ディスパッチャとC2ISRの出å…
986¥å£å‡¦ç†ã§ã®ã‚¹ã‚¿ãƒƒã‚¯ãƒ¢ãƒ‹ã‚¿ãƒªãƒ³ã‚°
987
988ディスパッチャとC2ISRの出å…
989¥å£å‡¦ç†ã§ã®ã‚¹ã‚¿ãƒƒã‚¯ãƒ¢ãƒ‹ã‚¿ãƒªãƒ³ã‚°ã§ã‚¹ã‚¿ãƒƒã‚¯ã‚ª
990ーバーフローが検出された場合の処理は以下の通り.ATK2-SC3ではスタックオ
991ーバーフロー検出時のcall_protectionhook_mainからはリターンする可能性が
992ある.
993
994----------------------------------------
995#ifdef CFG_USE_STACKMONITORING
996void
997スタックオーバーフロー検出処理(void)
998{
999 uint32 ret;
1000
1001 if (C2ISRの出å…
1002¥å£å‡¦ç†ã§ã®ã‚¹ã‚¿ãƒƒã‚¯ãƒ¢ãƒ‹ã‚¿ãƒªãƒ³ã‚°) {
1003 OS割込み禁止状æ…
1004‹ã«ã™ã‚‹
1005 ret = E_OS_STACKFAULT;
1006 }
1007 if (タスクコンテキスト) {
1008 非タスクコンテキストに切り替える
1009 ret = E_OS_STACKFAULT;
1010 }
1011 pre_protection_supervised = TRUE;
1012 call_protectionhook_main(ret);
1013 /* ここには戻ってこない */
1014}
1015#endif /* CFG_USE_STACKMONITORING */
1016----------------------------------------
1017
10186.7.2 信頼関数実行の出口処理でのスタックモニタリング
1019
1020一方,信頼関数実行の出口処理でのスタックモニタリングでスタックオーバー
1021フローが検出された場合の処理は以下の通り.ATK2-SC3ではスタックオーバー
1022フロー検出時のcall_protectionhook_mainからはリターンしない.
1023
1024----------------------------------------
1025StatusType
1026CallTrustedFunction(...)
1027{
1028 ...
1029
1030 信頼関数実行
1031
1032#ifdef CFG_USE_STACKMONITORING
1033 if (C2ISR処理レベル) {
1034 if (システムスタックマジックナンバーチェックNG) {
1035 OS割込み禁止状æ…
1036‹ã«ã™ã‚‹
1037 pre_protection_supervised = TRUE;
1038 call_protectionhk_main(E_OS_STACKFAULT);
1039 /* ここには戻ってこない */
1040 }
1041 }
1042 else {
1043 if (実行中タスクシステムスタックマジックナンバーチェックNG) {
1044 OS割込み禁止状æ…
1045‹ã«ã™ã‚‹
1046 pre_protection_supervised = TRUE;
1047 call_protectionhk_main(E_OS_STACKFAULT);
1048 /* ここには戻ってこない */
1049 }
1050 }
1051#endif /* CFG_USE_STACKMONITORING */
1052
1053 ...
1054}
1055----------------------------------------
1056
1057信頼関数実行前に,信頼関数使用するスタックの量と,使用するスタックの空
1058き量をç…
1059§åˆã—ている.
1060
1061信頼関数実行後使用したスタックに対してマジックナンバー方式のみ,チェッ
1062クしている理由は,チェックする時点で,スタックポインタは,信頼関数実行
1063する前の状æ…
1064‹ã«æˆ»ã£ãŸã“とである.
1065
1066
10676.8 CPU例外ハンドラ
1068
1069CPU例外の出å…
1070¥å£å‡¦ç†ã®æ–¹æ³•ã¯ãƒ—ロセッサによって大きく異なるが,おおよそ
1071の処理内
1072容は次の通り.
1073
1074----------------------------------------
1075void
1076<CPU例外の出å…
1077¥å£å‡¦ç†>(void)
1078{
1079 if (非特権モードで発生 && フック処理中で発生) {
1080 if (CPU例外発生が未ネスト && C1ISR処理中以外でCPU例外発生) {
1081 スタックを非タスクコンテキスト用のスタックに切り換え準備
1082 }
1083 }
1084
1085 スクラッチレジスタ及びスタックポインタを非タスクコンテキストスタッ
1086 クに保存する
1087
1088 if (OS割込み禁止状æ…
1089‹ã§ãªã„ &&
1090 C1ISR実行中のCPU例外でない && å…
1091¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
1092‹ã§ãªã„){
1093 OS割込み禁止状æ…
1094‹ã«ã™ã‚‹
1095 }
1096
1097 ターゲット依存のCPU例外情
1098報を取得する … (*h)
1099
1100 if (å…
1101¨å‰²è¾¼ã¿ç¦æ­¢è§£é™¤çŠ¶æ…
1102‹ã§CPU例外発生) {
1103 å…
1104¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
1105‹ã‚’解除する … (*i)
1106 }
1107
1108 ターゲット依存のCPU例外情
1109報を退避する … (*j)
1110 ターゲット依存のCPU例外情
1111報を保存する
1112
1113 if (例外要因番号 > TNUM_EXCH) {
1114 エラーコード = E_OS_PROTECTION_EXCEPTIONとする
1115 }
1116 else {
1117 例外コード変換テーブルからエラーコードを取得する
1118 }
1119
1120 if (例外発生時が非特権モード) {
1121 pre_protection_supervised = FALSE;
1122 }
1123 else {
1124 pre_protection_supervised = TRUE;
1125 }
1126
1127 call_protectionhook_main(エラーコード);
1128
1129 ターゲット依存のCPU例外情
1130報を復帰する
1131
1132 ret_exc:
1133 割込み・例外のネスト回数(except_nest_cnt)をディクリメントする
1134
1135 CPU例外処理からのリターン後に,CPU例外発生前の割込み禁止状æ…
1136‹ã«æˆ»ã‚‹
1137 ように準備する … (*k)
1138
1139 CPU例外処理中に変更したå…
1140¨å‰²è¾¼ã¿çŠ¶æ…
1141‹ã‚’リターン後にも反映
1142 するため,準備する … (*l)
1143
1144 å…
1145¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
1146‹ã«ã™ã‚‹
1147
1148 ret_int_1:
1149 スクラッチレジスタをスタックから復帰する
1150 退避したスタックポインタを復帰する
1151 CPU例外処理からのリターン
1152}
1153----------------------------------------
1154
1155å…
1156¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
1157‹ã§CPU例外が発生した場合は,å…
1158¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
1159‹ã§ãƒ—ロテク
1160ションフックを呼び出す.
1161
1162割込み応答性向上するには,å…
1163¨å‰²è¾¼ã¿ç¦æ­¢ã—ている状æ…
1164‹ã®å‡¦ç†ã‚’なるべく少な
1165くする必
1166要があるので,例外発生要因情
1167報の保存は,(*h)ではなく,(*i)処理
1168の後にすべきである.上記の例では,(*j)で保存している.
1169
1170プロテクションフックを実行する際に経由する部分では,CPU例外が起こる可
1171能性を極力減らすとともに,CPU例外を起こす可能性がある場合(例えば,ス
1172クラッチレジスタをスタックに保存する時に,バスエラーなどのCPU例外が発
1173生する可能性が考えられる)には,その可能性をターゲット依存部のユーザー
1174ズマニュアルに記載しなければならない.
1175
1176ret_exc以降の処理は,割込みの出å…
1177¥å£å‡¦ç†ã®ret_int以降の処理とほぼ同じで
1178あるため,ターゲットによっては,å…
1179±é€šã®ãƒ«ãƒ¼ãƒãƒ³ã‚’用いることができる可能
1180性がある.
1181
1182CPU例外処理中に,å…
1183¨å‰²è¾¼ã¿ç¦æ­¢ã—た場合,CPU例外戻った側に反映しなければ
1184ならないので,(*l)で変更したå…
1185¨å‰²è¾¼ã¿çŠ¶æ…
1186‹ã‚’リターン後にも反映するため,
1187工夫する.
1188
11896.9 ソフトウェア割込みハンドラ
1190
1191ソフトウェア割込みハンドラは,SC3よりシステムサービスのエントリルーチ
1192ンとして機能する.
1193ソフトウェア割込みハンドラには,システムサービスの機能コード,システム
1194サービスのパラメータをå…
1195¥åŠ›å€¤ã¨ã—て,渡す.システムサービス実行の戻り値
1196を呼出し側に返す.
1197
1198ソフトウェア割込み本体は,以下の処理を行う.
1199(a) 呼出しå…
1200ƒã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ä¿å­˜ï¼ˆãƒªã‚¿ãƒ¼ãƒ³æ™‚の復帰に使用)
1201
1202(b) スタックの切替え(ユーザスタックからシステムスタックへ切替え)
1203呼出å…
1204ƒãŒç‰¹æ¨©ãƒ¢ãƒ¼ãƒ‰ã®å ´åˆã¯åˆ‡æ›¿ãˆãªã„(すでにシステムスタックか割込みス
1205タックを使用しているため切替え不要).
1206
1207(c) カーネルサービスの特定
1208呼出しå…
1209ƒã‹ã‚‰æ¸¡ã•ã‚ŒãŸã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スの機能コードを利用して,システムサ
1210ービスのå…
1211ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’特定する.
1212
1213(d)システムサービス本体の呼出し
1214上記(c)より取得したシステムサービスを呼出し, システムサービスの戻り値
1215を呼出しå…
1216ƒã«è¿”す準備を行う.
1217
1218(e) ソフトウェア割込みルーチンの終了処理
1219上記(a)で保存した呼出しå…
1220ƒã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã‚’復帰し,呼出しå…
1221ƒã¸ãƒªã‚¿ãƒ¼ãƒ³ã™
1222る.
1223
1224ソフトウェア割込みによるシステムサービス呼出しのおおよその処理内
1225容は次
1226の通り.
1227
1228----------------------------------------
1229uint32
1230trap_handler(FunctionCodeType fncd, システムサービスパラメータリスト)
1231{
1232 uint32 retval;
1233
1234 if (非特権モードからの呼び出し) {
1235 if (非信頼フック実行中からの呼び出し) {
1236 スタックを非信頼フック実行前のスタックに切換える … (*a)
1237 }
1238 else {
1239 スタックを実行状æ…
1240‹ã®ã‚¿ã‚¹ã‚¯ã®ã‚·ã‚¹ãƒ†ãƒ ã‚¹ã‚¿ãƒƒã‚¯ã«åˆ‡æ›ãˆã‚‹
1241 }
1242 }
1243 呼出しå…
1244ƒã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®ä¿å­˜
1245
1246 if (fncd > TMAX_SVCID) {
1247 /*
1248 * システムサービス不正呼出しの場合
1249 */
1250 no_support_service();
1251 }
1252 else {
1253 カーネルサービスのå…
1254ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ç‰¹å®šï¼ˆsvc_table[fncd])
1255 ソフトウェア割込みによりシステム状æ…
1256‹ãŒå¤‰åŒ–する場合には,
1257 ソフトウェア割込み前のシステム状æ…
1258‹ã«æˆ»ã™ … (*b)
1259 システムサービス実行後の戻り番地(trp_SVC_ret)指定
1260 システムサービスの実行:
1261 retval = (*(svc_table[fncd]))(システムサービスパラメータリスト);
1262 }
1263
1264
1265 trp_SVC_ret:
1266 ソフトウェア割込みからリターン後のシステム状æ…
1267‹ãŒï¼Œ
1268 この時点でのシステム状æ…
1269‹ã«ãªã‚‹ã‚ˆã†æº–備する … (*c)
1270 å…
1271¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
1272‹ã«ã™ã‚‹
1273
1274 /* 性能測定用 キャッシュパージ処理 */
1275#ifdef PERF_TEST
1276 if (キャッシュパージフラグ != 0) {
1277 命令キャッシュ領域クリア
1278 }
1279#endif /* PERF_TEST */
1280
1281 呼出しå…
1282ƒã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã®å¾©å¸°
1283 return(retval);
1284}
1285----------------------------------------
1286
1287(*a)において,非信頼のフックルーチン実行中は,スタックポインタ保持変数
1288(hook_savedsp)が非信頼のフックルーチンを実行前のスタックになっている
1289ので,その続きからスタックを使う.
1290
1291(*b)において,ソフトウェア割込みより,システム状æ…
1292‹ãŒå¤‰åŒ–した場合,ソフ
1293トウェア発生前の状æ…
1294‹ã«æˆ»ã—て,システムサービスを呼出す.要は,システム
1295サービスは,ソフトウェア割込み使用かどうかに関わらずシステム呼出し時点
1296の状æ…
1297‹ã§å®Ÿè¡Œã™ã‚‹ï¼Ž
1298
1299(*c)において,システムサービス処理中に,変更したシステム状æ…
1300‹(例えば,
1301å…
1302¨å‰²è¾¼ã¿ç¦æ­¢ãªã©ï¼‰ã¯ï¼Œã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢å‰²è¾¼ã¿ãƒªã‚¿ãƒ¼ãƒ³å¾Œã«ã‚‚反映する.
1303
1304svc_tableは,システムサービステーブルと呼び,ソフトウェア割込みによる
1305実行したいシステムサービスのå…
1306ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒç™»éŒ²ã•ã‚Œã‚‹ï¼Žã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢å‰²è¾¼
1307みによるシステムサービス指定する場合は,システムサービスコードを用い
1308る.
1309
1310no_support_service()関数は,不正な機能コードを指定して,システムサービ
1311ス発行時の処理であり,エラーコードにE_OS_SERVICEIDを設定し,サービスID
1312にOSServiceId_INVALIDを設定して,エラーフックを呼出す.
1313
13146.10 信頼OSAPと非信頼OSAPからのシステムサービス呼出し
1315
1316SC3のメモリ保護機能を実現するため,プロセッサは少なくとも特権モードと
1317非特権モードをサポートする必
1318要がある.カーネル及び信頼OSアプリケーショ
1319ンに所属する処理単位は特権モードで実行し,メモリ保護機構(MPU)が働か
1320ない(※1).非信頼OSアプリケーションに所属する処理単位は非特権モード
1321で実行し,メモリ保護機構(MPU)が働く.また,プロセッサは,ソフトウェ
1322ア割込みなど非特権モードから特権モードへ遷移できる機能(命令)を有する.
1323
1324信頼OSアプリケーションは,システムサービスを直接関数呼び出しできるが,
1325非信頼OSアプリケーションから,システムサービスを呼出すため,ソフトウェ
1326ア割込みによる呼出し機能をターゲット依存部でカーネルのサービスコールの
1327インタフェースを実装
1328する.
1329
13306.10.1 システムサービス呼出しの定義
1331
1332(1) システムサービスの関数呼出しの定義(svc_funcall.h):
1333
1334----------------------------------------
1335#define SVC_CALL(system_service) _kernel_ ## system_service
1336
1337#ifdef TOPPERS_SVC_FUNCCALL
1338#define StartOS _kernel_StartOS
1339#define ActivateTask _kernel_ActivateTask
1340...
1341#endif
1342----------------------------------------
1343
1344(2) システムサービスのソフトウェア割込み呼出しの定義(tool_svc.h):
1345
1346----------------------------------------
1347#define SVC_TRAP(system_service) _trap_ ## system_service
1348
1349#ifndef TOPPERS_SVC_FUNCCALL
1350#define StartOS _trap_StartOS
1351#define ActivateTask _trap_ActivateTask
1352...
1353#endif
1354
1355void
1356_trap_StartOS(AppModeType Mode)
1357{
1358 CAL_SVC_1N(void, TFN_STARTOS, AppModeType, Mode);
1359}
1360
1361StatusType
1362_trap_ActivateTask(TaskType TaskID)
1363{
1364 CAL_SVC_1M(StatusType, TFN_ACTIVATETASK, TaskType, TaskID);
1365}
1366----------------------------------------
1367
1368DisableAllInterruptsに関しては,非信頼OSAPから呼び出せない仕様である.
1369よって,オーバヘッド短縮もå…
1370¼ã­ã¦ï¼Œã‚·ã‚¹ãƒ†ãƒ ã‚µãƒ¼ãƒ“スを直接呼び出すように実装
1371する.
1372----------------------------------------
1373#define DisableAllInterrupts _kernel_DisableAllInterrupts
1374----------------------------------------
1375
1376TFN_STARTOSなどは,呼び出したいシステムサービスコードであり,システム
1377サービステーブル(svc_table)に登録したシステムサービスの添字である.
1378
1379(3) ソフトウェア割込み(例:trap)によるシステムサービス呼出し定義
1380 (prc_svc.h):
1381
1382----------------------------------------
1383#define CAL_SVC_1N(TYPE, FNCD, TYPE1, PAR1) \
1384 register FunctionCodeType input_fncd_r = (FNCD); \
1385 register TYPE1 input_param_r = (TYPE1) (PAR1); \
1386 register FunctionCodeType output_r; \
1387 Asm ( \
1388 "trap \n\t" \
1389 : input_fncd_r, input_param_r \
1390 : output_r \
1391 : "...", "memory" \
1392 ); \
1393----------------------------------------
1394
1395----------------------------------------
1396#define CAL_SVC_1M(TYPE, FNCD, TYPE1, PAR1) \
1397 register FunctionCodeType input_fncd_r = (FNCD); \
1398 register TYPE1 input_param_r = (TYPE1) (PAR1); \
1399 register FunctionCodeType ret_r; \
1400 register FunctionCodeType output_r; \
1401 Asm ( \
1402 "trap \n\t" \
1403 : input_fncd_r, input_param_r \
1404 : ret_r, output_r \
1405 : "...","memory" \
1406 ); \
1407 return ((TYPE) output_r);
1408----------------------------------------
1409
1410※GCCの拡張アセンブリ構文:
1411 asm(アセンブリテンプレート
1412 : 出力オペランド
1413 : å…
1414¥åŠ›ã‚ªãƒšãƒ©ãƒ³ãƒ‰
1415 : 破壊されるレジスタのリスト
1416 )
1417
1418上記マクロ関数定義時,以下のルールを従う.
1419マクロ名は,CAL_SVC_nxとし,nxは,意味を持つ.
1420n:パラメータ数
1421 範囲:0〜3(システムサービスのパラメータ数)
1422 ※ターゲット定義のシステムサービス追加した場合,その最大数に合わせ
1423 る
1424x:戻り値
1425 範囲:N(戻り値なし),M(戻り値あり)
1426
14276.10.2 信頼OSAPからのシステムサービス呼出し
1428
1429基本的にシステムサービスの呼出しは,ソフトウェア割込み経由で呼出しが基
1430本であるが,システムサービス呼出しのオーバヘッドを削減するため,信頼OS
1431アプリケーションに所属する処理単位からシステムサービスを呼出す場合,シ
1432ステムサービスの呼出しは,(直接)関数呼出しも出来る.
1433
1434関数呼出しを指定するため,関数呼出しをしたいソースのå…
1435ˆé ­ã«ï¼Œä»¥ä¸‹ã®ãƒžã‚¯
1436ロを定義するか,SVC_CALL(system_service)より明示的に関数呼び出しのシス
1437テムサービス実行をするかが出来る.
1438
1439(6.10.2.1) TOPPERS_SVC_FUNCCALL
1440
1441このマクロをソースå…
1442ˆé ­å®šç¾©ã™ã‚‹ã“とで,ソースファイル内
1443のシステムサービ
1444スの呼出しは,_kernel_<system_service>に置換われ,関数呼出しとなる.
1445
14466.10.3 非信頼OSAPからのシステムサービス呼出し
1447
1448ソースのå…
1449ˆé ­ã«ï¼ŒTOPPERS_SVC_FUNCCALLマクロを定義していない場合,システ
1450ムサービスの実行は,ソフトウェア割込みよるシステムサービス実行となる.
1451また,SVC_TRAP(system_service)より明示的にソフトウェア割込みによるシス
1452テムサービス実行も出来る.
1453
14546.10.4 ターゲット依存システムサービスの追加
1455
1456ターゲット依存のシステムサービスを追加したい場合,ターゲット依存システ
1457ムサービステーブルテーブルは,以下のマクロを用いて定義する.
1458
1459(6.10.4.1) PRC_SVC_TABLE
1460(6.10.4.2) PRC_SVC_NUM
1461
1462ターゲット依存で,追加したいシステムサービスのå…
1463ˆé ­ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’
1464PRC_SVC_TABLEマクロの定義に追加し,システムサービス定義の数を
1465PRC_SVC_NUMマクロに定義することで,システムサービステーブル(svc_table)
1466に反映される.
1467
1468(6.10.4.3) OTHER_PRC_SVC_TABLE
1469
1470ターゲット依存で,追加したいシステムサービス関連マクロ(PRC_SVC_TABLE
1471とPRC_SVC_NUM)は,別のヘッダファイル(*.h)に定義されている場合,上記マ
1472クロOTHER_PRC_SVC_TABLEをインクルードファイル名に定義することが出来る.
1473
1474例:#define OTHER_PRC_SVC_TABLE target_svc_table_test.hを定義すること
1475で,prc_config.hに#include "target_svc_table_test.h"として展開され,
1476target_svc_table_test.hファイル定義しているPRC_SVC_TABLEとPRC_SVC_NUM
1477が有効となる.
1478
1479上記ソフトウェア割込みによるシステムサービス呼び出し関係のファイルの生
1480成は,utils/gensvc_atk(サービスコールインタフェース生成プログラム)に
1481よる自動生成が出来る.
1482
14836.11 メモリ保護機構(MPU)制御
1484
14856.11.1 スタックのMPU設定情
1486報ブロック(STKMPUINFOB)
1487
1488MPUによるスタック領域保護するため,MPUに設定する情
1489報を保持するブロック
1490をターゲット依存部に定義する.MPU設定情
1491報は,ターゲット依存であるが,
1492保持する情
1493報は,以下である.
1494
1495(6.11.1.1) 領域のå…
1496ˆé ­ç•ªåœ°
1497(6.11.1.2) 領域の終端番地(若しくは領域のサイズ)
1498
14996.11.2 OSAP固有MPU設定情
1500報ブロック(OSAPMPUINFOB)
1501
1502MPUによるOSAP固有領域保護するため,MPUに設定する情
1503報を保持するブロック
1504をターゲット依存部に定義する.MPU設定情
1505報は,ターゲット依存であるが,
1506保持する情
1507報は,以下である.
1508
1509(6.11.2.1) 領域のå…
1510ˆé ­ç•ªåœ°ï¼ˆè¤‡æ•°ã®å‘½ä»¤é ˜åŸŸãƒ»ãƒ‡ãƒ¼ã‚¿é ˜åŸŸï¼‰
1511(6.11.2.2) 領域の終端番地(複数の命令領域・データ領域)
1512(6.11.2.3) アクセスパターン(読み・書き・実行)(複数の命令領域・デー
1513 タ領域)
1514(6.11.2.4) 命令領域数
1515(6.11.2.5) データ領域数
1516
15176.11.3 MPU初期化処理
1518
1519MPU機能を有効するため,MPUの初期化を行う処理は,以下の通りである.
1520
1521----------------------------------------
1522void
1523prc_init_mpu(void)
1524{
1525
1526 現在MPUに設定している情
1527報の管理変数の初期化
1528
1529 /* MPU初期情
1530報を設定するため */
1531 MPU機能を無効にする
1532
1533 /* å…
1534¨å‘½ä»¤ãƒ»ãƒ‡ãƒ¼ã‚¿MPUの0サイズ領域å…
1535¨ã‚¢ã‚¯ã‚»ã‚¹æ¨©ãªã—で初期化
1536 * 必
1537要の場合,バックグラウンド領域MPU設定
1538 * å…
1539±æœ‰é ˜åŸŸã®MPU設定
1540 */
1541 MPU初期情
1542報を設定する
1543
1544 MPU機能を有効にする
1545}
1546----------------------------------------
1547
1548
15496.11.4 OSAP固有MPU情
1550報設定処理
1551
1552各OSAP固有MPU情
1553報をMPUに設定する機能は,以下の通りである.
1554
1555----------------------------------------
1556void
1557prc_set_osap_mpu(const OSAPINIB *p_osapinib)
1558{
1559
1560 if (既に設定中のOSAP != 設定するOSAP) {
1561 既に設定中のOSAP = 設定するOSAP;
1562
1563 設定するOSAPのMPU情
1564報を取得して,MPUに設定する … (*a)
1565 }
1566}
1567----------------------------------------
1568
1569(*a)では,OSAP固有に命令領域とデータ領域は,複数存在する場合,å…
1570¨ã¦ã®å‘½
1571令領域・データ領域に対して,アクセス権限を設定する.
1572
15736.11.5 MPU依存のバックグラウンド領域チェック
1574
1575å…
1576ˆé ­ç•ªåœ°åŠã³çµ‚端番地により,引数で指定される領域は,命令バックグラウン
1577ド領域にå…
1578¥ã£ã¦ã„る場合,AP_Executable権あり,データバックグラウンド領
1579域にå…
1580¥ã£ã¦ã„る場合,AP_Writable | AP_Readable権あり,それ以外の場合,
1581NO_ACCESS権を返す.
1582
1583----------------------------------------
1584AccessType
1585probe_trusted_osap_mem(const MemoryStartAddressType sadr,
1586 const MemoryStartAddressType eadr)
1587{
1588 AccessType ret;
1589
1590 ret |= (領域[sadr1,eadr1] ⊆ 命令バックグラウンド領域)?
1591 AP_Executable : NO_ACCESS; … (*a)
1592 ret |= (領域[sadr1,eadr1] ⊆ データバックグラウンド領域) ?
1593 (AP_Writable | AP_Readable) : NO_ACCESS; … (*b)
1594
1595 return(ret);
1596}
1597----------------------------------------
1598
1599(*a)(*b)また,特権モード実行時,MPUの機能停止する設計において,バック
1600グラウンド領域持たないため,AP_Executable | AP_Writable | AP_Readable
1601のようにå…
1602¨ã¦ã®ã‚¢ã‚¯ã‚»ã‚¹æ¨©ã‚りで返しても良い.
1603
16046.11.6 OSが生成したリスタートタスクに対するMPU設定
1605OSが生成したリスタートタスクのMPU設定は信頼タスクと同じとなるようターゲット依存部で設定する.
1606対象のタスクがOSが生成したリスタートタスクかどうかは以下の変数を用いて判断する.
1607tmin_os_restarttask ・・・ OSが生成したリスタートタスクのうち,最小のIDを指す
1608tskidの並びは(ユーザがコンフィギュレーションしたタスク) < (OSが生成したリスタートタスク)となっているので,tmin_os_restarttask <= tskid がTRUEであるとき,OSが生成したリスタートタスクである.
1609
16106.12 メモリ管理のチューニング
1611
16126.12.1 メモリオブジェクトの管理
1613
1614(6.12.1.1) OMIT_STANDARD_MEMINIB(オプション)
1615
1616ターゲット非依存部に含まれる標準のメモリオブジェクト管理機能を用いない
1617場合や,メモリオブジェクト管理機能の構造体,変数,関数をターゲット依存
1618部で用意し,標準のメモリオブジェクト管理と同等の情
1619報をターゲット依存の
1620データ構造で管理する場合には,このシンボルをマクロ定義する.
1621
1622このシンボルをマクロ定義する場合,ターゲット依存部にメモリアクセスチェ
1623ック用関数(check_osap_memory),C2ISRメモリアクセスチェック関数
1624(check_isr_memory),タスクメモリアクセスチェック(check_task_memory)
1625を用意する必
1626要がある.
1627
1628check_osap_memory関数は,引数で指定したOSアプリケーションに対して,引
1629数で指定するメモリ領域のアクセス権のチェックを行う.信頼OSアプリケーシ
1630ョンの場合は,バックグラウンドをチェックする(現実装
1631ではå…
1632¨é ˜åŸŸã‚¢ã‚¯ã‚»ã‚¹
1633可能).非信頼OSアプリケーションの場合は,メモリオブジェクトのアクセス
1634属性(リード,ライト,実行)を返却する.
1635
1636check_isr_memory関数は,引数で指定した割込みにおいて,引数で指定したメ
1637モリ開始アドレスとサイズのメモリ領域に対して,アクセス属性(リード,ラ
1638イト,実行,スタック)を返す.また,引数で指定したメモリ領域は,メモリ
1639オブジェクトを跨いだ場合,その情
1640報を引数より返す必
1641要がある.
1642
1643check_task_memory関数は,引数で指定したタスクにおいて,引数で指定したメ
1644モリ開始アドレスとサイズのメモリ領域に対して,アクセス属性(リード,ラ
1645イト,実行,スタック)を返す.また,引数で指定したメモリ領域は,メモリ
1646オブジェクトを跨いだ場合,その情
1647報を引数より返す必
1648要がある.
1649
1650----------------------------------------
1651
1652AccessType
1653check_osap_memory(const OSAPINIB *p_osapinib,
1654 const MemoryStartAddressType adr,
1655 MemorySizeType size)
1656{
1657 AccessType ret;
1658
1659 if (p_osapinib == 信頼OSアプリケーション) {
1660 ret |= (領域[adr,adr + size] ⊆ バックグラウンド領域)?
1661 (AP_Executable | AP_Writable | AP_Readable) :
1662 NO_ACCESS;
1663 }
1664 else {
1665 ret |= (領域[adr,adr + size] メモリオブジェクト跨ぐ)?
1666 (NO_ACCESS, *over_region = true):
1667 (領域[adr,adr + size]のアクセス権) ;
1668 }
1669 return (ret);
1670}
1671
1672AccessType
1673check_isr_memory(ISRCB *p_isrcb, const MemoryStartAddressType adr,
1674 MemorySizeType size, boolean *over_region)
1675{
1676 AccessType ret;
1677
1678 *over_region = false;
1679 if (領域[adr,adr + size] メモリオブジェクト跨ぐ) {
1680 *over_region = true;
1681 }
1682 else {
1683 ret = (領域[adr,adr + size] ⊆ 割込みスタック領域)?
1684 (AP_Readable | AP_Writable | AP_StackSpace):
1685 NO_ACCESS;
1686 }
1687
1688 /* FL2では割込みは信頼OSアプリケーションにしか属さない */
1689 ret |= AP_Readable | AP_Writable | AP_Executable;
1690
1691 return (ret);
1692}
1693
1694AccessType
1695check_task_memory(const TCB *p_tcb, const MemoryStartAddressType adr,
1696 MemorySizeType size, boolean *over_region)
1697{
1698 AccessType ret;
1699
1700 *over_region = false;
1701 if (領域[adr,adr + size] メモリオブジェクト跨ぐ) {
1702 *over_region = true;
1703 }
1704
1705 if (p_tcbは信頼OSアプリケーションに所属) {
1706 ret = (領域[adr,adr + size] ⊆ タスクシステムスタック領域)?
1707 (AP_Readable | AP_Writable | AP_StackSpace):
1708 NO_ACCESS;
1709
1710 /* 信頼タスクの場合はå…
1711¨ã‚¢ã‚¯ã‚»ã‚¹å¯èƒ½ */
1712 ret |= (AP_Readable | AP_Writable | AP_Executable);
1713 }
1714 else if (*over_region == false) {
1715 ret = (領域[adr,adr + size] ⊆ タスクユーザスタック領域)?
1716 (AP_Writable | AP_Readable | AP_StackSpace):
1717 (領域[adr,adr + size]のアクセス権);
1718 }
1719
1720 return (ret);
1721}
1722
1723----------------------------------------
1724
17256.12.2 メモリアクセス権チェックのためのマクロ
1726
1727カーネル内
1728標準で,実行中OSアプリケーションに対して,引数で指定した変
1729数アドレスと変数タイプのアクセス(リード,ライド)権限のチェックマク
1730ロが用意されている.メモリオブジェクトの依存部管理などにより,依存部
1731でPROBE_MEM_WRITEとPROBE_MEM_RWを定義することで,標準のチェックマクロ
1732を無効にすることができる.
1733
1734(6.12.2.1) PROBE_MEM_WRITE(オプション)
1735(6.12.2.2) PROBE_MEM_RW(オプション)
1736
1737----------------------------------------
1738
1739#define PROBE_MEM_WRITE(p_var, type) \
1740 (領域[p_var,adr + sizeof(type)] & AP_Writable)
1741
1742#define PROBE_MEM_RW(p_var, type) \
1743 (領域[p_var,adr + sizeof(type)] & (AP_Readable | AP_Writable))
1744
1745----------------------------------------
1746
1747
17486.13 エラーフック,シャットダウンフック呼び出し
1749
1750節番号以外,ATK2-SC1から変更なし.
1751
17526.14 カーネルの起動・終了とスタック領域など
1753
1754(6-14-1) スタートアップモジュール
1755
1756(c) void initialize_sections(void)でbssセクションとdataセクションの初
1757 期化
1758
1759各dataセクションに初期値を設定し,各bssセクションをクリアする.
1760
1761まず,初期値ありデータセクションの初期化(dataセクション)の初期化を行
1762う.初期値ありデータセクションを初期化する時に,dataセクション初期化テ
1763ーブルにある初期化データ領域のå…
1764ˆé ­ç•ªåœ°ã‹ã‚‰ï¼Œdataセクションに値を取得し
1765て,セットする.dataセクション初期化テーブルは,dataセクションの初期化
1766に依存してはいけないので,コンフィギュレーションのメモリé…
1767ç½®æ™‚に,読み
1768専用データ領域(rodataセクション)にé…
1769ç½®ã™ã‚Œã°ã‚ˆã„.
1770
1771dataセクション初期化後に,bssセクションを初期化すれば,bssセクション初
1772期化ブロックは,する時,dataセクションは,読み専用データ領域にé…
1773ç½®ã™ã‚‹
1774必
1775要がない.
1776
1777また,OMIT_INITIALIZE_SECTIONSマクロを定義することで,非依存部定義した
1778bssセクションとdataセクションの初期化処理を無効化して,
1779initialize_sectionsを依存部で実装
1780することができる.
1781
1782カーネル本体は,kerflgがfalse(=0)に初期化される以外に,bssセクショ
1783ンが初期化されることに依存していないため,initialize_sectionsを依存部
1784で用意する場合,bssセクション初期化分のシステムの起動時間を短縮するた
1785めに,kerflgをfalseに初期化するだけで十分である.
1786
17876.15 カーネル内
1788部のチューニング
1789
17906.15.1 ビットマップサーチ
1791
1792節番号以外,ATK2-SC1から変更なし.
1793
17946.16 カーネル実装
1795に関するその他の定義
1796
17976.16.1 エラーチェック方法の指定
1798
1799節番号以外,ATK2-SC1から変更なし.
1800
18016.16.2 非タスクコンテキスト用のスタック領域
1802
1803節番号以外,ATK2-SC1から変更なし.
1804
18056.16.3 空ラベルの定義
1806
1807節番号以外,ATK2-SC1から変更なし.
1808
18096.16.4 各スタックのデフォルト値
1810
1811(6-16-4-3) DEFAULT_TASKSYSTEMSTKSZ(オプション)
1812(6-16-4-4) DEFAULT_ISRSYSTEMSTKSZ(オプション)
1813(6-16-4-5) DEFAULT_HOOKSTKSZ(オプション)
1814(6-16-4-6) DEFAULT_NONTRUSTEDHOOKSTKSZ(オプション)
1815(6-16-4-7) DEFAULT_TRUSTEDFUNCTIONSTKSZ(オプション)
1816(6-16-4-8) DEFAULT_OSSTKSZ(オプション)
1817
18186.16.5 スタックマジックナンバー領域操作マクロの定義
1819
1820(6-16-5-2) TOPPERS_SSTK_MAGIC_REGION(オプション)
1821
1822スタックモニタリングで使用するタスクシステムスタック用マジックナンバー
1823の格納位置を返すマクロであり,スタックの成長方向がアドレスの大きい方か
1824ら小さい方へ成長することをデフォルト実装
1825としている.スタック成長方向に
1826よりターゲットで再定義することができる.p_tinibで指定ししたタスク初期
1827化ブロックを基づいて,スタック成長方向によりターゲットで再定義すること
1828ができる.
1829
18306.16.6 標準以外メモリリージョン属性の定義
1831
1832ハードウェアにどのような性質のメモリリージョンが存在するかは,ターゲッ
1833トに依存するので,標準ROM,標準RAM以外のメモリリージョンが存在する場合,
1834ターゲット依存部で,属性を識別するため以下のマクロを定義する.
1835
1836(6-16-6-1)TARGET_REGATR
1837
1838ただし,非依存部で以下の定義値は,既にビット単位で予約されているので,
1839定義値を注意する.
1840 0x00 /* オブジェクト属性を指定しない */
1841 0x01 /* 書込みアクセス禁止 */
1842 0x02 /* 標準ROMリージョン */
1843 0x04 /* 標準RAMリージョン */
1844
1845コンフィギュレーション時,非依存部のでTARGET_REGATRを用いて,定義した
1846メモリリージョンの有効性をチェックしている.
1847
18486.17 トレースログ機能に関する設定
1849
18506.17.1 取得できるトレースログの種類とマクロ
1851
1852節番号以外,ATK2-SC1から変更なし.
1853
18546.17.2 トレースログ記録のサンプルコード
1855
1856節番号以外,ATK2-SC1から変更なし.
1857
18586.18 フック,シャットダウンフックの強制終了
1859
1860Release 1.4.0以降では必
1861要ない.
1862
18636.19 コア起動
1864
1865(6-19-1) LOCAL_INLINE boolean x_start_core(CoreIdType coreid)
1866
1867指定されたコアの起動処理を行う.
1868
1869----------------------------------------
1870LOCAL_INLINE boolean x_start_core(CoreIdType coreid)
1871{
1872 if (指定されたコアID<サポートしているコア数) {
1873 (SYSVER_REG5 + 4 * coreid )に,MAGIC_STARTを書き込む
1874 TRUEを返す
1875 } else {
1876 FALSEを返す
1877 }
1878 返り値をリターン
1879}
1880----------------------------------------
1881
1882(6-19-2) LOCAL_INLINE boolean is_halt(CoreIdType coreid)
1883
1884指定されたコアが起動されたかの確認を行う.
1885
1886----------------------------------------
1887LOCAL_INLINE boolean is_halt(CoreIdType coreid)
1888{
1889 if (SYSVER_REG5 + 4 * coreid )にMAGIC_STARTが書き込まれていない {
1890 TRUEを返す
1891 } else {
1892 FALSEを返す
1893 }
1894}
1895----------------------------------------
1896
18976.20 フックの確認
1898
1899Release 1.4.0以降では必
1900要ない.
1901
19026.21 スタック切り替え
1903
1904call_protectionhk_main_stkchg (ercd)
1905
1906フック用スタックへの切り替えを実施した上でフックルーチンの実行を行う.
1907
19086.22 非信頼フックルーチンスタック領域
1909
1910Release 1.4.0以降では必
1911要ない.
1912
19136.23 ハードウェアカウンタ
1914
1915ATK2-SC1から変更なし.
1916
19176.23.1 ハードウェアカウンタのファイル構成
1918
1919ATK2-SC1から変更なし.
1920
19216.23.2 ハードウェアカウンタの情
1922報提供
1923
1924ATK2-SC1から変更なし.
1925
19266.24 OSAP強制終了
1927
1928(6-24-1) void activate_force_term_osap_main(TCB *p_tcb)
1929
1930OSAP強制終了時に呼ばれ,当該OSAPの終了処理を実施するリスタートタスクを
1931起動する関数である.
1932リスタートタスクの起動番地は,force_term_osap_mainラベルの番地とする.
1933force_term_osap_mainは,カーネル非依存部で提供するラベルであるため,
1934ターゲット依存部では提供しない.
1935
1936activate_force_term_osap_mainの処理内
1937容は次のとおり.
1938
1939----------------------------------------
1940void
1941activate_force_term_osap_main(TCB *p_tcb)
1942{
1943 指定されたTCB(*p_tcb)中のスタックポインタを初期化する
1944 force_term_osap_mainを,実行再開番地として指定されたTCBに保存する
1945 return;
1946}
1947----------------------------------------
1948
1949
19507.ジェネレータ設定ファイルのターゲット依存部
1951
19527.1 設定ファイルとターゲット依存部の位置付け
1953
1954ATK2-SC3のジェネレータは,設定ファイルの記述に従ってファイルの生成およ
1955びエラーチェックを行う.ジェネレータの設定ファイルには,以下の5つがあ
1956る.
1957
1958(a) XMLコンテナテーブル
1959
1960ATK2-SC1から変更なし.
1961
1962(b) 値取得シンボルテーブル
1963
1964ATK2-SC1から変更なし.
1965
1966(c) パス2のテンプレートファイル
1967
1968ジェネレータのパス2は,テンプレートファイルに従って,カーネルの構成・
1969初期化ファイル(Os_Lcfg.c),構成・初期化ヘッダファイル(Os_Lcfg.h),
1970メモリ構成・初期化ファイル(kernel_mem2.c),リンカスクリプトファイル
1971(ldscript.ld),パス3, パス4に渡すテンプレート情
1972報ファイル
1973(cfg2_out.tf)などを生成する.このテンプレートファイルは,ターゲット非
1974依存部とターゲット依存部に切り分けてあるが,他のファイルのターゲット依
1975存部とは逆に,ターゲット依存部からターゲット非依存部をインクルードする
1976形になっている.
1977
1978å…
1979·ä½“的には,targetディレクトリに置かれたtarget.tfで,必
1980要な変数を定義
1981した後,テンプレートファイルのターゲット非依存部(kernel/kernel.tf)を
1982インクルードする.kernel.tfでは,カーネルのターゲット非依存部で使用す
1983る変数定義等を生成する.kernel.tfをインクルードした後,target.tfでは,
1984カーネルのターゲット依存部で使用する変数定義等を生成する.target.tfか
1985ら,プロセッサ依存部,チップ依存部を,開発環境依存部を切り分けてもよい.
1986
1987パス2では,メモリ構成・初期化ファイルに,meminib_table, memtop_table,
1988datasecinib_table, bsssecinib_table, mpuinfo_shared(å…
1989±æœ‰é ˜åŸŸã«å¯¾ã™ã‚‹
1990MPUINFOB),OSAP専有領域に対するMPUINFOBの情
1991報を出力する.
1992
1993(d) パス3のテンプレートファイル
1994
1995ジェネレータのパス3は,テンプレートファイルに従って,パス2で生成した,
1996meminib_table, memtop_table, datasecinib_table, bsssecinib_table,
1997mpuinfo_shared(å…
1998±æœ‰é ˜åŸŸã«å¯¾ã™ã‚‹MPUINFOB), OSAP専有領域に対するMPUINFOB
1999の最適化を行う.このテンプレートファイルも,ターゲット非依存部とターゲ
2000ット依存部に切り分けてあり,ターゲット依存部からターゲット非依存部をイ
2001ンクルードする形になっている.
2002
2003å…
2004·ä½“的には,targetディレクトリに置かれたtarget_mem.tfで,必
2005要な変数を
2006定義した後,テンプレートファイルのターゲット非依存部
2007(kernel/kernel_mem.tf)をインクルードする.kernel_mem.tfでは,カーネ
2008ルのターゲット非依存部で,パス2で生成した各ファイルから情
2009報を読込み,
2010メモリ構成・初期化データ構造の最適化(隣接領域の統合・0サイズ領域の削
2011除など)を行い,最適化したメモリ構成・初期化ファイル(kernel_mem3.c)
2012を出力する.target_mem.tfから,プロセッサ依存部,チップ依存部を,開発
2013環境依存部を切り分けてもよい.
2014
2015(e) パス4のテンプレートファイル
2016
2017ジェネレータのパス4は,テンプレートファイルに従って,パス3で生成した,
2018meminib_table, memtop_table, datasecinib_table, bsssecinib_table,
2019mpuinfo_shared(å…
2020±æœ‰é ˜åŸŸã«å¯¾ã™ã‚‹MPUINFOB), OSAP専有領域に対するMPUINFOB
2021を更に最適化を行い,最終のメモリ構成・初期化ファイル(kernel_mem.c)を
2022出力する.このテンプレートファイルも,ターゲット非依存部とターゲット依
2023存部に切り分けてあり,ターゲット依存部からターゲット非依存部をインクル
2024ードする形になっている.
2025
2026å…
2027·ä½“的には,targetディレクトリに置かれたtarget_mem2.tfで,必
2028要な変数を
2029定義した後,テンプレートファイルのターゲット非依存部
2030(kernel/kernel_mem2.tf)をインクルードする.kernel_mem2.tfでは,カー
2031ネルのターゲット非依存部で,パス3で生成した各ファイルから情
2032報を読込み,
2033メモリ構成・初期化データ構造再度最適化を行い,パス3と変わらない最終の
2034メモリ構成・初期化ファイル(kernel_mem.c)を出力する.target_mem.tfか
2035ら,プロセッサ依存部,チップ依存部を,開発環境依存部を切り分けてもよ
2036い.
2037
2038ジェネレータのパス4は,基本的にはパス3と同じ処理を行うが,パス3と違い,
2039各メモリオブジェクトの開始と終端アドレスが最終のアドレスになるため,違
2040うメモリリージョンにé…
2041ç½®ã•ã‚Œã‚‹ãƒ¡ãƒ¢ãƒªã‚ªãƒ–ジェクトの統合や,リンカでé…
2042ç½®
2043しないメモリオブジェクトの統合が可能になる.パス3とパス4ではメモリマッ
2044プが変わらないようにするため,パス4での最適化により,é…
2045åˆ—のサイズが小
2046さくできる場合でもサイズを変えないようにする.
2047ジェネレータのパス4では,メモリオブジェクトの重なりのチェック等のエラー
2048チェックも行う.
2049
2050なお,ジェネレータの詳細仕様と設定ファイルの記述方法については,別途
2051PDFファイルの形でé…
2052å¸ƒã—ている「TOPPERS新世代カーネル用ジェネレータ仕様」
2053および「TOPPERS新世代カーネル用ジェネレータ内
2054蔵マクロプロセッサ仕様」
2055を参ç…
2056§ã™ã‚‹ã“と.
2057
20587.2 パス2のテンプレートファイルのターゲット依存部
2059
2060
20617.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
2062
2063
2064(7-2-1-5) TARGET_SEC_ALIGN_STR セクションのアラインサイズの定義
2065(7-2-1-6) TARGET_PAGE_SIZE_STR ページのアラインサイズの定義
2066
2067(7-2-1-7) TARGET_MEMATR_USTACK ユーザスタック領域のメモリオブジェクト
2068 属性
2069
2070以下の標準セクションのメモリオブジェクト属性を定義する
2071(7-2-1-8) MEMATR_TEXT コード領域の属性
2072(7-2-1-9) MEMATR_RODATA 読込み専用領域の属性
2073(7-2-1-10) MEMATR_DATA データ領域の属性
2074(7-2-1-11) MEMATR_BSS 0初期化領域の属性
2075(7-2-1-12) MEMATR_PRSV プレザーブド領域の属性
2076(7-2-1-13) MEMATR_SDATA 初期値ありショート領域の属性
2077(7-2-1-14) MEMATR_SBSS 初期値なしショート領域の属性
2078
2079(7-2-1-15) START_OBJS スタートアップモジュールの定義
2080
2081(7-2-1-16) SECTION_USTACK ユーザスタック領域のセクション名生成関数
2082
2083(7-2-1-17) ALLOC_USTACK(taskid, ustksz) ユーザスタック領域の確保関数
2084
2085(7-2-1-18) USTACK_ALIGN_SIZE(ustksz) ユーザスタックのアライメント制
2086 約に合わせたサイズを返す関数
2087
2088(7-2-1-19) SECTION_SHARED_USTACK(å…
2089±æœ‰ã‚¹ã‚¿ãƒƒã‚¯ID) 基本タスクのå…
2090±æœ‰ã‚¹
2091 タックのセクション名を返す関数
2092
2093(7-2-1-20) ALLOC_SHARED_USTACK(...) 基本タスクのå…
2094±æœ‰ã‚¹ã‚¿ãƒƒã‚¯ã®ç¢ºä¿é–¢æ•°
2095 第1引数 å…
2096±æœ‰ã‚¹ã‚¿ãƒƒã‚¯å
2097 第2引数 å…
2098±æœ‰ã‚¹ã‚¿ãƒƒã‚¯ID(タスク優å…
2099ˆåº¦)
2100 第3引数 スタックサイズ(アライメント調整済み)
2101
2102(7-2-1-21) ALLOC_SSTACK(...) システムスタック領域の確保関数
2103 第1引数 スタック名
2104 第2引数 スタックサイズ
2105 第3引数 変数定義に付与する指定子
2106
2107(7-2-1-22) ALLOC_HSTACK(...) 非信頼フックスタックの確保関数
2108 第1引数 スタック名
2109 第2引数 スタックサイズ
2110
2111 Release 1.4.0以降では必
2112要ない.
2113
2114(7-2-1-23) HSTACK_SIZE_STR(stksz) 非信頼フックスタックサイズのアライ
2115 メント制約を満たすように拡張したサ
2116 イズの文字列を返す関数
2117 Release 1.4.0以降では必
2118要ない.
2119
2120(7-2-1-24) DEFINE_DSEC(void) 標準のセクションの定義関数
2121 上記(7-2-1-9)〜(7-2-1-15)の標準のセクション(名前,属性,é…
2122ç½®ãƒªãƒ¼ã‚¸ãƒ§
2123 ン名)の定義
2124
2125(7-2-1-25) SECTION_DESCRIPTION(secname) リンクするセクション名記述の生
2126 成関数
2127
2128
2129(7-2-1-26) HOOK_ERRORCHECK_SEC(secid)(オプション) ATT_SECに関するタ
2130 ーゲット依存のエラーチェック関数
2131
2132
2133
2134(7-2-1-27) HOOK_ERRORCHECK_MEM(secid)(オプション) ATT_MEMに関するタ
2135 ーゲット依存のエラーチェック関数
2136
2137(7-2-1-28) TARGET_PROVIDE_GP(void) gpレジスタの設定関数
2138
2139(7-2-1-29) TARGET_CODE_FILLER(moid)(オプション) text領域をNOP命令
2140 で埋める関数
2141 text領域のシンボル名をNOP命令で埋める
2142
2143(7-2-1-30) GENERATE_OUTPUT(void)(オプション)ターゲット依存のOUTPUT記
2144 述の生成関数
2145 出力するファイルの形式(BFD),ターゲットアーキテクチャ及びエントリ
2146 を指定する.
2147
2148(7-2-1-31) GENERATE_PROVIDE(void) ターゲット依存のPROVIDE記述の生成
2149 関数
2150
2151
2152(7-2-1-32) GENERATE_SECTION_FIRST(void) ターゲット依存のセクション記述
2153 の生成関数
2154
2155(7-2-1-33) GENERATE_STKMPUINFOB(taskid) タスクスタックのMPUレジスタ設
2156 定値を出力する関数
2157 メモリサイズ確定のため,コンパイラ用ダミーのMPUレジスタ設定値を出力
2158 する.
2159
2160(7-2-1-34) $CFG_PASS3 = 0$
2161(7-2-1-35) $CFG_PASS4 = 0$
2162
2163また,パス2,パス3,パス4å…
2164±é€šå®šç¾©ã‚’å…
2165±é€šå‡¦ç†ãƒ•ã‚¡ã‚¤ãƒ«(prc_common.tf)に定
2166義し,各パス処理テンプレートファイルを処理前にインクルードする.
2167
2168(7-2-1-36) MEMORY_ALIGN メモリのアライメント
2169
2170(7-2-1-37) CHECK_MP_ALIGN 第1引数と,第2引数がメモリ保護のアライメン
2171 ト制約を満たしているかチェックする関数
2172
2173(7-2-1-38) GENERATE_OSAPINIB_MPUINFOB(osapid) OSAPINIBのMPUINFOBを出
2174 力する関数
2175
2176(7-2-1-39) DEFINE_CONST_VAR(...) rodata領域にé…
2177ç½®ã•ã‚Œã‚‹å¤‰æ•°ã‚’定
2178 義する関数
2179 第1引数 変数型名
2180 第2引数 変数名
2181
2182DEFINE_CONST_VARは,非依存部のテンプレートファイルでは,データセクション
2183の初期化前に使用されるデータ(å…
2184·ä½“的には,ostkpt,tnum_datasec,
2185datasecinib_table)を確実に定数領域(初期化が必
2186要なく,リセット後にも
2187値が保持される不揮発性領域)にé…
2188ç½®ã™ã‚‹ãŸã‚ã«ç”¨ã„られる.
2189
2190(7-2-1-40) GENERATE_STKMPUINFOB(taskid) タスクスタックのMPUレジスタ設
2191 定値を出力関数
2192 この関数は,パス3, パス4のみ有効な定義とする.
2193 上記(7-2-1-33)の定義は,パス2のみ有効
2194
2195(7-2-1-41) DEFINE_VAR_SEC(...) 変数を指定されたセクションに定義す
2196 る関数
2197 第1引数 セクション名
2198 第2引数 型
2199 第3引数 変数名
2200 第4引数 変数の値
2201
2202(7-2-1-42) GENERATE_TARGET_MPUINFOB(void) MPUレジスタ設定値の生成関数
2203 MPU_REGIONを作成,統合し,å…
2204±æœ‰é ˜åŸŸåŠã³OSAP専有領域のMPUレジスタ設定
2205 値を生成する.
2206
2207(7-2-1-27) HOOK_ERRORCHECK_REG(regid)(オプション) ATT_REGに関するタ
2208 ーゲット依存のエラーチェック関数
2209
22107.2.2 ターゲット非依存部で定義される変数
2211
2212(7-2-2-3) REG.xxxx[regid] メモリリージョンの連想é…
2213åˆ—
2214
2215(7-2-2-4) MO.xxxx[moid] メモリオブジェクトの連想é…
2216åˆ—
2217
2218(7-2-2-5) LNKSEC.xxxx[lsid] LNK_SECでé…
2219ç½®ã™ã‚‹ã‚»ã‚¯ã‚·ãƒ§ãƒ³ã®é€£æƒ³é…
2220åˆ—
2221
2222(7-2-2-6) OSAP.xxxx[osapid] OSAP情
2223報の連想é…
2224åˆ—
2225
22267.3 パス3のテンプレートファイルのターゲット依存部
2227
22287.3.1 ターゲット非依存部をインクルードする前に定義すべき変数
2229
2230target_mem.tfからkernel_mem.tfをインクルードする前に,必
2231要に応じて,次
2232の変数を定義しておかなければならない.
2233
2234(7-3-1-2) $CFG_PASS3 = 1$
2235(7-3-1-3) $CFG_PASS4 = 0$
2236
22377.4 パス4のテンプレートファイルのターゲット依存部
2238
2239
2240以下では,パス4のテンプレートファイルのターゲット依存部を記述する上で
2241必
2242要な事項
2243について説明する.
2244
22457.4.1 ターゲット非依存部をインクルードする前に定義すべき変数
2246
2247target_mem2.tfからkernel_mem2.tfをインクルードする前に,必
2248要に応じて,
2249次の変数を定義しておかなければならない.
2250
2251(7-4-1-1) $CFG_PASS3 = 0$
2252(7-4-1-2) $CFG_PASS4 = 1$
2253
2254(7-4-1-3) HOOK_ERRORCHECK_MEM_PASS4(moid)(オプション)
2255 - OsMemoryAreaに関するターゲット定義のエラーチェック関数
2256 - 引数 moid:メモリオブジェクトのID
2257 - OsMemoryAreaStartAddress で指定された値が,MO.BASEADDR[moid]に
2258 å…
2259¥ã£ã¦ã„るため,この値がターゲット定義のアライメント制約を満たして
2260 いるかどうかチェックし,アラインメント制約を満たしていない場合,
2261 エラーを検出する.≪NOS0813≫
2262 - OMIT_STANDARD_MEMINIBが定義されている場合,本関数は呼ばれない
2263 ため,ターゲット依存部のtfで,NOS0813のチェックをする必
2264要がある.
2265
2266また,各メモリオブジェクトの領域のサイズチェック・オブジェクトの重なり
2267チェックを必
2268要に応じて,パス4で行う.
2269
2270パス3とパス4ではメモリマップが変わらないようにするため,パス4での最適
2271化により,é…
2272åˆ—のサイズが小さくできる場合でもサイズを変えないようにす
2273る.
2274
2275
22767.5 cfg1_out.cのリンクに必
2277要なスタブの定義ファイル
2278
2279----------------------------------------
2280...
2281void
2282initialize_sections(void)
2283{
2284}
2285const MPUINFOB _background_code_region;
2286const MPUINFOB _background_data_region;
2287----------------------------------------
2288
22897.6 data/bssセクション初期化ブロックの生成
2290
2291ターゲット依存部において,OMIT_STANDARD_DATASECINIBマクロを定義すると,
2292ターゲット非依存部で,dataセクション初期化ブロックを生成しない.
2293
2294ターゲット依存部において,OMIT_STANDARD_BSSSECINIBマクロを定義すると,
2295ターゲット非依存部で,bssセクション初期化ブロックを生成しない.
2296
2297dataセクションなどのå…
2298ˆé ­ç•ªåœ°ã®ãƒ©ãƒ™ãƒ«ã¯ï¼Œä½¿ç”¨ã™ã‚‹ã‚³ãƒ³ãƒ‘イラによっては,
2299非依存部で生成される初期化ブロックから参ç…
2300§ã•ã‚Œã‚‹ãƒ©ãƒ™ãƒ«ã¨ç•°ãªã‚‹å ´åˆãŒ
2301ある.
2302そのような場合に,これらのマクロを定義することで,ターゲット依存で
2303独自のdata/bssセクション初期化ブロックの生成処理を,テンプレートファイル
2304によって定義することができる.
2305
23068.システムモジュール等のターゲット依存部
2307
23088.1 システムモジュールのターゲット依存部
2309
2310ATK2-SC1から変更なし.
2311
23128.2 システムログ機能のターゲット依存定義
2313
2314(8-2-3) ターゲット定義のシステムサービスの追加
2315システムログ機能は,ターゲット追加のシステムサービスとして位置付け,シ
2316ステムログ機能使用する/使用しない場合,システムサービステーブルに追加/
2317追加しないオプション(USE_KERNEL_LIBRARY_SYSLOG)をサポートする.
2318
2319USE_KERNEL_LIBRARY_SYSLOGマクロが定義されている場合,システムモジュー
2320ルに用意している_kernel_KernelLibrarySyslog関数をターゲットで追加する
2321システムサービステーブル定義(PRC_SVC_TABLE)に追加する.
2322USE_KERNEL_LIBRARY_SYSLOGマクロが定義されない場合,
2323_kernel_KernelLibrarySyslog関数をターゲットで追加するシステムサービス
2324テーブル定義(PRC_SVC_TABLE)に追加しない.
2325
23268.3 シリアルインタフェースドライバのターゲット依存部
2327
23288.3.1 変数,データ型,管理関数
2329
2330ATK2-SC1から変更なし.
2331
23328.3.2 デバイスサービスルーチン
2333
2334ATK2-SC1から変更なし.
2335
23368.3.3 コールバックルーチン
2337
2338ATK2-SC1から変更なし.
2339
23408.4 カーネル起動メッセージの出力のターゲット依存定義
2341
2342ATK2-SC1から変更なし.
2343
23448.5 サンプルプログラムとテストプログラムのターゲット依存定義
2345
2346ATK2-SC1から変更なし.
2347
23488.6 実行時間分布集計モジュールのターゲット依存定義
2349
2350ATK2-SC1から変更なし.
2351
23528.7 タイマドライバ
2353
23548.7.1 タイマドライバのファイル構成
2355
2356ATK2-SC1から変更なし.
2357
23588.7.2 ソフトウェアカウンタの定義
2359
2360ATK2-SC1から変更なし.
2361
23628.7.3 時間型の定義
2363
2364ATK2-SC1から変更なし.
2365
23668.7.4 タイマの初期化・終了処理・割込み処理
2367
2368ATK2-SC1から変更なし.
2369
23708.7.5 現在の時刻の取得
2371
2372ATK2-SC1から変更なし.
2373
23749.その他
2375
23769.1 ドキュメント
2377
2378ATK2-SC1から変更なし.
2379
238010.リファレンス
2381
238210.1 ターゲット依存部のファイル一覧
2383
2384target_mem.tf ジェネレータのパス3のテンプレートファイルのター
2385 ゲット依存部(7.3 節).
2386target_mem2.tf ジェネレータのパス4のテンプレートファイルのター
2387 ゲット依存部(7.4 節).
2388target_mem.arxml ターゲット依存の標準ROM/RAMなどメモリリージョ
2389 ン定義のXMLコンテナコンフィギュレーション
2390 ファイル.
2391target_svc.h ターゲット依存のソフトウェア割込みによるサービ
2392 スコールインタフェースヘッダーファイル.
2393target_serial_obj.arxml シリアルドライバのシステムコンフィギュレーショ
2394 ンファイル.
2395target_serial_osap.arxmlシリアルドライバのシステムコンフィギュレーショ
2396 ンファイル.
2397target_test_obj.arxml テストプログラムのターゲット依存定義のコンフィ
2398 ギュレーションファイル.
2399target_test_osap.arxml テストプログラムのターゲット依存定義のコンフィ
2400 ギュレーションファイル.
2401target_timer_obj.arxml タイマドライバのXMLコンテナ用システムコンフィ
2402 ュレーションファイル.
2403target_timer_osap.arxml タイマドライバのXMLコンテナ用システムコンフィ
2404 ュレーションファイル.
2405
2406
2407以上
Note: See TracBrowser for help on using the repository browser.