1 |
|
---|
2 | TOPPERS/ATK2-SC3
|
---|
3 | ターゲット依存部 ポーティングガイド
|
---|
4 |
|
---|
5 | このドキュメントは,TOPPERS/ATK2-SC3を,未サポートのターゲットシステム
|
---|
6 | にポーティングするために必要となるターゲット依存部の実装方法を説明する
|
---|
7 | ものである.
|
---|
8 |
|
---|
9 | ----------------------------------------------------------------------
|
---|
10 | TOPPERS ATK2
|
---|
11 | Toyohashi Open Platform for Embedded Real-Time Systems
|
---|
12 | Automotive Kernel Version 2
|
---|
13 |
|
---|
14 | Copyright (C) 2011-2015 by Center for Embedded Computing Systems
|
---|
15 | Graduate School of Information Science, Nagoya Univ., JAPAN
|
---|
16 | Copyright (C) 2011-2015 by FUJI SOFT INCORPORATED, JAPAN
|
---|
17 | Copyright (C) 2011-2013 by Spansion LLC, USA
|
---|
18 | Copyright (C) 2011-2015 by NEC Communication Systems, Ltd., JAPAN
|
---|
19 | Copyright (C) 2011-2015 by Panasonic Advanced Technology Development Co., Ltd., JAPAN
|
---|
20 | Copyright (C) 2011-2014 by Renesas Electronics Corporation, JAPAN
|
---|
21 | Copyright (C) 2011-2015 by Sunny Giken Inc., JAPAN
|
---|
22 | Copyright (C) 2011-2015 by TOSHIBA CORPORATION, JAPAN
|
---|
23 | Copyright (C) 2011-2015 by Witz Corporation
|
---|
24 | Copyright (C) 2014-2015 by AISIN COMCRUISE Co., Ltd., JAPAN
|
---|
25 | Copyright (C) 2014-2015 by eSOL Co.,Ltd., JAPAN
|
---|
26 | Copyright (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.本マニュアルの位置づけ
|
---|
60 | 1.共通事項
|
---|
61 | 1.1 ターゲット依存部の構成
|
---|
62 | 1.2 多重インクルードの防止
|
---|
63 | 1.3 アセンブリ言語とのヘッダファイルの共用
|
---|
64 | 1.4 インクルード記述の方法
|
---|
65 | 1.5 クリティカルセクションの出入処理の実現に関する制約
|
---|
66 | 2.システム構築環境のターゲット依存部
|
---|
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 その他の設定
|
---|
76 | 3.AUTOSAR共通定義のターゲット依存部
|
---|
77 | 3.1 整数型の最大値・最小値・ビット数
|
---|
78 | 3.2 整数型
|
---|
79 | 3.3 論理型,論理型の値
|
---|
80 | 3.4 その他の型
|
---|
81 | 3.5 コンパイラの拡張機能のためのマクロ定義
|
---|
82 | 3.6 標準的な定義の上書き
|
---|
83 | 4.システムインタフェースレイヤ(SIL)のターゲット依存部
|
---|
84 | 4.1 全割込み禁止状態の管理
|
---|
85 | 4.2 プロセッサのエンディアン
|
---|
86 | 4.3 I/O空間アクセス関数
|
---|
87 | 5.カーネルAPIのターゲット依存部
|
---|
88 | 5.1 メモリ領域確保のための型定義
|
---|
89 | 5.2 メモリ領域確保のためのマクロ
|
---|
90 | ○5.3 オブジェクト型の上書き
|
---|
91 | 6.カーネル実装のターゲット依存部
|
---|
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 ハードウェアカウンタの情報提供
|
---|
160 | 7.ジェネレータ設定ファイルのターゲット依存部
|
---|
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セクション初期化ブロックの生成
|
---|
171 | 8.システムモジュール等のターゲット依存部
|
---|
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 現在の時刻の取得
|
---|
187 | 9.その他
|
---|
188 | 9.1 ドキュメント
|
---|
189 | 10.リファレンス
|
---|
190 | ○10.1 ターゲット依存部のファイル一覧
|
---|
191 |
|
---|
192 | ○がついている項目はATK2-SC1から変更があった箇所を,◎はATK2-SC3で
|
---|
193 | 新規に追加された箇所を示し,それぞれ差分のみを記述している.
|
---|
194 |
|
---|
195 |
|
---|
196 | 0.本マニュアルの位置づけ
|
---|
197 | TOPPERS/ATK2-SC3は,TOPPERS/ATK2-SC1をベースとしているため,多くのポー
|
---|
198 | ティング項目はTOPPERS/ATK2-SC1と同一である.本ドキュメントでは,TOPPER
|
---|
199 | S/ATK2-SC1と異なる点について説明する.そのため,まずTOPPERS/ATK2-SC1の
|
---|
200 | ポーティングガイドを参照の後,本ドキュメントを参照すること.
|
---|
201 |
|
---|
202 |
|
---|
203 | 1.共通事項
|
---|
204 |
|
---|
205 | 1.1 ターゲット依存部の構成
|
---|
206 |
|
---|
207 | ATK2-SC1から変更なし.
|
---|
208 |
|
---|
209 | 1.2 多重インクルードの防止
|
---|
210 |
|
---|
211 | ATK2-SC1から変更なし.
|
---|
212 |
|
---|
213 | 1.3 アセンブリ言語とのヘッダファイルの共用
|
---|
214 |
|
---|
215 | ATK2-SC1から変更なし.
|
---|
216 |
|
---|
217 | 1.4 インクルード記述の方法
|
---|
218 |
|
---|
219 | ATK2-SC1から変更なし.
|
---|
220 |
|
---|
221 | 1.5 クリティカルセクションの出入処理の実現に関する制約
|
---|
222 |
|
---|
223 | ATK2-SC1から変更なし.
|
---|
224 |
|
---|
225 | 2.システム構築環境のターゲット依存部
|
---|
226 |
|
---|
227 | 2.1 ターゲット略称とターゲット依存部のディレクトリ
|
---|
228 |
|
---|
229 | ATK2-SC1から変更なし.
|
---|
230 |
|
---|
231 | 2.2 Makefileのターゲット依存部
|
---|
232 |
|
---|
233 | ATK2-SC1から変更なし.
|
---|
234 |
|
---|
235 | 2.3 開発環境名とコマンド名の設定
|
---|
236 |
|
---|
237 | ATK2-SC1から変更なし.
|
---|
238 |
|
---|
239 | 2.4 コンパイルオプションとオブジェクトファイルの設定
|
---|
240 |
|
---|
241 | ATK2-SC1から変更なし.
|
---|
242 |
|
---|
243 | 2.5 オフセットファイルの生成方法
|
---|
244 |
|
---|
245 | ATK2-SC1から変更なし.
|
---|
246 |
|
---|
247 | 2.6 リンク方法の設定
|
---|
248 |
|
---|
249 | ATK2-SC3カーネルは,メモリの最適化を行うため,以下のマクロは,使用でき
|
---|
250 | ない.
|
---|
251 |
|
---|
252 | (2-6-2) TEXT_START_ADDRESS テキストセクションの先頭番地
|
---|
253 | (2-6-3) DATA_START_ADDRESS データセクションの先頭番地
|
---|
254 |
|
---|
255 | 2.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 | ----------------------------------------
|
---|
266 | kernel_mem3.c: $(TARGETDIR)/target_mem.tf
|
---|
267 | kernel_mem.c: $(TARGETDIR)/target_mem2.tf $(TARGETDIR)/target_check.tf
|
---|
268 | ----------------------------------------
|
---|
269 |
|
---|
270 | 2.8 その他の設定
|
---|
271 |
|
---|
272 | ATK2-SC1から変更なし.
|
---|
273 |
|
---|
274 | 3.AUTOSAR共通定義のターゲット依存部
|
---|
275 |
|
---|
276 | 3.1 整数型の最大値・最小値・ビット数
|
---|
277 |
|
---|
278 | ATK2-SC1から変更なし.
|
---|
279 |
|
---|
280 | 3.2 整数型
|
---|
281 |
|
---|
282 | ATK2-SC1から変更なし.
|
---|
283 |
|
---|
284 | 3.3 論理型,論理型の値
|
---|
285 |
|
---|
286 | ATK2-SC1から変更なし.
|
---|
287 |
|
---|
288 | 3.4 その他の型
|
---|
289 |
|
---|
290 | ATK2-SC1から変更なし.
|
---|
291 |
|
---|
292 | 3.5 コンパイラの拡張機能のためのマクロ定義
|
---|
293 |
|
---|
294 | ATK2-SC1から変更なし.
|
---|
295 |
|
---|
296 | 3.6 標準的な定義の上書き
|
---|
297 |
|
---|
298 | ATK2-SC1から変更なし.
|
---|
299 |
|
---|
300 | 4.システムインタフェースレイヤ(SIL)のターゲット依存部
|
---|
301 |
|
---|
302 | 4.1 全割込み禁止状態の管理
|
---|
303 |
|
---|
304 | ATK2-SC1から変更なし.
|
---|
305 |
|
---|
306 | 4.2 プロセッサのエンディアン
|
---|
307 |
|
---|
308 | ATK2-SC1から変更なし.
|
---|
309 |
|
---|
310 | 5.カーネルAPIのターゲット依存部
|
---|
311 |
|
---|
312 | 5.1 メモリ領域確保のための型定義
|
---|
313 |
|
---|
314 | ATK2-SC1から変更なし.
|
---|
315 |
|
---|
316 | 5.2 メモリ領域確保のためのマクロ
|
---|
317 |
|
---|
318 | ATK2-SC1から変更なし.
|
---|
319 |
|
---|
320 | 5.3 オブジェクト型の上書き
|
---|
321 |
|
---|
322 | (5-3-1) OMIT_DATA_TYPE (オプション)
|
---|
323 |
|
---|
324 | OMIT_DATA_TYPEマクロをターゲット依存部で定義した場合は,一部のオブジェ
|
---|
325 | クトの型をターゲット依存部で定義することができる.
|
---|
326 |
|
---|
327 | (5-3-15) TrustedFunctionIndexType (オプション,デフォルトはuint32)
|
---|
328 | (5-3-16) IocType (オプション,デフォルトはuint32)
|
---|
329 | (5-3-17) SenderIdType (オプション,デフォルトはuint8)
|
---|
330 |
|
---|
331 |
|
---|
332 | 6.カーネル実装のターゲット依存部
|
---|
333 |
|
---|
334 | 6.1 カーネル実装のターゲット依存部の共通事項
|
---|
335 |
|
---|
336 | 6.1.1 カーネル実装のターゲット依存部の構成要素
|
---|
337 |
|
---|
338 | (c) ジェネレータ設定ファイル
|
---|
339 |
|
---|
340 | ジェネレータの設定ファイルのターゲット依存部を,target_def.csv,
|
---|
341 | target.tf,target_mem.tf,target_mem2.tf,target_check.tfに用意する.
|
---|
342 | ジェネレータ設定ファイルの記述方法については,7章で説明する.
|
---|
343 |
|
---|
344 | 6.1.2 ターゲット依存部の関数の命名規則
|
---|
345 |
|
---|
346 | ATK2-SC1から変更なし.
|
---|
347 |
|
---|
348 | 6.2 トレースログ機能への対応
|
---|
349 |
|
---|
350 | ATK2-SC1から変更なし.
|
---|
351 |
|
---|
352 | 6.3 システム状態の管理
|
---|
353 |
|
---|
354 | 6.3.1 全割込み禁止状態の管理
|
---|
355 |
|
---|
356 | ATK2-SC1から変更なし.
|
---|
357 |
|
---|
358 | 6.3.2 コンテキストの管理
|
---|
359 |
|
---|
360 | ATK2-SC1から変更なし.
|
---|
361 |
|
---|
362 | 6.3.3 OS割込み禁止状態の管理
|
---|
363 |
|
---|
364 | ATK2-SC1から変更なし.
|
---|
365 |
|
---|
366 | 6.4 割込みに関連するシステム状態の管理
|
---|
367 |
|
---|
368 | 6.4.1 割込み優先度マスクの管理
|
---|
369 |
|
---|
370 | ATK2-SC1から変更なし.
|
---|
371 |
|
---|
372 | 6.4.2 割込みハンドラの先頭処理と末尾処理
|
---|
373 |
|
---|
374 | ATK2-SC1から変更なし.
|
---|
375 |
|
---|
376 | 6.4.3 個別割込み禁止状態の管理
|
---|
377 |
|
---|
378 | (6-4-3-1) void x_disable_int(InterruptNumberType intno)
|
---|
379 |
|
---|
380 | intnoで指定された割込み番号の割込みを禁止する.
|
---|
381 |
|
---|
382 | (6-4-3-2) void x_enable_int(InterruptNumberType intno)
|
---|
383 |
|
---|
384 | intnoで指定された割込み番号の割込みを許可する.
|
---|
385 |
|
---|
386 | 6.5 タスクディスパッチャ
|
---|
387 |
|
---|
388 | 6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
|
---|
389 |
|
---|
390 | (6-5-1-4) OMIT_STKMPUINFOB(オプション)
|
---|
391 | (6-5-1-5) STKMPUINFOB(オプション)
|
---|
392 |
|
---|
393 | MPU情報はターゲット依存なので,タスク初期化ブロック(TINIB)に入れたく
|
---|
394 | ない場合は,OMIT_STKMPUINFOBをマクロ定義し,TINIB中からSTKMPUINFOBを外
|
---|
395 | すことができる.
|
---|
396 |
|
---|
397 | OMIT_STKMPUINFOBをマクロ定義すると,TINIB中にMPU設定情報が含まれなくな
|
---|
398 | るため,それに代わる情報は,ターゲット依存部で管理する必要がある.
|
---|
399 |
|
---|
400 | また,OMIT_STKMPUINFOBを定義した場合,ジェネレータテンプレートファイル
|
---|
401 | から参照するtarget_def.csv(または,同等の役割を持つファイル)からTINIB
|
---|
402 | 関連のSTKMPUINFOB生成情報を削除することをお勧め.削除しない場合は,
|
---|
403 | TINIB関連のSTKMPUINFOB情報定義は,無意味値となるため,使用してはいけな
|
---|
404 | い.
|
---|
405 |
|
---|
406 | STKMPUINFOB管理する情報に関しては,「6.11.1 スタックのMPU設定情報ブロ
|
---|
407 | ック(STKMPUINFOB)」を参照.
|
---|
408 |
|
---|
409 | (6-5-1-6) OMIT_OSAPMPUINFOB(オプション)
|
---|
410 | (6-5-1-7) OSAPMPUINFOB(オプション)
|
---|
411 |
|
---|
412 | MPU情報はターゲット依存なので,OSアプリケーション初期化ブロック(OSAPINIB)
|
---|
413 | に入れたくない場合は,OMIT_OSAPMPUINFOBをマクロ定義し,OSAPINIB中から
|
---|
414 | OSAPMPUINFOBを外すことができる.
|
---|
415 |
|
---|
416 | OMIT_OSAPMPUINFOBをマクロ定義すると,OSAPINIB中にMPU設定情報が含まれな
|
---|
417 | くなるため,それに代わる情報は,ターゲット依存部で管理する必要がある.
|
---|
418 |
|
---|
419 | また,OMIT_OSAPMPUINFOBを定義した場合,ジェネレータテンプレートファイル
|
---|
420 | から参照するtarget_def.csv(または,同等の役割を持つファイル)から
|
---|
421 | OSAPINIB関連のOSAPMPUINFOB生成情報を削除する必要がある.
|
---|
422 |
|
---|
423 | OSAPMPUINFOB管理する情報に関しては,「6.11.2 OSAP固有MPU設定情報ブロック
|
---|
424 | (OSAPMPUINFOB)」を参照.
|
---|
425 |
|
---|
426 | 6.5.2 ディスパッチャ本体
|
---|
427 |
|
---|
428 | ディスパッチャ本体(dispatcher)は,ターゲット非依存部から直接呼び出さ
|
---|
429 | れることはなく,カーネルのターゲット依存部の内部からのみ呼び出される.
|
---|
430 | dispatcherは,タスクコンテキスト・OS割込み禁止状態・割込み優先度マスク
|
---|
431 | 全解除状態から呼び出される.
|
---|
432 |
|
---|
433 | dispatcherの処理内容は次の通り.
|
---|
434 |
|
---|
435 | ----------------------------------------
|
---|
436 | void
|
---|
437 | dispatcher(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 | られる状態になった後に,割込み発生を待たずに次に進んでもよい.この場合,
|
---|
517 | whileループによって,割込み発生を待つことになる.
|
---|
518 |
|
---|
519 | OS割込み禁止を解除するための情報(例えば,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 | その一方,タスクディスパッチによるタスク切り替え後に,
|
---|
542 | CFG_USE_PRETASKHOOK定義され,ユーザがプレタスクフックを定義した場合
|
---|
543 | (PreTaskHook != NULL),プレタスクフック呼び出しインターフェース
|
---|
544 | (call_pretaskhook)を呼出す必要がある.
|
---|
545 | そこで,アセンブリ言語で記述されているディスパッチャ処理中にプレ/ポス
|
---|
546 | トタスクフックの呼び出しを埋め込む.標準的なプレ/ポストタスクフックが
|
---|
547 | C言語で記述されていると想定して,それを呼び出すようにコーディングする.
|
---|
548 |
|
---|
549 | dispatcherをアセンブリ言語で記述する場合には,トレースログ取得処理は,
|
---|
550 | 「6.2 トレースログ機能への対応」の節で記述した方法でコーディングするこ
|
---|
551 | と.なお,log_dsp_enterは切換え前のタスクのスタックで,log_dsp_leave
|
---|
552 | は切換え後のタスクのスタックで実行する.
|
---|
553 |
|
---|
554 | 6.5.3 タスクコンテキストからのディスパッチ
|
---|
555 |
|
---|
556 | ATK2-SC1から変更なし.
|
---|
557 |
|
---|
558 | 6.5.4 ディスパッチャの動作開始
|
---|
559 |
|
---|
560 | ATK2-SC1から変更なし.
|
---|
561 |
|
---|
562 | 6.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 |
|
---|
571 | exit_and_dispatch_nohookは,タスクコンテキスト・OS割込み禁止状態・割込
|
---|
572 | み優先度マスク全解除状態で呼び出される.
|
---|
573 |
|
---|
574 | exit_and_dispatch_nohookとexit_and_dispatchは,ポストタスクフック呼ぶ
|
---|
575 | かどうか以外,同じである(タスク強制終了なので,p_runtsk=NULLとして実
|
---|
576 | 行).
|
---|
577 |
|
---|
578 | exit_and_dispatch_nohookの処理内容は次の通り.
|
---|
579 |
|
---|
580 | ----------------------------------------
|
---|
581 | void
|
---|
582 | exit_and_dispatch_nohook(void)
|
---|
583 | {
|
---|
584 | dispatcher_0に分岐する
|
---|
585 | }
|
---|
586 | ----------------------------------------
|
---|
587 |
|
---|
588 | 6.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)には,
|
---|
604 | dispatcherのみから分岐し,その時の状態は,タスクコンテキスト・OS割込み
|
---|
605 | 禁止状態・割込み優先度マスク全解除状態である.
|
---|
606 |
|
---|
607 | start_stask_rは,OS割込み禁止状態を解除した後,タスクの起動番地を呼び
|
---|
608 | 出す.
|
---|
609 | さらに,タスクの起動番地から戻ってきた場合には,exit_taskを呼び出す.
|
---|
610 |
|
---|
611 | start_utask_rは,OS割込み禁止状態を解除した後,CPUを非特権モードへ設定
|
---|
612 | する同時にタスクの起動番地を呼び出す.さらに,タスクの起動番地から戻っ
|
---|
613 | てきた場合には,exit_utaskを呼び出す.
|
---|
614 |
|
---|
615 | activate_contextとstart_rの処理内容は次の通り.
|
---|
616 |
|
---|
617 | ----------------------------------------
|
---|
618 | void
|
---|
619 | activate_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動作モードとタスクの呼出しは,同時に行う必要がある.
|
---|
675 | start_utask_r(信頼の場合は,start_stask_r)は,特権モードで呼出される
|
---|
676 | が,信頼OSアプリケーションに所属するタスクの場合,特権モードで,非信頼
|
---|
677 | OSアプリケーションに所属するタスクは,非特権モードで実行する必要がある
|
---|
678 | .例外/割込みからのリターン命令を使用するのが1つの方法である.
|
---|
679 |
|
---|
680 | 6.6 割込みハンドラ
|
---|
681 |
|
---|
682 | 6.6.1 割込みハンドラの出入口処理
|
---|
683 |
|
---|
684 | C2ISRの割込みの出入口処理の方法は,プロセッサによって大きく異なるが,
|
---|
685 | ATK2-SC3においては,おおよその処理内容は次の通り.
|
---|
686 |
|
---|
687 | ----------------------------------------
|
---|
688 | void
|
---|
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 |
|
---|
777 | 6.6.2 割込み要求ラインの属性の設定
|
---|
778 |
|
---|
779 | (6-6-2-1) void x_config_int(InterruptNumber intno,
|
---|
780 | AttributeType intatr,
|
---|
781 | PriorityType intpri)
|
---|
782 |
|
---|
783 | intatrとして設定できる割込み属性は次の通り.ATK2-SC3の場合は,intatrに
|
---|
784 | DISABLE/ENABLEいずれかが含まれ,ENABLEを指定した場合は,OS起動時に割込
|
---|
785 | みが許可され,DISABLEを指定した場合は禁止される.
|
---|
786 |
|
---|
787 | DISABLE 0x00 割込み要求禁止フラグをセット
|
---|
788 | ENABLE 0x01 割込み要求禁止フラグをクリア
|
---|
789 |
|
---|
790 | 6.6.3 割込み管理機能の初期化処理の変更
|
---|
791 |
|
---|
792 | (6-6-3-9) intatr:割込み属性
|
---|
793 |
|
---|
794 | 6.6.4 デフォルトのC2ISR
|
---|
795 |
|
---|
796 | ATK2-SC1から変更なし.
|
---|
797 |
|
---|
798 | 6.6.5 カーネル管理外の割込み
|
---|
799 |
|
---|
800 | ATK2-SC1から変更なし.
|
---|
801 |
|
---|
802 | 6.6.6 DisableAllInterrupts/EnableAllInterruptsの処理内容の変更
|
---|
803 |
|
---|
804 | ATK2-SC1から変更なし.
|
---|
805 |
|
---|
806 | 6.6.7 割込み禁止解除
|
---|
807 |
|
---|
808 | (6-6-7-1) LOCAL_INLINE void x_clear_nested_os_int(void)
|
---|
809 |
|
---|
810 | 6.7 スタックモニタリング
|
---|
811 |
|
---|
812 | SC3でもスタックモニタリング機能を実装する.非信頼タスクのユーザスタッ
|
---|
813 | クスタックは,メモリ保護ユニット(MPU)より保護されるが,以下のスタッ
|
---|
814 | クをスタックモニタリング機能で保護する.
|
---|
815 | (1)非信頼タスクのシステムスタック
|
---|
816 | (2)信頼タスクのシステムスタック
|
---|
817 | (3)システムスタック
|
---|
818 | (4)信頼関数実行時のスタック
|
---|
819 |
|
---|
820 | 6.7.1 ディスパッチャとC2ISRの出入口処理でのスタックモニタリング
|
---|
821 |
|
---|
822 | ディスパッチャとC2ISRの出入口処理でのスタックモニタリングでスタックオ
|
---|
823 | ーバーフローが検出された場合の処理は以下の通り.ATK2-SC3ではスタックオ
|
---|
824 | ーバーフロー検出時のcall_protectionhook_mainからはリターンする可能性が
|
---|
825 | ある.
|
---|
826 |
|
---|
827 | ----------------------------------------
|
---|
828 | #ifdef CFG_USE_STACKMONITORING
|
---|
829 | void
|
---|
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 |
|
---|
854 | 6.7.2 信頼関数実行の出口処理でのスタックモニタリング
|
---|
855 |
|
---|
856 | 一方,信頼関数実行の出口処理でのスタックモニタリングでスタックオーバー
|
---|
857 | フローが検出された場合の処理は以下の通り.ATK2-SC3ではスタックオーバー
|
---|
858 | フロー検出時のcall_protectionhook_mainからはリターンしない.
|
---|
859 |
|
---|
860 | ----------------------------------------
|
---|
861 | StatusType
|
---|
862 | CallTrustedFunction(...)
|
---|
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 |
|
---|
897 | 6.8 CPU例外ハンドラ
|
---|
898 |
|
---|
899 | CPU例外の出入口処理の方法はプロセッサによって大きく異なるが,おおよそ
|
---|
900 | の処理内容は次の通り.
|
---|
901 |
|
---|
902 | ----------------------------------------
|
---|
903 | void
|
---|
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 |
|
---|
971 | ret_exc以降の処理は,割込みの出入口処理のret_int以降の処理とほぼ同じで
|
---|
972 | あるため,ターゲットによっては,共通のルーチンを用いることができる可能
|
---|
973 | 性がある.
|
---|
974 |
|
---|
975 | CPU例外処理中に,全割込み禁止した場合,CPU例外戻った側に反映しなければ
|
---|
976 | ならないので,(*l)で変更した全割込み状態をリターン後にも反映するため,
|
---|
977 | 工夫する.
|
---|
978 |
|
---|
979 | 6.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 | ----------------------------------------
|
---|
1010 | uint32
|
---|
1011 | trap_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 |
|
---|
1070 | svc_tableは,システムサービステーブルと呼び,ソフトウェア割込みによる
|
---|
1071 | 実行したいシステムサービスの先頭アドレスが登録される.ソフトウェア割込
|
---|
1072 | みによるシステムサービス指定する場合は,システムサービスコードを用い
|
---|
1073 | る.
|
---|
1074 |
|
---|
1075 | no_support_service()関数は,不正な機能コードを指定して,システムサービ
|
---|
1076 | ス発行時の処理であり,エラーコードにE_OS_SERVICEIDを設定し,サービスID
|
---|
1077 | にOSServiceId_INVALIDを設定して,エラーフックを呼出す.
|
---|
1078 |
|
---|
1079 | 6.10 信頼OSAPと非信頼OSAPからのシステムサービス呼出し
|
---|
1080 |
|
---|
1081 | SC3のメモリ保護機能を実現するため,プロセッサは少なくとも特権モードと
|
---|
1082 | 非特権モードをサポートする必要がある.カーネル及び信頼OSアプリケーショ
|
---|
1083 | ンに所属する処理単位は特権モードで実行し,メモリ保護機構(MPU)が働か
|
---|
1084 | ない(※1).非信頼OSアプリケーションに所属する処理単位は非特権モード
|
---|
1085 | で実行し,メモリ保護機構(MPU)が働く.また,プロセッサは,ソフトウェ
|
---|
1086 | ア割込みなど非特権モードから特権モードへ遷移できる機能(命令)を有する.
|
---|
1087 |
|
---|
1088 | 信頼OSアプリケーションは,システムサービスを直接関数呼び出しできるが,
|
---|
1089 | 非信頼OSアプリケーションから,システムサービスを呼出すため,ソフトウェ
|
---|
1090 | ア割込みによる呼出し機能をターゲット依存部でカーネルのサービスコールの
|
---|
1091 | インタフェースを実装する.
|
---|
1092 |
|
---|
1093 | 6.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 |
|
---|
1118 | void
|
---|
1119 | _trap_StartOS(AppModeType Mode)
|
---|
1120 | {
|
---|
1121 | CAL_SVC_1N(void, TFN_STARTOS, AppModeType, Mode);
|
---|
1122 | }
|
---|
1123 |
|
---|
1124 | StatusType
|
---|
1125 | _trap_ActivateTask(TaskType TaskID)
|
---|
1126 | {
|
---|
1127 | CAL_SVC_1M(StatusType, TFN_ACTIVATETASK, TaskType, TaskID);
|
---|
1128 | }
|
---|
1129 | ----------------------------------------
|
---|
1130 |
|
---|
1131 | TFN_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は,意味を持つ.
|
---|
1174 | n:パラメータ数
|
---|
1175 | 範囲:0〜3(システムサービスのパラメータ数)
|
---|
1176 | ※ターゲット定義のシステムサービス追加した場合,その最大数に合わせ
|
---|
1177 | る
|
---|
1178 | x:戻り値
|
---|
1179 | 範囲:N(戻り値なし),M(戻り値あり)
|
---|
1180 |
|
---|
1181 | 6.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 |
|
---|
1197 | 6.10.3 非信頼OSAPからのシステムサービス呼出し
|
---|
1198 |
|
---|
1199 | ソースの先頭に,TOPPERS_SVC_FUNCCALLマクロを定義していない場合,システ
|
---|
1200 | ムサービスの実行は,ソフトウェア割込みよるシステムサービス実行となる.
|
---|
1201 | また,SVC_TRAP(system_service)より明示的にソフトウェア割込みによるシス
|
---|
1202 | テムサービス実行も出来る.
|
---|
1203 |
|
---|
1204 | 6.10.4 ターゲット依存システムサービスの追加
|
---|
1205 |
|
---|
1206 | ターゲット依存のシステムサービスを追加したい場合,ターゲット依存システ
|
---|
1207 | ムサービステーブルテーブルは,以下のマクロを用いて定義する.
|
---|
1208 |
|
---|
1209 | (6.10.4.1) PRC_SVC_TABLE
|
---|
1210 | (6.10.4.2) PRC_SVC_NUM
|
---|
1211 |
|
---|
1212 | ターゲット依存で,追加したいシステムサービスの先頭アドレスを
|
---|
1213 | PRC_SVC_TABLEマクロの定義に追加し,システムサービス定義の数を
|
---|
1214 | PRC_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"として展開され,
|
---|
1225 | target_svc_table_test.hファイル定義しているPRC_SVC_TABLEとPRC_SVC_NUM
|
---|
1226 | が有効となる.
|
---|
1227 |
|
---|
1228 | 上記ソフトウェア割込みによるシステムサービス呼び出し関係のファイルの生
|
---|
1229 | 成は,utils/gensvc_atk(サービスコールインタフェース生成プログラム)に
|
---|
1230 | よる自動生成が出来る.
|
---|
1231 |
|
---|
1232 | 6.11 メモリ保護機構(MPU)制御
|
---|
1233 |
|
---|
1234 | 6.11.1 スタックのMPU設定情報ブロック(STKMPUINFOB)
|
---|
1235 |
|
---|
1236 | MPUによるスタック領域保護するため,MPUに設定する情報を保持するブロック
|
---|
1237 | をターゲット依存部に定義する.MPU設定情報は,ターゲット依存であるが,
|
---|
1238 | 保持する情報は,以下である.
|
---|
1239 |
|
---|
1240 | (6.11.1.1) 領域の先頭番地
|
---|
1241 | (6.11.1.2) 領域の終端番地(若しくは領域のサイズ)
|
---|
1242 |
|
---|
1243 | 6.11.2 OSAP固有MPU設定情報ブロック(OSAPMPUINFOB)
|
---|
1244 |
|
---|
1245 | MPUによる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 |
|
---|
1256 | 6.11.3 MPU初期化処理
|
---|
1257 |
|
---|
1258 | MPU機能を有効するため,MPUの初期化を行う処理は,以下の通りである.
|
---|
1259 |
|
---|
1260 | ----------------------------------------
|
---|
1261 | void
|
---|
1262 | prc_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 |
|
---|
1281 | 6.11.4 OSAP固有MPU情報設定処理
|
---|
1282 |
|
---|
1283 | 各OSAP固有MPU情報をMPUに設定する機能は,以下の通りである.
|
---|
1284 |
|
---|
1285 | ----------------------------------------
|
---|
1286 | void
|
---|
1287 | prc_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 |
|
---|
1301 | 6.11.5 MPU依存のバックグラウンド領域チェック
|
---|
1302 |
|
---|
1303 | 先頭番地及び終端番地により,引数で指定される領域は,命令バックグラウン
|
---|
1304 | ド領域に入っている場合,AP_Executable権あり,データバックグラウンド領
|
---|
1305 | 域に入っている場合,AP_Writable | AP_Readable権あり,それ以外の場合,
|
---|
1306 | NO_ACCESS権を返す.
|
---|
1307 |
|
---|
1308 | ----------------------------------------
|
---|
1309 | AccessType
|
---|
1310 | probe_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 |
|
---|
1328 | 6.12 メモリ管理のチューニング
|
---|
1329 |
|
---|
1330 | 6.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 |
|
---|
1344 | check_osap_memory関数は,引数で指定したOSアプリケーションに対して,引
|
---|
1345 | 数で指定するメモリ領域のアクセス権のチェックを行う.信頼OSアプリケーシ
|
---|
1346 | ョンの場合は,バックグラウンドをチェックする(現実装では全領域アクセス
|
---|
1347 | 可能).非信頼OSアプリケーションの場合は,メモリオブジェクトのアクセス
|
---|
1348 | 属性(リード,ライト,実行)を返却する.
|
---|
1349 |
|
---|
1350 | check_isr_memory関数は,引数で指定した割込みにおいて,引数で指定したメ
|
---|
1351 | モリ開始アドレスとサイズのメモリ領域に対して,アクセス属性(リード,ラ
|
---|
1352 | イト,実行,スタック)を返す.また,引数で指定したメモリ領域は,メモリ
|
---|
1353 | オブジェクトを跨いだ場合,その情報を引数より返す必要がある.
|
---|
1354 |
|
---|
1355 | check_task_memory関数は,引数で指定したタスクにおいて,引数で指定したメ
|
---|
1356 | モリ開始アドレスとサイズのメモリ領域に対して,アクセス属性(リード,ラ
|
---|
1357 | イト,実行,スタック)を返す.また,引数で指定したメモリ領域は,メモリ
|
---|
1358 | オブジェクトを跨いだ場合,その情報を引数より返す必要がある.
|
---|
1359 |
|
---|
1360 | ----------------------------------------
|
---|
1361 |
|
---|
1362 | AccessType
|
---|
1363 | check_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 |
|
---|
1382 | AccessType
|
---|
1383 | check_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 |
|
---|
1404 | AccessType
|
---|
1405 | check_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 |
|
---|
1434 | 6.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 |
|
---|
1456 | 6.13 エラーフック,シャットダウンフック呼び出し
|
---|
1457 |
|
---|
1458 | 節番号以外,ATK2-SC1から変更なし.
|
---|
1459 |
|
---|
1460 | 6.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 |
|
---|
1476 | dataセクション初期化後に,bssセクションを初期化すれば,bssセクション初
|
---|
1477 | 期化ブロックは,する時,dataセクションは,読み専用データ領域に配置する
|
---|
1478 | 必要がない.
|
---|
1479 |
|
---|
1480 | また,OMIT_INITIALIZE_SECTIONSマクロを定義することで,非依存部定義した
|
---|
1481 | bssセクションとdataセクションの初期化処理を無効化して,
|
---|
1482 | initialize_sectionsを依存部で実装することができる.
|
---|
1483 |
|
---|
1484 | カーネル本体は,kerflgがfalse(=0)に初期化される以外に,bssセクショ
|
---|
1485 | ンが初期化されることに依存していないため,initialize_sectionsを依存部
|
---|
1486 | で用意する場合,bssセクション初期化分のシステムの起動時間を短縮するた
|
---|
1487 | めに,kerflgをfalseに初期化するだけで十分である.
|
---|
1488 |
|
---|
1489 | 6.15 カーネル内部のチューニング
|
---|
1490 |
|
---|
1491 | 6.15.1 ビットマップサーチ
|
---|
1492 |
|
---|
1493 | 節番号以外,ATK2-SC1から変更なし.
|
---|
1494 |
|
---|
1495 | 6.16 カーネル実装に関するその他の定義
|
---|
1496 |
|
---|
1497 | 6.16.1 エラーチェック方法の指定
|
---|
1498 |
|
---|
1499 | 節番号以外,ATK2-SC1から変更なし.
|
---|
1500 |
|
---|
1501 | 6.16.2 非タスクコンテキスト用のスタック領域
|
---|
1502 |
|
---|
1503 | 節番号以外,ATK2-SC1から変更なし.
|
---|
1504 |
|
---|
1505 | 6.16.3 空ラベルの定義
|
---|
1506 |
|
---|
1507 | 節番号以外,ATK2-SC1から変更なし.
|
---|
1508 |
|
---|
1509 | 6.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 |
|
---|
1518 | 6.16.5 スタックマジックナンバー領域操作マクロの定義
|
---|
1519 |
|
---|
1520 | (6-16-5-2) TOPPERS_SSTK_MAGIC_REGION(オプション)
|
---|
1521 |
|
---|
1522 | スタックモニタリングで使用するタスクシステムスタック用マジックナンバー
|
---|
1523 | の格納位置を返すマクロであり,スタックの成長方向がアドレスの大きい方か
|
---|
1524 | ら小さい方へ成長することをデフォルト実装としている.スタック成長方向に
|
---|
1525 | よりターゲットで再定義することができる.p_tinibで指定ししたタスク初期
|
---|
1526 | 化ブロックを基づいて,スタック成長方向によりターゲットで再定義すること
|
---|
1527 | ができる.
|
---|
1528 |
|
---|
1529 | 6.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 |
|
---|
1547 | 6.17 トレースログ機能に関する設定
|
---|
1548 |
|
---|
1549 | 6.17.1 取得できるトレースログの種類とマクロ
|
---|
1550 |
|
---|
1551 | 節番号以外,ATK2-SC1から変更なし.
|
---|
1552 |
|
---|
1553 | 6.17.2 トレースログ記録のサンプルコード
|
---|
1554 |
|
---|
1555 | 節番号以外,ATK2-SC1から変更なし.
|
---|
1556 |
|
---|
1557 | 6.18 フック,シャットダウンフックの強制終了
|
---|
1558 |
|
---|
1559 | (6-18-1) void call_trusted_hook(void *hook, StatusType arg)
|
---|
1560 |
|
---|
1561 | call_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 |
|
---|
1577 | exit_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)
|
---|
1585 | void call_nontrusted_hook(void *hook, StatusType arg, uint32 HookType)
|
---|
1586 |
|
---|
1587 | call_nontrusted_hookは非信頼フック呼出し時にターゲット非依存部から呼び
|
---|
1588 | 出される.非信頼フックの呼出しについて必要な処理を行う.
|
---|
1589 |
|
---|
1590 | ----------------------------------------
|
---|
1591 | void 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 |
|
---|
1641 | exit_nontrusted_hookはcall_nontrusted_hookにより実行されるフックルーチ
|
---|
1642 | ンから呼び出されることを想定している.非信頼フックの強制終了処理を行い,
|
---|
1643 | 呼び出し元には戻らない.
|
---|
1644 |
|
---|
1645 | 6.19 コア起動
|
---|
1646 |
|
---|
1647 | (6-19-1) LOCAL_INLINE boolean x_start_core(CoreIdType coreid)
|
---|
1648 |
|
---|
1649 | 指定されたコアの起動処理を行う.
|
---|
1650 |
|
---|
1651 | ----------------------------------------
|
---|
1652 | LOCAL_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 | ----------------------------------------
|
---|
1669 | LOCAL_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 |
|
---|
1679 | 6.20 フックの確認
|
---|
1680 |
|
---|
1681 | (6-20-1) LOCAL_INLINE boolean is_running_nontrusted_hook(void)
|
---|
1682 |
|
---|
1683 | 非信頼フックルーチンが実行中であるかを確認する.
|
---|
1684 |
|
---|
1685 | ----------------------------------------
|
---|
1686 | LOCAL_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 | ----------------------------------------
|
---|
1701 | LOCAL_INLINE boolean is_running_nontrusted_shtdwnhk(void)
|
---|
1702 | {
|
---|
1703 | if (非信頼フックルーチン実行中) {
|
---|
1704 | TRUEを返す
|
---|
1705 | } else {
|
---|
1706 | FALSEを返す
|
---|
1707 | }
|
---|
1708 | }
|
---|
1709 | ----------------------------------------
|
---|
1710 |
|
---|
1711 | 6.21 スタック切り替え
|
---|
1712 |
|
---|
1713 | call_protectionhk_main_stkchg (ercd)
|
---|
1714 |
|
---|
1715 | フック用スタックへの切り替えを実施した上でフックルーチンの実行を行う.
|
---|
1716 |
|
---|
1717 | 6.22 非信頼フックルーチンスタック領域
|
---|
1718 |
|
---|
1719 | (6-22-1) AccessType probe_nthkstk(MemorySizeType start, MemorySizeType end)
|
---|
1720 |
|
---|
1721 | 指定メモリ領域が非信頼フックルーチンスタック領域に存在するか確認する.
|
---|
1722 |
|
---|
1723 | ----------------------------------------
|
---|
1724 | AccessType 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 |
|
---|
1738 | cancel_nontrusted_hookはタスク強制終了時に,ターゲット非依存部から呼び出される.
|
---|
1739 | 非信頼フック実行中に非信頼フックスタック領域のMPU設定を無効化する.
|
---|
1740 |
|
---|
1741 | ----------------------------------------
|
---|
1742 | void cancel_nontrusted_hook(void)
|
---|
1743 | {
|
---|
1744 | if (非信頼フック実行前のスタックポインタ変数が0でない場合) {
|
---|
1745 | 非信頼フック実行前のスタックポインタ変数に0を設定
|
---|
1746 | 非信頼フックスタック領域に対して以下のように設定
|
---|
1747 | ・開始アドレス=0
|
---|
1748 | ・終了アドレス=0
|
---|
1749 | ・特権:読書き不可
|
---|
1750 | ・非特権:読書き不可
|
---|
1751 | }
|
---|
1752 | }
|
---|
1753 | ----------------------------------------
|
---|
1754 |
|
---|
1755 | 6.14 ハードウェアカウンタ
|
---|
1756 |
|
---|
1757 | ATK2-SC1から変更なし.
|
---|
1758 |
|
---|
1759 | 6.14.1 ハードウェアカウンタのファイル構成
|
---|
1760 |
|
---|
1761 | ATK2-SC1から変更なし.
|
---|
1762 |
|
---|
1763 | 6.14.2 ハードウェアカウンタの情報提供
|
---|
1764 |
|
---|
1765 | ATK2-SC1から変更なし.
|
---|
1766 |
|
---|
1767 |
|
---|
1768 | 7.ジェネレータ設定ファイルのターゲット依存部
|
---|
1769 |
|
---|
1770 | 7.1 設定ファイルとターゲット依存部の位置付け
|
---|
1771 |
|
---|
1772 | ATK2-SC3のジェネレータは,設定ファイルの記述に従ってファイルの生成およ
|
---|
1773 | びエラーチェックを行う.ジェネレータの設定ファイルには,以下の5つがあ
|
---|
1774 | る.
|
---|
1775 |
|
---|
1776 | (a) XMLコンテナテーブル
|
---|
1777 |
|
---|
1778 | ATK2-SC1から変更なし.
|
---|
1779 |
|
---|
1780 | (b) 値取得シンボルテーブル
|
---|
1781 |
|
---|
1782 | ATK2-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,
|
---|
1803 | datasecinib_table, bsssecinib_table, mpuinfo_shared(共有領域に対する
|
---|
1804 | MPUINFOB),OSAP専有領域に対するMPUINFOBの情報を出力する.
|
---|
1805 |
|
---|
1806 | (d) パス3のテンプレートファイル
|
---|
1807 |
|
---|
1808 | ジェネレータのパス3は,テンプレートファイルに従って,パス2で生成した,
|
---|
1809 | meminib_table, memtop_table, datasecinib_table, bsssecinib_table,
|
---|
1810 | mpuinfo_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で生成した,
|
---|
1827 | meminib_table, memtop_table, datasecinib_table, bsssecinib_table,
|
---|
1828 | mpuinfo_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 | なお,ジェネレータの詳細仕様と設定ファイルの記述方法については,別途
|
---|
1853 | PDFファイルの形で配布している「TOPPERS新世代カーネル用ジェネレータ仕様」
|
---|
1854 | および「TOPPERS新世代カーネル用ジェネレータ内蔵マクロプロセッサ仕様」
|
---|
1855 | を参照すること.
|
---|
1856 |
|
---|
1857 | 7.2 パス2のテンプレートファイルのターゲット依存部
|
---|
1858 |
|
---|
1859 |
|
---|
1860 | 7.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 |
|
---|
1967 | DEFINE_CONST_VARは,非依存部のテンプレートファイルでは,データセクション
|
---|
1968 | の初期化前に使用されるデータ(具体的には,ostkpt,tnum_datasec,
|
---|
1969 | datasecinib_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 |
|
---|
1991 | 7.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 |
|
---|
2001 | 7.3 パス3のテンプレートファイルのターゲット依存部
|
---|
2002 |
|
---|
2003 | 7.3.1 ターゲット非依存部をインクルードする前に定義すべき変数
|
---|
2004 |
|
---|
2005 | target_mem.tfからkernel_mem.tfをインクルードする前に,必要に応じて,次
|
---|
2006 | の変数を定義しておかなければならない.
|
---|
2007 |
|
---|
2008 | (7-3-1-2) $CFG_PASS3 = 1$
|
---|
2009 | (7-3-1-3) $CFG_PASS4 = 0$
|
---|
2010 |
|
---|
2011 | 7.4 パス4のテンプレートファイルのターゲット依存部
|
---|
2012 |
|
---|
2013 |
|
---|
2014 | 以下では,パス4のテンプレートファイルのターゲット依存部を記述する上で
|
---|
2015 | 必要な事項について説明する.
|
---|
2016 |
|
---|
2017 | 7.4.1 ターゲット非依存部をインクルードする前に定義すべき変数
|
---|
2018 |
|
---|
2019 | target_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 |
|
---|
2033 | 7.5 cfg1_out.cのリンクに必要なスタブの定義ファイル
|
---|
2034 |
|
---|
2035 | ----------------------------------------
|
---|
2036 | ...
|
---|
2037 | void
|
---|
2038 | initialize_sections(void)
|
---|
2039 | {
|
---|
2040 | }
|
---|
2041 | const MPUINFOB _background_code_region;
|
---|
2042 | const MPUINFOB _background_data_region;
|
---|
2043 | ----------------------------------------
|
---|
2044 |
|
---|
2045 | 7.6 data/bssセクション初期化ブロックの生成
|
---|
2046 |
|
---|
2047 | ターゲット依存部において,OMIT_STANDARD_DATASECINIBマクロを定義すると,
|
---|
2048 | ターゲット非依存部で,dataセクション初期化ブロックを生成しない.
|
---|
2049 |
|
---|
2050 | ターゲット依存部において,OMIT_STANDARD_BSSSECINIBマクロを定義すると,
|
---|
2051 | ターゲット非依存部で,bssセクション初期化ブロックを生成しない.
|
---|
2052 |
|
---|
2053 | dataセクションなどの先頭番地のラベルは,使用するコンパイラによっては,
|
---|
2054 | 非依存部で生成される初期化ブロックから参照されるラベルと異なる場合が
|
---|
2055 | ある.
|
---|
2056 | そのような場合に,これらのマクロを定義することで,ターゲット依存で
|
---|
2057 | 独自のdata/bssセクション初期化ブロックの生成処理を,テンプレートファイル
|
---|
2058 | によって定義することができる.
|
---|
2059 |
|
---|
2060 | 8.システムモジュール等のターゲット依存部
|
---|
2061 |
|
---|
2062 | 8.1 システムモジュールのターゲット依存部
|
---|
2063 |
|
---|
2064 | ATK2-SC1から変更なし.
|
---|
2065 |
|
---|
2066 | 8.2 システムログ機能のターゲット依存定義
|
---|
2067 |
|
---|
2068 | (8-2-3) ターゲット定義のシステムサービスの追加
|
---|
2069 | システムログ機能は,ターゲット追加のシステムサービスとして位置付け,シ
|
---|
2070 | ステムログ機能使用する/使用しない場合,システムサービステーブルに追加/
|
---|
2071 | 追加しないオプション(USE_KERNEL_LIBRARY_SYSLOG)をサポートする.
|
---|
2072 |
|
---|
2073 | USE_KERNEL_LIBRARY_SYSLOGマクロが定義されている場合,システムモジュー
|
---|
2074 | ルに用意している_kernel_KernelLibrarySyslog関数をターゲットで追加する
|
---|
2075 | システムサービステーブル定義(PRC_SVC_TABLE)に追加する.
|
---|
2076 | USE_KERNEL_LIBRARY_SYSLOGマクロが定義されない場合,
|
---|
2077 | _kernel_KernelLibrarySyslog関数をターゲットで追加するシステムサービス
|
---|
2078 | テーブル定義(PRC_SVC_TABLE)に追加しない.
|
---|
2079 |
|
---|
2080 | 8.3 シリアルインタフェースドライバのターゲット依存部
|
---|
2081 |
|
---|
2082 | 8.3.1 変数,データ型,管理関数
|
---|
2083 |
|
---|
2084 | ATK2-SC1から変更なし.
|
---|
2085 |
|
---|
2086 | 8.3.2 デバイスサービスルーチン
|
---|
2087 |
|
---|
2088 | ATK2-SC1から変更なし.
|
---|
2089 |
|
---|
2090 | 8.3.3 コールバックルーチン
|
---|
2091 |
|
---|
2092 | ATK2-SC1から変更なし.
|
---|
2093 |
|
---|
2094 | 8.4 カーネル起動メッセージの出力のターゲット依存定義
|
---|
2095 |
|
---|
2096 | ATK2-SC1から変更なし.
|
---|
2097 |
|
---|
2098 | 8.5 サンプルプログラムとテストプログラムのターゲット依存定義
|
---|
2099 |
|
---|
2100 | ATK2-SC1から変更なし.
|
---|
2101 |
|
---|
2102 | 8.6 実行時間分布集計モジュールのターゲット依存定義
|
---|
2103 |
|
---|
2104 | ATK2-SC1から変更なし.
|
---|
2105 |
|
---|
2106 | 8.7 タイマドライバ
|
---|
2107 |
|
---|
2108 | 8.7.1 タイマドライバのファイル構成
|
---|
2109 |
|
---|
2110 | ATK2-SC1から変更なし.
|
---|
2111 |
|
---|
2112 | 8.7.2 ソフトウェアカウンタの定義
|
---|
2113 |
|
---|
2114 | ATK2-SC1から変更なし.
|
---|
2115 |
|
---|
2116 | 8.7.3 時間型の定義
|
---|
2117 |
|
---|
2118 | ATK2-SC1から変更なし.
|
---|
2119 |
|
---|
2120 | 8.7.4 タイマの初期化・終了処理・割込み処理
|
---|
2121 |
|
---|
2122 | ATK2-SC1から変更なし.
|
---|
2123 |
|
---|
2124 | 8.7.5 現在の時刻の取得
|
---|
2125 |
|
---|
2126 | ATK2-SC1から変更なし.
|
---|
2127 |
|
---|
2128 | 9.その他
|
---|
2129 |
|
---|
2130 | 9.1 ドキュメント
|
---|
2131 |
|
---|
2132 | ATK2-SC1から変更なし.
|
---|
2133 |
|
---|
2134 | 10.リファレンス
|
---|
2135 |
|
---|
2136 | 10.1 ターゲット依存部のファイル一覧
|
---|
2137 |
|
---|
2138 | target_mem.tf ジェネレータのパス3のテンプレートファイルのター
|
---|
2139 | ゲット依存部(7.3 節).
|
---|
2140 | target_mem2.tf ジェネレータのパス4のテンプレートファイルのター
|
---|
2141 | ゲット依存部(7.4 節).
|
---|
2142 | target_mem.arxml ターゲット依存の標準ROM/RAMなどメモリリージョ
|
---|
2143 | ン定義のXMLコンテナコンフィギュレーション
|
---|
2144 | ファイル.
|
---|
2145 | target_svc.h ターゲット依存のソフトウェア割込みによるサービ
|
---|
2146 | スコールインタフェースヘッダーファイル.
|
---|
2147 | target_serial_obj.arxml シリアルドライバのシステムコンフィギュレーショ
|
---|
2148 | ンファイル.
|
---|
2149 | target_serial_osap.arxmlシリアルドライバのシステムコンフィギュレーショ
|
---|
2150 | ンファイル.
|
---|
2151 | target_test_obj.arxml テストプログラムのターゲット依存定義のコンフィ
|
---|
2152 | ギュレーションファイル.
|
---|
2153 | target_test_osap.arxml テストプログラムのターゲット依存定義のコンフィ
|
---|
2154 | ギュレーションファイル.
|
---|
2155 | target_timer_obj.arxml タイマドライバのXMLコンテナ用システムコンフィ
|
---|
2156 | ュレーションファイル.
|
---|
2157 | target_timer_osap.arxml タイマドライバのXMLコンテナ用システムコンフィ
|
---|
2158 | ュレーションファイル.
|
---|
2159 |
|
---|
2160 |
|
---|
2161 | 以上
|
---|