OSDN Git Service

cfd925c5c0a1031335c71a297e76e2578e80e961
[toppersasp4lpc/asp.git] / asp / doc / porting.txt
1
2                 TOPPERS/ASPカーネル
3                 ターゲット依存部 ポーティングガイド
4
5                 対応バージョン: Release 1.6.0
6                 最終更新: 2010年7月29日
7
8 このドキュメントは,TOPPERS/ASPカーネルを,未サポートのターゲットシステ
9 ムにポーティングするために必要となるターゲット依存部の実装方法を説明す
10 るものである.
11
12 ----------------------------------------------------------------------
13  TOPPERS/ASP Kernel
14      Toyohashi Open Platform for Embedded Real-Time Systems/
15      Advanced Standard Profile Kernel
16
17  Copyright (C) 2005-2010 by Embedded and Real-Time Systems Laboratory
18              Graduate School of Information Science, Nagoya Univ., JAPAN
19  
20  上記著作権者は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
21  ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
22  変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
23  (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
24      権表示,この利用条件および下記の無保証規定が,そのままの形でソー
25      スコード中に含まれていること.
26  (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
27      用できる形で再配布する場合には,再配布に伴うドキュメント(利用
28      者マニュアルなど)に,上記の著作権表示,この利用条件および下記
29      の無保証規定を掲載すること.
30  (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
31      用できない形で再配布する場合には,次のいずれかの条件を満たすこ
32      と.
33    (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
34        作権表示,この利用条件および下記の無保証規定を掲載すること.
35    (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
36        報告すること.
37  (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
38      害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
39      また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
40      由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
41      免責すること.
42  
43  本ソフトウェアは,無保証で提供されているものである.上記著作権者お
44  よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
45  に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
46  アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
47  の責任を負わない.
48  
49  $Id: porting.txt 1875 2010-07-29 16:21:36Z ertl-hiro $
50 ----------------------------------------------------------------------
51
52 ○目次
53
54 1.共通事項
55         1.1 ターゲット依存部の構成
56         1.2 名前の衝突の防止
57         1.3 多重インクルードの防止
58         1.4 アセンブリ言語とのヘッダファイルの共用 
59         1.5 インクルード記述の方法
60         1.6 クリティカルセクションの出入処理の実現に関する制約
61 2.システム構築環境のターゲット依存部
62         2.1 ターゲット略称とターゲット依存部のディレクトリ
63         2.2 Makefileのターゲット依存部
64         2.3 開発環境名とコマンド名の設定
65         2.4 コンパイルオプションとオブジェクトファイルの設定
66         2.5 オフセットファイルの生成方法
67                 2.5.1 makeoffset.cの記述方法
68         2.6 リンク方法の設定
69         2.7 依存関係の定義
70         2.8 その他の設定
71 3.TOPPERS共通定義のターゲット依存部
72         3.1 ターゲット識別マクロ
73         3.2 整数型の最大値・最小値・ビット数
74         3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
75         3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
76         3.5 コンパイラの拡張機能のためのマクロ定義
77         3.6 標準的な定義の上書き
78         3.7 アサーションのための定義
79 4.システムインタフェースレイヤ(SIL)のターゲット依存部
80         4.1 全割込みロック状態の管理
81         4.2 微少時間待ち
82         4.3 プロセッサのエンディアン
83         4.4 メモリ空間アクセス関数
84         4.5 I/O空間アクセス関数
85 5.カーネルAPIのターゲット依存部
86         5.1 ターゲット定義でサポートする機能
87         5.2 割込み優先度の範囲
88         5.3 タイムティックの定義
89         5.4 メモリ領域確保のための型定義
90         5.5 ビットパターンのビット数
91         5.6 メモリ領域確保のためのマクロ
92         5.7 オーバランハンドラ機能拡張のための定義(オプション)
93 6.カーネル実装のターゲット依存部
94         6.1 カーネル実装のターゲット依存部の共通事項
95                 6.1.1 カーネル実装のターゲット依存部の構成要素
96                 6.1.2 ターゲット依存部の関数の命名規則
97         6.2 トレースログ機能への対応
98         6.3 システム状態の管理
99                 6.3.1 全割込みロック状態の管理
100                 6.3.2 コンテキストの管理
101                 6.3.3 CPUロック状態の管理
102         6.4 割込みに関連するシステム状態の管理
103                 6.4.1 割込み優先度マスクの管理
104                 6.4.2 割込み要求禁止フラグの管理
105                 6.4.3 割込み要求のクリア
106                 6.4.4 割込み要求のプローブ
107                 6.4.5 割込みハンドラの先頭処理と末尾処理
108         6.5 タスクディスパッチャ
109                 6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
110                 6.5.2 ディスパッチャ本体
111                 6.5.3 タスクコンテキストからのディスパッチ
112                 6.5.4 ディスパッチャの動作開始
113                 6.5.5 現在のコンテキストを捨ててディスパッチ
114                 6.5.6 タスクの起動処理
115         6.6 割込みハンドラ
116                 6.6.1 割込みハンドラの出入口処理
117                 6.6.2 割込みハンドラ毎の出入口処理の生成
118                 6.6.3 割込みハンドラの設定
119                 6.6.4 割込み要求ラインの属性の設定
120                 6.6.5 割込み管理機能の初期化処理の変更
121                 6.6.6 デフォルトの割込みハンドラ
122                 6.6.7 カーネル管理外の割込み
123         6.7 CPU例外ハンドラとCPU例外発生時のシステム状態の参照
124                 6.7.1 CPU例外ハンドラの出入口処理
125                 6.7.2 CPU例外ハンドラの出入口処理の生成
126                 6.7.3 CPU例外ハンドラの設定
127                 6.7.4 CPU例外管理機能の初期化処理の変更
128                 6.7.5 デフォルトのCPU例外ハンドラ
129                 6.7.6 CPU例外発生時のシステム状態の参照
130         6.8 カーネルの起動・終了とスタック領域など
131         6.9 カーネル内部のチューニング
132                 6.9.1 ビットマップサーチ
133                 6.9.2 ビットフィールド
134         6.10 カーネル実装に関するその他の定義
135                 6.10.1 非タスクコンテキスト用のスタック領域
136                 6.10.2 空ラベルの定義
137         6.11 トレースログ機能に関する設定
138                 6.11.1 取得できるトレースログの種類とマクロ
139                 6.11.2 トレースログ記録のサンプルコード
140         6.12 カーネル実装のターゲット依存部のためのリネーム記述
141         6.13 タイマドライバ
142                 6.13.1 タイマドライバのファイル構成
143                 6.13.2 タイマの初期化・終了処理・割込み処理
144                 6.13.3 性能評価用システム時刻の参照のための機能
145         6.14 オーバランタイマドライバ(オプション)
146                 6.14.1 オーバランタイマドライバのファイル構成
147                 6.14.2 オーバランタイマの操作と割込み処理
148 7.コンフィギュレータ設定ファイルのターゲット依存部
149         7.1 設定ファイルとターゲット依存部の位置付け
150         7.2 パス2のテンプレートファイルのターゲット依存部
151                 7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
152                 7.2.2 ターゲット非依存部で定義される変数
153         7.3 パス3のテンプレートファイルのターゲット依存部
154         7.4 cfg1_out.cのリンクに必要なスタブの定義ファイル
155 8.システムサービス等のターゲット依存部
156         8.0 システムサービスのターゲット依存部
157         8.1 システムログ機能のターゲット依存定義
158         8.2 ログタスクのターゲット依存定義
159         8.3 シリアルインタフェースドライバのターゲット依存部
160                 8.3.1 変数,データ型,管理関数
161                 8.3.2 デバイスサービスルーチン
162                 8.3.3 コールバックルーチン
163         8.4 カーネル起動メッセージの出力のターゲット依存定義
164         8.5 サンプルプログラムとテストプログラムのターゲット依存定義
165         8.6 実行時間分布集計モジュールのターゲット依存定義
166 9.その他
167         9.1 ドキュメント
168         9.2 パッケージ記述ファイル
169 10.リファレンス
170         10.1 ターゲット依存部のファイル一覧
171
172
173 1.共通事項
174
175 1.1 ターゲット依存部の構成
176
177 ターゲット依存部は,targetディレクトリの下に,ターゲットハードウェアと
178 開発環境の組み合わせ毎に用意する.ただし,ターゲット依存部の再利用性を
179 考慮し,プロセッサ,チップ,開発環境のみに依存する部分を,プロセッサ依
180 存部,チップ依存部,開発環境依存部という形で切り分けてもよい.切り分け
181 方は,ターゲット依存部の実装に任されている.プロセッサ依存部,チップ依
182 存部,開発環境依存部は,archディレクトリの下に置く.
183
184 ASPカーネルのターゲット依存部は,システム構築環境(Makefile等)のターゲッ
185 ト依存部,TOPPERS共通定義(t_stddef.h)のターゲット依存部,システムイン
186 タフェースレイヤ(SIL,sil.h)のターゲット依存部,カーネルAPI(kernel.h)
187 のターゲット依存部,カーネル実装のターゲット依存部(コンフィギュレータ
188 設定ファイルのターゲット依存部を含む),システムサービスのターゲット依
189 存部,ターゲット依存部に関するドキュメント等で構成される.
190
191 1.2 名前の衝突の防止
192
193 TOPPERSプロジェクトが提供するソフトウェアのために,TOPPERS_で始まるシン
194 ボルを予約している.ヘッダファイル中に記述され,アプリケーションから参
195 照できる内部シンボルは,TOPPERS_で始まる名前とする.
196
197 また,_kernel_で始まるシンボルは,カーネル内部の変数や関数のために予約
198 している.カーネル内部の変数や関数の名前で,リンク時にアプリケーション
199 の名前と衝突する可能性があるものは,リネーム記述にリストアップすること
200 で,コンパイル時に_kernel_で始まる名前に置き換えることとしている.
201
202 1.3 多重インクルードの防止
203
204 すべてのヘッダファイルは,多重にインクルードされるのを防止するための条
205 件コンパイル記述を入れることとする.例えば,target_config.hであれば,ファ
206 イルの先頭に
207
208 #ifndef TOPPERS_TARGET_CONFIG_H
209 #define TOPPERS_TARGET_CONFIG_H
210
211 を,ファイルの末尾に
212
213 #endif /* TOPPERS_TARGET_CONFIG_H */
214
215 を記述する.
216
217 1.4 アセンブリ言語とのヘッダファイルの共用 
218
219 ASPカーネルのヘッダファイルの多くは,アセンブリ言語のソースファイルから
220 もインクルードできるようにするために,次のルールに従って記述するものと
221 する.
222
223 ・TOPPERS_MACRO_ONLYがマクロ定義されている場合には,アセンブリ言語では
224  解釈できない記述(マクロ定義以外の記述)を除くように記述する.
225
226 ・符号無し整数型の定数値は,UINT_CやULONG_Cなどの整数定数を作るためのマ
227  クロを用いて記述する.ただし,アセンブリ言語のソースファイルからもイ
228  ンクルードできるファイル中であっても,C言語のみで用いる定数をこれらの
229  マクロを使って記述する必要はない.
230
231 また,カーネル実装においては,次のルールに従うものとする.
232
233 ・アセンブリ言語からも用いる定数の定義中に型キャストを用いる場合には,
234  CASTマクロを用いて記述する.
235
236 アセンブリ言語からヘッダファイルをインクルードする際には,必要に応じて,
237 TOPPERS_MACRO_ONLY,UINC_C,ULONG_C,CASTをマクロ定義してから,インクルー
238 ドしなければならない.
239
240 1.5 インクルード記述の方法
241
242 開発環境で用意されている標準ヘッダファイルおよびincludeディレクトリ下の
243 標準ヘッダファイルは,「#include <...>」によりインクルードする.
244
245 その他のヘッダファイルは,「#include "..."」によりインクルードする.ヘッ
246 ダファイルが,カレントディレクトリやインクルードするファイルと同じディ
247 レクトリ以外のディレクトリに置かれている場合には,次のようにパス指定を
248 行う.
249
250 ・ターゲット依存部(target/<ターゲット名>)のディレクトリに置かれている
251  場合は,パス指定を行わず,ファイル名のみを記述する.
252                 例)#include "target_config.h"
253
254 ・archディレクトリ下のディレクトリに置かれている場合には,archディレク
255  トリからの相対パスで記述する.
256                 例)#include "m68k_gcc/prc_config.h"
257
258 ・その他の場合には,ソースプログラムのルートディレクトリ(configureが置
259  かれているディレクトリ)からの相対パスで記述する.
260                 例)#include "pdic/upd72001/upd72001.h"
261
262 ・カーネルを構成するファイルから,kernelディレクトリ下のヘッダファイル
263  をインクルードする場合は,パス指定を行わず,ファイル名のみを記述する.
264                 例)#include "kernel_impl.h"
265
266 1.6 クリティカルセクションの出入処理の実現に関する制約
267
268 カーネル内で用いるクリティカルセクションの出入処理を実現する場合には,
269 次の2つの条件を満たすように実装しなければならない.
270
271 (1-6-1) 出入処理から抜けた時点では,割込みの禁止/許可が完了していなけ
272 ればならない.例えば,割込み禁止/許可命令を実行してから実際に割込みが
273 禁止/許可されるまで何命令か遅延するプロセッサの場合には,出入処理の中
274 にNOP命令を入れるなどの方法で,出入処理を抜けた時点では,割込みが禁止/
275 許可された状態になっていることを保証しなければならない.
276
277 (1-6-2) メモリ上のデータ構造が書き変わる可能性があることを,何らかの方
278 法でコンパイラに知らせなければならない.GNU開発環境では,次のいずれかの
279 方法でこの制約を満たすことができる.
280
281 (a) クリティカルセクションの出入処理の全体または出入処理の本質的な部分
282         (具体的には,割込み禁止/許可する処理)を(インラインでない)通常
283         の関数により実現する.
284
285 (b) クリティカルセクションの出入処理の本質的な部分をインラインアセンブ
286         ラによって実現している場合には,そのインラインアセンブラのclobber変
287         数リストに"memory"を追加する.
288
289 (c) クリティカルセクションの出入処理の本質的な部分が,マクロやインライ
290         ン関数呼出しで実現している場合には,クリティカルセクションに入る処
291         理の最後と出る処理の先頭に,Asm("":::"memory")という記述を入れる.
292
293 このような制約を設ける理由については,「TOPPERS/ASPカーネル 設計メモ」
294 の「カーネルのデータ構造に対するvolatile宣言について」の節を参照するこ
295 と.
296
297
298 2.システム構築環境のターゲット依存部
299
300 この章の説明は,GNU開発環境(GCC,GAS,BINUTILS,GNU Make)を用いること
301 を想定して記述してある.それ以外の開発環境を用いる場合には,開発環境に
302 あわせて修正する必要がある.
303
304 2.1 ターゲット略称とターゲット依存部のディレクトリ
305
306 新しいターゲット依存部を作成する時は,まず,ターゲット略称を定める.ター
307 ゲット略称は,システム略称と開発環境略称を"_"で連結したものとする.シス
308 テム略称に用いる文字は英小文字と数字と"_"に,開発環境略称に用いる文字は
309 英小文字と数字に限定する.GNU開発環境の開発環境略称は,"gcc"とする.例
310 えば,システム略称が"dve68k"で,GNU開発環境を用いる場合には,ターゲット
311 略称は"dve68k_gcc"となる.
312
313 ターゲット依存部のファイルを置くために,targetディレクトリの下に,ター
314 ゲット略称を名称とするディレクトリを作成する.これをターゲット依存部ディ
315 レクトリと呼ぶ.
316
317 ターゲット依存部からプロセッサ依存部やチップ依存部を切り分ける場合には,
318 依存部略称を定める.依存部略称は,プロセッサやチップの略称と開発環境略
319 称を"_"で連結したものとする.プロセッサやチップの略称に用いる文字は,英
320 小文字と数字と"_"に限定する.例えば,プロセッサ略称が"m68k"で,GNU開発
321 環境を用いる場合には,依存部略称は"m68k_gcc"となる.
322
323 また,ターゲット依存部から開発環境依存部を切り分ける場合には,開発環境
324 略称を依存部略称とする.例えば,GNU開発環境依存部の依存部略称は,"gcc"
325 となる.
326
327 これらの依存部のファイルを置くために,archディレクトリの下に,依存部略
328 称を名称とするディレクトリを作成する.
329
330 なお,GNU開発環境以外の開発環境を用いる場合には,コンフィギュレーション
331 スクリプト(configure),サンプルのMakefile(sample/Makefile),一部の
332 ユーティリティプログラム(utils/genoffset,utils/makedep)を,その開発
333 環境用に用意する必要がある場合がある.その場合には,これらのファイルを,
334 ターゲット依存部ディレクトリか開発環境依存部ディレクトリに置くものとす
335 る.また,開発環境用のプロジェクトファイルが必要な場合には,ターゲット
336 依存部ディレクトリに置くものとする.
337
338 2.2 Makefileのターゲット依存部
339
340 Makefileのターゲット依存部は,ターゲット依存部ディレクトリに置いた
341 Makefile.targetまたはそこからインクルードされるファイル(プロセッサ・チッ
342 プ・開発環境依存部で用意されるファイルなど)に含める.
343
344 2.3 開発環境名とコマンド名の設定
345
346 開発環境名とコマンド名を設定するために,Makefileのターゲット依存部で次
347 の変数を定義する.
348
349 (2-3-1) TOOL                                    開発環境名
350
351 開発環境名に定義する.GNU開発環境を用いる場合には,gccに定義する.
352
353 (2-3-2) GCC_TARGET                              GNU開発環境のターゲット名
354
355 GNU開発環境を用いる場合に,GNU開発環境をconfigureする場合に指定するター
356 ゲット名に定義する.ここで指定したターゲット名は,開発環境のコマンド名
357 の先頭に付与される文字列となる.例えば,GCC_TARGETをm68k-unknown-elfに
358 定義した場合には,コンパイラとしてm68k-unknown-elf-gccが使われる.この
359 変数が定義されない場合には,単なるgccが使われる.
360
361 (2-3-3) CC                                              Cコンパイラドライバの名称
362 (2-3-4) CXX                                             C++コンパイラドライバの名称
363 (2-3-5) AS                                              アセンブラの名称
364 (2-3-6) LD                                              リンカの名称
365 (2-3-7) AR                                              アーカイバの名称
366 (2-3-8) NM                                              nmプログラムの名称
367 (2-3-9) RANLIB                                  ranlibプログラムの名称
368 (2-3-10) OBJCOPY                                objcopyプログラムの名称
369 (2-3-11) OBJDUMP                                objdumpプログラムの名称
370
371 GNU開発環境以外の開発環境を用いる場合に,それぞれのコマンドの名称に定義
372 する.対応するコマンドがない場合や,コマンドパラメータが異なる場合には,
373 Makefile中でそのコマンドを呼び出している部分を変更する必要がある.
374
375 GNU開発環境では,これらはGCC_TARGETを用いて定義されるので,定義する必要
376 はない.
377
378 2.4 コンパイルオプションとオブジェクトファイルの設定
379
380 Makefileのターゲット依存部で以下で説明する変数を定義する時には,":="を
381 用いて,それまでの定義に追加する形で行う.例えば,コンパイラに対するそ
382 の他のオプションとして「-Wall -g -O2」を追加したい場合には,「COPTS :=
383 $(COPTS) -Wall -g -O2」という記述をMakefileのターゲット依存部に含める.
384
385 (2-4-1) COPTS                           コンパイラに対するその他のオプション
386 (2-4-2) CDEFS                           マクロ定義オプション(-Dオプション)
387 (2-4-3) INCLUDES                        ヘッダファイルの置かれたディレクトリ指定オ
388                                                         プション(-Iオプション)
389 (2-4-4) LDFLAGS                         リンカに対するその他のオプション
390 (2-4-5) LIBS                            ライブラリリンク指定のためのオプション
391
392 ターゲットに依存して,すべてのソースファイルに共通するコンパイルオプショ
393 ンの追加が必要な場合には,オプションの種類毎に上に示した変数に定義する.
394
395 ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
396 下の記述を含める必要がある.
397
398 ----------------------------------------
399 INCLUDES := $(INCLUDES) -I$(TARGETDIR)
400 ----------------------------------------
401
402 ここでTARGETDIRは,ターゲット依存部ディレクトリに定義されている.また
403 SRCDIRは,Makefileにおいて,ソースプログラムのルートディレクトリ
404 (configureが置かれているディレクトリ)に定義されている.
405
406 コンパイラの問題等で,警告メッセージが出ることを防げない状況以外では,
407 COPTSに-Werrorを追加することを推奨する.
408
409 ----------------------------------------
410 COPTS := $(COPTS) -Werror
411 ----------------------------------------
412
413 カーネルのコンパイル時に,dereferencing type-punned pointer will break
414 strict-aliasing rulesという警告が出る場合には,以下を追加するとよい.こ
415 の警告メッセージに関する詳細は,「TOPPERS/ASPカーネル 設計メモ」の「型
416 キャストに伴う警告メッセージ」の節を参照すること.
417
418 ----------------------------------------
419 KERNEL_CFLAGS := $(KERNEL_CFLAGS) -fno-strict-aliasing
420 ----------------------------------------
421
422 また,アセンブリ言語レベルの識別名が,C言語レベルの識別名の先頭に"_"が
423 付いたものになる場合には,CDEFSに-DTOPPERS_LABEL_ASMを追加する.
424
425 (2-4-6) SYSSVC_DIR                      システムサービスのソースが置かれたディレクトリ
426 (2-4-7) SYSSVC_ASMOBJS          アセンブリ言語で記述されたシステムサービスの
427                                                         オブジェクト
428 (2-4-8) SYSSVC_COBJS            C言語で記述されたシステムサービスのオブジェクト
429 (2-4-9) SYSSVC_CFLAGS           システムサービスに対するコンパイルオプション
430 (2-4-10) SYSSVC_LIBS            システムサービスに対するライブラリリンク指定
431
432 ターゲットに依存して,システムサービス(システムログタスクやデバイスド
433 ライバなど)のソースが置かれたディレクトリ,システムサービスを構成する
434 オブジェクトファイルのリスト,それらをコンパイルする際に適用するコンパ
435 イルオプション,その構成に必要なライブラリリンク指定を追加する場合には,
436 上に示した変数に定義する.
437
438 (2-4-11) KERNEL_DIR                     カーネルのソースが置かれたディレクトリ
439 (2-4-12) KERNEL_ASMOBJS         アセンブリ言語で記述されたカーネルのオブジェクト
440 (2-4-13) KERNEL_COBJS           C言語で記述されたカーネルのオブジェクト
441 (2-4-14) KERNEL_CFLAGS          カーネルに対するコンパイルオプション
442
443 ターゲットに依存して,カーネルのソースが置かれたディレクトリ,カーネル
444 を構成するオブジェクトファイルのリスト,それらをコンパイルする際に適用
445 するコンパイルオプションを追加する場合には,上に示した変数に定義する.
446
447 ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
448 下の記述を含める必要がある.
449
450 ----------------------------------------
451 KERNEL_DIR := $(KERNEL_DIR) $(TARGETDIR)
452 KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) target_support.o
453 KERNEL_COBJS := $(KERNEL_COBJS) target_config.o target_timer.o
454 ----------------------------------------
455
456 (2-4-15) CFG_TABS                       コンフィギュレータに対するオプション
457
458 ターゲットに依存して,コンフィギュレータに対するオプションを追加する場
459 合には,上に示した変数に定義する.具体的には,コンフィギュレータの値取
460 得シンボルテーブルのターゲット依存部(target_def.csv)がある場合には,
461 それを指定するオプションを追加する必要がある.
462
463 ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
464 下の記述を含める必要がある.
465
466 ----------------------------------------
467 CFG_TABS := $(CFG_TABS) --cfg1-def-table $(TARGETDIR)/target_def.csv
468 ----------------------------------------
469
470 (2-4-16) CFG1_OUT_LDFLAGS       cfg1_out.cに対するリンクオプション
471
472 ターゲットに依存して,cfg1_out.cをリンクする際に適用するオプションを追
473 加する場合には,上に示した変数に定義する.
474
475 (2-4-17) CFG_OBJS                       システムコンフィギュレーションのためのオブ
476                                                         ジェクト
477
478 ターゲットに依存して,システムコンフィギュレーションのためのオブジェク
479 トファイルを(kernel_cfg.o以外に)追加する場合には,上に示した変数に定
480 義する.この場合,追加したオブジェクトファイルの作成ルール(コンパイル/
481 アセンブルルールと依存関係作成ルール)を,Makefileのターゲット依存部に
482 記述する必要がある.
483
484 (2-4-18) CFG2_OUT
485
486 ターゲットに依存して,コンフィギュレータのパス2でkernel_cfg.cと
487 kernel_cfg.h以外のファイルを生成する場合には,上に示した変数に定義する.
488
489 (2-4-19) OMIT_WARINIG_ALL
490 (2-4-20) OMIT_OPTIMIZATION
491
492 サンプルのMakefileでは,コンパイラに対するオプションに「-Wall -g -O2」
493 を追加する.-Wallを追加したくない場合には,Makefileのターゲット依存部で
494 OMIT_WARNING_ALLを"true"に定義する.-O2を追加したくない場合には,
495 Makefileのターゲット依存部でOMIT_OPTIMIZATIONを"true"に定義する.
496
497 2.5 オフセットファイルの生成方法
498
499 アセンブリ言語で記述されるプログラムから,C言語の構造体にアクセスする場
500 合には,構造体の各フィールドのオフセットを参照することが必要である.
501 ASPカーネルでは,必要なオフセット値を求めてファイル(標準ではoffset.h)
502 に生成するための仕組みとして,makeoffset.cとgenoffsetを用意している.
503 makeoffset.cは,どのオフセット値をファイルに生成するかを指定するもので,
504 ターゲット依存部で用意する必要がある.genoffsetは,現時点ではGNU開発環
505 境にのみ対応している.
506
507 makeoffset.cとgenoffsetを使うことで,例えば,TCB中のtexptnフィールドの
508 オフセット値をTCB_texptnにマクロ定義することや,TCB中のタスクコンテキス
509 トブロック(tskctxb)に含まれるpcフィールドのオフセット値をTCB_pcにマク
510 ロ定義することができる.また,TCB中のenatexフィールドのオフセット値,ビッ
511 ト位置,ビットマスクを,それぞれTCB_enatex,TCB_enatex_bit,
512 TCB_enatex_maskにマクロ定義することができる.
513
514 GNU開発環境以外を用いる場合など,この仕組みでオフセットファイルを生成で
515 きない時には,offset.hをターゲット依存部で用意し,Makefileのターゲット
516 依存部でOMIT_MAKEOFFSETを"true"に定義する.
517
518 拡張パッケージの中には,TCBにフィールドを追加するものがあるため,TCB中
519 のフィールドのオフセット値は変化する.makeoffset.cとgenoffsetを使う場合
520 でも,offset.hをターゲット依存部で用意する場合でも,拡張パッケージに対
521 応するためには,このことを考慮する必要がある.
522
523 2.5.1 makeoffset.cの記述方法
524
525 makeoffset.cを記述する場合には,既存のターゲット依存部に含まれる
526 makeoffset.cを修正するのが近道である.標準的なmakeoffset.cは,以下の6つ
527 の部分で構成されている.なお,makeoffset.cを新たに記述した際には,
528 offset.hに妥当な定義が生成されていることを確認するべきである.
529
530 (1) 必要なファイルのインクルード
531
532 オフセット値を求めたいフィールドを含む構造体を定義するヘッダファイルを
533 インクルードする.TCB中のフィールドのオフセット値を求めたい場合には,以
534 下の3行を含めればよい.
535
536 #include "kernel_impl.h"
537 #include "task.h"
538 #include "sil.h"
539
540 (2) オフセット値出力用マクロの定義
541
542 構造体中のフィールドのオフセット値の定義を生成するために用いるマクロ
543 (OFFSET_DEFとOFFSET_DEF2)の定義.これらのマクロの定義は,修正する必要
544 がない.
545
546 (3) オフセット値出力用関数の定義
547
548 構造体中のフィールドのオフセット値の定義を生成するための関数
549 (makeoffset)の定義.オフセット値のマクロ定義を生成したいフィールド毎
550 に,次のいずれかのマクロを記述する.
551
552 (2-5-1-1) OFFSET_DEF(TYPE, FIELD)
553
554 TYPEに構造体のデータ型名,FIELDにその構造体中のフィールドを指定すると,
555 TYPE_FIELDという名前のシンボルに,そのフィールドのオフセット値をマクロ
556 定義する記述を生成する.
557
558 (2-5-1-2) OFFSET_DEF2(TYPE, FIELD, FIELDNAME)
559
560 TYPEに構造体のデータ型名,FIELDにその構造体中のフィールドを指定すると,
561 TYPE_FIELDNAMEという名前のシンボルに,そのフィールドのオフセット値をマ
562 クロ定義する記述を生成する.構造体に含まれる構造体中のフィールドのオフ
563 セット値を求めたい場合には,こちらのマクロを使用する.
564
565 (4) エンディアンを参照するための関数の定義
566
567 SILで定義されたエンディアンを参照するための関数(sil_endian)の定義.こ
568 の関数の定義は,修正する必要がない.
569
570 (5) ビットオフセット値出力のための参照定義
571
572 初期値を持った変数定義に対して,コンパイラが生成するアセンブリ命令を参
573 照するための変数(BIT_REF_4,BIT_REF_2,BIT_REF_1)の定義.これらの定義
574 は,ほとんどの場合に修正する必要がない.ただし,uint8_t型のサポートされ
575 ていないターゲットでは,BIT_REF_1の定義は削除する必要がある.また,ポイ
576 ンタが64ビットのターゲット等では,BIT_REF_8の定義を追加しなければならな
577 いと思われる.
578
579 (6) ビットオフセット値出力用変数の定義
580
581 ビットのオフセット値,ビット位置,ビットマスクの定義を生成するためのデー
582 タ型の定義.これらの定義を生成したいビットフィールド毎に,以下の説明す
583 る変数を定義する.
584
585 構造体のデータ型名がTYPE,その構造体中のビットフィールド名がFIELDの場合
586 に,データ型がTYPEで,変数名がBIT_xy_TYPE_FIELDの変数を定義する.また,
587 その変数を,対象のビットのみが1で,他のすべてのビットが0になるように初
588 期化する.ここで,xはエンディアンを指定する文字で,B(ビッグエンディア
589 ン)またはL(リトルエンディアン)を指定する.またyには,ビットのオフセッ
590 ト,ビット位置,ビットマスクを,8ビット単位(バイト単位)で求める場合に
591 はBを,16ビット単位で求める場合にはHを,32ビット単位で求める場合にはWを
592 指定する.
593
594 これにより,TYPE_FIELDという名前のシンボルにそのビットのオフセット,
595 TYPE_FIELD_bitという名前のシンボルにビット位置,TYPE_FIELD_maskという名
596 前のシンボルにビットマスクをマクロ定義する記述を生成する.なお,ビット
597 位置は,LSBを0とした値(ビットリトルエンディアンを想定)を求める.
598
599 2.6 リンク方法の設定
600
601 (2-6-1) LDSCRIPT                                リンカスクリプトのファイル名
602
603 開発環境に標準のリンカスクリプトが使用できない場合には,ターゲット依存
604 部でリンカスクリプトを用意し,そのファイル名をこの変数に定義する.
605
606 (2-6-2) TEXT_START_ADDRESS              テキストセクションの先頭番地
607 (2-6-3) DATA_START_ADDRESS              データセクションの先頭番地
608
609 各セクションの先頭番地の指定が必要な場合には,これらの変数に先頭番地を
610 定義する.
611
612 (2-6-4) START_OBJS                              先頭にリンクすべきモジュール名
613 (2-6-5) END_OBJS                                最後にリンクすべきモジュール名
614
615 ターゲットによっては,ロードモジュールの先頭と最後にリンクすべきモジュー
616 ルを,ターゲット依存部で用意する必要がある.多くの場合,スタートアップ
617 モジュールをロードモジュールの先頭にリンクする必要がある.
618
619 ロードモジュールの先頭にリンクすべきプログラムがある場合には,Makefile
620 のターゲット依存部において,そのオブジェクトファイル名をSTART_OBJSに定
621 義し,それに対するコンパイルルールと依存関係作成ルールを定義する.ロー
622 ドモジュールの最後にリンクすべきモジュールがある場合には,そのオブジェ
623 クトファイル名をEND_OBJSに定義し,それに対するコンパイルルールと依存関
624 係作成ルールを定義する.また,標準のスタートアップモジュール(crt0.o)
625 をリンクしないように,LDFLAGSに-nostdlibを追加する必要がある.さら
626 に,-nostdlibをつけることで標準ライブラリがリンクされなくなるため,
627 LIBSに-lgccを追加しなければならない.
628
629 例えば,スタートアップモジュールのソースファイルがstart.Sの場合には,
630 Makefileのターゲット依存部に次のような記述を入れるとよい.
631
632 ----------------------------------------
633 # スタートアップモジュールのオブジェクトファイル名
634 START_OBJS = start.o
635
636 # スタートアップモジュールのコンパイルルール
637 $(START_OBJS): %.o: %.S
638         $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
639
640 # スタートアップモジュールの依存関係作成ルール
641 $(START_OBJS:.o=.d): %.d: %.S
642         @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
643                 -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
644
645 # リンカに対するオプション
646 LDFLAGS := -nostdlib $(LDFLAGS)
647 LIBS := $(LIBS) -lgcc
648 ----------------------------------------
649
650 また,GNU開発環境で,コンパイラに標準のcrtbegin.oとcrtend.oを用いる場合
651 には,Makefile のターゲット依存部に次のような記述を入れるとよい.
652
653 ----------------------------------------
654 # オブジェクトファイル名
655 START_OBJS = $(shell $(CC) -print-file-name=crtbegin.o)
656 END_OBJS = $(shell $(CC) -print-file-name=crtend.o)
657
658 # 依存関係作成ルール
659 $(START_OBJS:.o=.d): %.d:
660 $(END_OBJS:.o=.d): %.d:
661
662 # リンカに対するオプション
663 LDFLAGS := -nostdlib $(LDFLAGS)
664 LIBS := $(LIBS) -lgcc
665 ----------------------------------------
666
667 この場合,これらのファイルをコンパイルすることはないため,コンパイルルー
668 ルは不要である.また,依存関係作成ルールはダミーでよい(依存関係作成ルー
669 ルがないとエラーになる).
670
671 (2-6-6) HIDDEN_OBJS                             指定しなくてもリンクされるモジュール名
672
673 ロードモジュールにリンクすべきモジュールを,リンカに対するパラメータで
674 はなく,リンカスクリプト中に(例えば,GNU開発環境のリンカスクリプトの
675 STARTUPを使って)記述する場合には,そのオブジェクトファイル名を,
676 (START_OBJSまたはEND_OBJSではなく)HIDDEN_OBJSに定義し,それに対するコ
677 ンパイルルールと依存関係作成ルールを定義する.HIDDEN_OBJSに定義したモ
678 ジュールは,リンカに対するパラメータからは除外される.LIBSとLDFLAGSにつ
679 いては,START_OBJSまたはEND_OBJSを用いる場合と同様である.
680
681 例えば,スタートアップモジュールのソースファイルがstart.Sで,start.oを
682 リンクすることをリンカスクリプト中に記述する場合には,Makefileのターゲッ
683 ト依存部に次のような記述を入れるとよい.
684
685 ----------------------------------------
686 # スタートアップモジュールのオブジェクトファイル名
687 HIDDEN_OBJS = start.o
688
689 # スタートアップモジュールのコンパイルルール
690 $(HIDDEN_OBJS): %.o: %.S
691         $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
692
693 # スタートアップモジュールの依存関係作成ルール
694 $(HIDDEN_OBJS:.o=.d): %.d: %.S
695         @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
696                 -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
697
698 # リンカに対するオプション
699 LDFLAGS := -nostdlib $(LDFLAGS)
700 LIBS := $(LIBS) -lgcc
701 ----------------------------------------
702
703 2.7 依存関係の定義
704
705 コンフィギュレータの各パスに対して,ターゲット依存のファイルへの依存関
706 係を定義する.具体的には,パス1,パス2,パス3が依存するファイルを,それ
707 ぞれcfg1_out.c,kernel_cfg.timestamp,$(OBJFILE)に対する依存関係の形で
708 記述する.
709
710 ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
711 下の記述を含める必要がある.
712
713 ----------------------------------------
714 cfg1_out.c: $(TARGETDIR)/target_def.csv
715 kernel_cfg.timestamp: $(TARGETDIR)/target.tf
716 $(OBJFILE): $(TARGETDIR)/target_check.tf
717 ----------------------------------------
718
719 2.8 その他の設定
720
721 (2-8-1) CLEAN_FILES                             cleanにより削除するファイル名
722
723 cleanにより削除するファイルをターゲット依存部で追加したい場合には,ファ
724 イル名をこの変数に追加定義する.
725
726 (2-8-2) REALCLEAN_FILES                 realcleanにより削除するファイル名
727
728 realcleanにより削除するファイルをターゲット依存部で追加したい場合には,
729 ファイル名をこの変数に追加定義する.
730
731
732 3.TOPPERS共通定義のターゲット依存部
733
734 TOPPERS共通定義(t_stddef.h)のターゲット依存部は,target_stddef.hまた
735 はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存
736 部で用意されるヘッダファイルなど)に含める.
737
738 3.1 ターゲット識別マクロ
739
740 アプリケーションやシステムサービスでターゲットを識別するために,
741 "TOPPERS_"にシステム略称を大文字にした文字列を連結したもの(例えば,
742 "TOPPERS_DVE68K")をマクロ定義する.
743
744 また,ターゲット依存部からプロセッサ依存部やチップ依存部を切り分けた場
745 合には,"TOPPERS_"に依存部略称を大文字にした文字列を連結したもの(例え
746 ば,"TOPPERS_M68K")をマクロ定義する.
747
748 3.2 整数型の最大値・最小値・ビット数
749
750 (3-2-1) INT_MAX                         intに格納できる最大値(C90準拠)
751 (3-2-2) INT_MIN                         intに格納できる最小値(C90準拠)
752 (3-2-3) UINT_MAX                        unsigned intに格納できる最大値(C90準拠)
753 (3-2-4) LONG_MAX                        longに格納できる最大値(C90準拠)
754 (3-2-5) LONG_MIN                        longに格納できる最小値(C90準拠)
755 (3-2-6) ULONG_MAX                       unsigned longに格納できる最大値(C90準拠)
756 (3-2-7) CHAR_BIT                        char型のビット数(C90準拠)
757
758 整数型の最大値・最小値・ビット数を,これらのシンボルにマクロに定義する.
759
760 これらのマクロは,C90に準拠したものである.開発環境にC90に準拠した
761 limits.hが用意されている場合には,これらのマクロを定義することに代えて,
762 limits.hをインクルードすればよい.
763
764 3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
765
766 (3-3-1) int8_t                          符号付き8ビット整数(オプション,C99準拠)
767 (3-3-2) uint8_t                         符号無し8ビット整数(オプション,C99準拠)
768 (3-3-3) int16_t                         符号付き16ビット整数(C99準拠)
769 (3-3-4) uint16_t                        符号無し16ビット整数(C99準拠)
770 (3-3-5) int32_t                         符号付き32ビット整数(C99準拠)
771 (3-3-6) uint32_t                        符号無し32ビット整数(C99準拠)
772 (3-3-7) int64_t                         符号付き64ビット整数(オプション,C99準拠)
773 (3-3-8) uint64_t                        符号無し64ビット整数(オプション,C99準拠)
774 (3-3-9) int128_t                        符号付き128ビット整数(オプション,C99準拠)
775 (3-3-10) uint128_t                      符号無し128ビット整数(オプション,C99準拠)
776 (3-3-11) int_least8_t           8ビット以上の符号付き整数(C99準拠)
777 (3-3-12) uint_least8_t          8ビット以上の符号無し整数(C99準拠)
778 (3-3-13) intptr_t                       ポインタを格納できるサイズの符号付き整数(C99準拠)
779 (3-3-14) uintptr_t                      ポインタを格納できるサイズの符号無し整数(C99準拠)
780 (3-3-15) INT8_MAX                       int8_tに格納できる最大値(オプション,C99準拠)
781 (3-3-16) INT8_MIN                       int8_tに格納できる最小値(オプション,C99準拠)
782 (3-3-17) UINT8_MAX                      uint8_tに格納できる最大値(オプション,C99準拠)
783 (3-3-18) INT16_MAX                      int16_tに格納できる最大値(C99準拠)
784 (3-3-19) INT16_MIN                      int16_tに格納できる最小値(C99準拠)
785 (3-3-20) UINT16_MAX                     uint16_tに格納できる最大値(C99準拠)
786 (3-3-21) INT32_MAX                      int32_tに格納できる最大値(C99準拠)
787 (3-3-22) INT32_MIN                      int32_tに格納できる最小値(C99準拠)
788 (3-3-23) UINT32_MAX                     uint32_tに格納できる最大値(C99準拠)
789 (3-3-24) INT64_MAX                      int64_tに格納できる最大値(オプション,C99準拠)
790 (3-3-25) INT64_MIN                      int64_tに格納できる最小値(オプション,C99準拠)
791 (3-3-26) UINT64_MAX                     uint64_tに格納できる最大値(オプション,C99準拠)
792 (3-3-27) INT128_MAX                     int128_tに格納できる最大値(オプション,C99準拠)
793 (3-3-28) INT128_MIN                     int128_tに格納できる最小値(オプション,C99準拠)
794 (3-3-29) UINT128_MAX            uint128_tに格納できる最大値(オプション,C99準拠)
795 (3-3-30) INT_LEAST8_MAX         int_least8_tに格納できる最大値(C99準拠)
796 (3-3-31) INT_LEAST8_MIN         int_least8_tに格納できる最小値(C99準拠)
797 (3-3-32) UINT_LEAST8_MAX        uint_least8_tに格納できる最大値(C99準拠)
798 (3-3-33) INT8_C(val)            int_least8_t型の定数を作るマクロ(C99準拠)
799 (3-3-34) UINT8_C(val)           uint_least8_t型の定数を作るマクロ(C99準拠)
800 (3-3-35) INT16_C(val)           int16_t型の定数を作るマクロ(C99準拠)
801 (3-3-36) UINT16_C(val)          uint16_t型の定数を作るマクロ(C99準拠)
802 (3-3-37) INT32_C(val)           int32_t型の定数を作るマクロ(C99準拠)
803 (3-3-38) UINT32_C(val)          uint32_t型の定数を作るマクロ(C99準拠)
804 (3-3-39) INT64_C(val)           int64_t型の定数を作るマクロ(オプション,C99準拠)
805 (3-3-40) UINT64_C(val)          uint64_t型の定数を作るマクロ(オプション,C99準拠)
806 (3-3-41) INT128_C(val)          int128_t型の定数を作るマクロ(オプション,C99準拠)
807 (3-3-42) UINT128_C(val)         uint128_t型の定数を作るマクロ(オプション,C99準拠)
808
809 指定されたサイズの整数型を,これらのシンボルに型定義する.また,データ
810 型に格納できる最大値・最小値と,整数定数を作るマクロを,これらのシンボ
811 ルにマクロ定義する.
812
813 これらのデータ型およびマクロは,C99に準拠したものである.開発環境にC99
814 に準拠したstdint.hが用意されている場合には,これらのデータ型およびマク
815 ロを定義することに代えて,stdint.hをインクルードすればよい.
816
817 上でオプションと記述したものは,該当するデータ型がコンパイラでサポート
818 されている場合にのみ定義することを示す.
819
820 3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
821
822 (3-4-1) float32_t                       IEEE754準拠の32ビット単精度浮動小数点数(オプ
823                                                         ション)
824 (3-4-2) double64_t                      IEEE754準拠の64ビット倍精度浮動小数点数(オプ
825                                                         ション)
826 (3-4-3) FLOAT32_MIN                     float32_tに格納できる最小の正規化された正の浮
827                                                         動小数点数(オプション)
828 (3-4-4) FLOAT32_MAX                     float32_tに格納できる表現可能な最大の有限浮動
829                                                         小数点数(オプション)
830 (3-4-5) DOUBLE64_MIN            double64_tに格納できる最小の正規化された正の浮
831                                                         動小数点数(オプション)
832 (3-4-6) DOUBLE64_MAX            double64_tに格納できる表現可能な最大の有限浮動
833                                                         小数点数(オプション)
834
835 指定されたサイズ・表現形式の浮動小数点型を,これらのシンボルに型定義す
836 る.また,データ型に格納できる最大値・最小値を,これらのシンボルにマク
837 ロ定義する.
838
839 いずれも,該当するデータ型がコンパイラでサポートされている場合にのみ定
840 義する.
841
842 3.5 コンパイラの拡張機能のためのマクロ定義
843
844 コンパイラの拡張機能を用いるためのマクロとして,必要に応じて,以下のマ
845 クロの定義を含める.
846
847 (3-5-1) inline(オプション,デフォルトは未定義)
848 (3-5-2) Inline(オプション,デフォルトはstatic inline)
849
850 インライン関数であることを示す指定.Inlineは,コンパイル単位にローカル
851 なインライン関数であることを示す.
852
853 (3-5-3) asm(オプション,デフォルトは未定義)
854 (3-5-4) Asm(オプション,デフォルトは未定義)
855
856 インラインアセンブラを記述するための指定.Asmは,最適化により削除しては
857 ならないことを示す.これらは,ターゲット依存部でのみ使うマクロであるた
858 め,ターゲット依存部で使わないなら定義する必要はない.
859
860 (3-5-5) offsetof(structure, field)(オプション,デフォルトの定義あり)
861
862 構造体structureの中での,フィールドfieldのオフセットを求めるマクロ.
863
864 (3-5-6) alignof(type)(オプション,デフォルトの定義あり)
865
866 データ型typeのアラインメント単位を求めるマクロ.
867
868 (3-5-7) NoReturn(オプション,デフォルトは未定義)
869
870 リターンすることのない関数であることを示す指定.これは,ターゲット依存
871 部のみ使うマクロであるため,ターゲット依存部で使わないなら定義する必要
872 はない.
873
874 3.6 標準的な定義の上書き
875
876 t_stddef.hに含まれるTOPPERS共通定義の標準的な定義を上書きする場合には,
877 以下のマクロを定義する.
878
879 (3-6-1) TOPPERS_bool(オプション,デフォルトはint)
880 (3-6-2) TOPPERS_size(オプション,デフォルトはuintptr_t)
881 (3-6-3) TOPPERS_fp(オプション,デフォルトは他と互換性のない関数ポインタ)
882
883 それぞれ,bool_t,SIZE,FPに型定義すべきデータ型.
884
885 (3-6-4) UINT_C(val)(オプション,デフォルトはUを付加)
886 (3-6-5) ULONG_C(val)(オプション,デフォルトはULを付加)
887
888 それぞれ,unsigned uint型,unsigned long型の定数を作るためのマクロ.
889
890 (3-6-6) NULL(オプション,デフォルトは0)
891
892 C90準拠のC言語環境では,NULLの定義はstddef.hに含まれているため,これを
893 インクルードしてもよい.
894
895 (3-6-7) ERCD(mercd, sercd)(オプション)
896 (3-6-8) MERCD(ercd)(オプション)
897 (3-6-9) SERCD(ercd)(オプション)
898
899 ERCD,MERCD,SERCDの標準の定義は,符号付き整数が2の補数で表現されており,
900 右シフト演算子(>>)が算術シフトされることを仮定している.多くのコンパ
901 イラでこの仮定が成り立つが,そうでない場合には,ターゲット依存部でこれ
902 らの定義を上書きする必要がある.
903
904 (3-6-10) ALIGN_TYPE(addr, type)(オプション)
905
906 アドレスaddrが,データ型typeのアラインメント単位にアラインしているか
907 チェックするマクロ.
908
909 3.7 アサーションのための定義
910
911 t_stddef.hには,assertの定義が含まれる.assertが失敗した場合(assertの
912 パラメータがfalseになった場合)の処理を,ターゲット依存に用意する必要が
913 ある.これらの定義は,assertマクロを使用する前であれば,t_stddef.h以降
914 にインクルードされるファイルに含まれていてもよい.なお,assertを無効に
915 する(NDEBUGをマクロ定義してコンパイルする)場合には,これらを用意する
916 必要はない.
917
918 (3-7-1) TOPPERS_assert_abort(void)
919
920 assertが失敗した場合に,プログラムを停止させる関数.システム開発中はデ
921 バッガに落とすのが理想的である.システム稼働時には例外処理を行わせるこ
922 とになる.
923
924 (3-7-2) TOPPERS_assert_fail(exp, file, line)
925
926 assertが失敗した時の情報を表示/記録するためのマクロ.システムログ機能を
927 用いる場合には,t_syslog.hにシステムログ機能に記録するための定義が含ま
928 れているので,ターゲット依存部で用意する必要はない.
929
930
931 4.システムインタフェースレイヤ(SIL)のターゲット依存部
932
933 システムインタフェースレイヤ(SIL,sil.h)のターゲット依存部の定義は,
934 target_sil.hまたはそこからインクルードされるファイル(プロセッサ・チッ
935 プ・開発環境依存部で用意されるヘッダファイルなど)に含める.
936
937 SILのサービスコールは,任意のシステム状態で呼び出すことができる.そのた
938 め,SILのターゲット依存部の関数は,任意のシステム状態で呼び出せるように
939 実装しなければならない.
940
941 4.1 全割込みロック状態の管理
942
943 SILのターゲット依存部では,全割込みロック状態へ遷移する機能と,元の状態
944 へ戻す機能(元の状態を記憶するために変数を使う)を提供する.全割込みロッ
945 ク状態であるかを判別する機能は提供する必要がない.
946
947 SILの機能は,カーネルを使用しない場合にも使用できる必要がある.そのため,
948 全割込みロック状態への遷移と元の状態への復帰は,カーネルを用いず,プロ
949 セッサのリソースを直接操作することによって実現する.また,全割込みロッ
950 ク状態への遷移と元の状態への復帰は,全割込みロック状態やCPUロック状態で
951 も行える必要がある.
952
953 保護機能を持ったカーネルでは,ユーザタスクからプロセッサのリソースを直
954 接操作することができないため,ユーザタスクからはこれらの機能を用いるこ
955 とができない.用いた場合の振舞いはターゲットプロセッサに依存するが,典
956 型的には,特権命令違反などのCPU例外が発生することになる.
957
958 (4-1-1) SIL_PRE_LOC
959
960 全割込みロックフラグの状態を保存するための変数を定義するマクロ.型名の
961 後に,変数名を続けたものに定義する.変数名は,他の名前と衝突しないよう
962 に,"TOPPERS_"で始まる名前にする.
963
964 (4-1-2) SIL_LOC_INT()
965
966 現在の全割込みロックフラグの状態をSIL_PRE_LOCで定義した変数に保存し,全
967 割込みロック状態に遷移させるマクロ.このマクロを実現する際には,「1.6
968 クリティカルセクションの出入処理の実現に関する制約」の節に記述されてい
969 る制約に従わなければならない.
970
971 (4-1-3) SIL_UNL_INT()
972
973 SIL_LOC_INT()によって変数に保存した状態に戻すマクロ.このマクロを実現す
974 る際には,「1.6 クリティカルセクションの出入処理の実現に関する制約」の
975 節に記述されている制約に従わなければならない.
976
977 4.2 微少時間待ち
978
979 (4-2-1) void sil_dly_nse(ulong_t dlytim)
980
981 dlytimで指定された以上の時間(単位はナノ秒),ループなどによって待つ関
982 数.
983
984 以下の関数と等価な処理を,アセンブリ言語で記述する方法を,標準的な実装
985 方法とする.アセンブリ言語で記述するのは,コンパイラの最適化に依存しな
986 いようにするためである.またこの関数は,キャッシュ等の影響を受けないよ
987 うに,できる限りメモリアクセスを行わないように実装すべきである.
988
989         void sil_dly_nse(ulong_t dlytim)
990         {
991                 dlytim -= SIL_DLY_TIM1;
992                 if (結果が0より大きい) {
993                         do {
994                                 dlytim -= SIL_DLY_TIM2;
995                         } while (結果が0より大きい);
996                 }
997         }
998
999 この関数の動作は次の通りである.dlytimがSIL_DLY_TIM1以下の場合には,最
1000 初のif文の条件が成立せず,すぐに関数から抜ける.dlytimがSIL_DLY_TIM1よ
1001 り大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2)以下の場合には,最初のif文の条件は
1002 成立するが,doループは1回も回らずに関数から抜ける.dlytimが
1003 (SIL_DLY_TIM1+SIL_DLY_TIM2)より大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2*2)以
1004 下の場合には,doループを1回だけ回って関数から抜ける.その後,dlytimが
1005 SIL_DLY_TIM2大きくなる度に,whileループを回る回数が1回ずつ増える.
1006
1007 なお,この関数をアセンブリ言語(または,C言語)で記述する場合,どのファ
1008 イルに記述するかが問題になる.SILのターゲット依存部には,標準では,アセ
1009 ンブリ言語(または,C言語)の関数定義を記述するためのファイルを用意して
1010 いない.ターゲット依存で用意してもよいが,例外的に,カーネル実装のター
1011 ゲット依存モジュール(target_support.Sまたはtarget_config.c)に記述して
1012 もよいことにする.
1013
1014 (4-2-2) SIL_DLY_TIM1(オプション)
1015 (4-2-3) SIL_DLY_TIM2(オプション)
1016
1017 sil_dly_nseを上記の標準的な方法で実現した場合,この2つの定数をターゲッ
1018 ト依存部でマクロ定義する.
1019
1020 SIL_DLY_TIM2は,上記の関数において,doループ1回の実行時間(単位はナノ秒)
1021 に設定する.ターゲットプロセッサの命令セットにもよるが,おおよそ,減算
1022 命令と条件分岐命令各1回の実行時間になる.SIL_DLY_TIM2が決まれば,関数呼
1023 出しも含めた全体の時間がdlytimで指定された以上の時間になるように,
1024 SIL_DLY_TIM1を決める.
1025
1026 この2つの定数値の決定を支援するプログラムとして,testディレクトリに,
1027 test_dlynseを用意している.test_dlynseを実行すると,次のような出力が得
1028 られる.
1029
1030 -- for fitting parameters --
1031 sil_dly_nse(0): 430 OK
1032 sil_dly_nse(420): 430 OK
1033 sil_dly_nse(510): 520 OK
1034 sil_dly_nse(600): 610 OK
1035 <中略>
1036 -- for checking boundary conditions --
1037 sil_dly_nse(421): 520 OK
1038 sil_dly_nse(511): 610 OK
1039 sil_dly_nse(601): 700 OK
1040
1041 "for fitting parameters"に続く出力は,sil_dly_nse(dlytim)を呼び出した場
1042 合の待ち時間を測定した結果である.このプログラムを用いて,":"の右側の数
1043 値が,dlytimよりも大きい範囲でなるべく近い値になるように,2つの定数値を
1044 調整する."for checking boundary conditions"に続く出力は,プログラムの
1045 妥当性をチェックするためのもので,":"の右側の数値が,dlytimよりも大きい
1046 ことを確認する(近い値になる必要はない).
1047
1048 4.3 プロセッサのエンディアン
1049
1050 (4-3-1) SIL_ENDIAN_BIG
1051 (4-3-2) SIL_ENDIAN_LITTLE
1052
1053 プロセッサのエンディアンにより,いずれか片方のシンボルをマクロ定義する.
1054
1055 (4-3-3) TOPPERS_SIL_REV_ENDIAN_UINT16(オプション)
1056 (4-3-4) TOPPERS_SIL_REV_ENDIAN_UINT32(オプション)
1057
1058 それぞれ,16ビット,32ビットの符号無し整数のエンディアンを反転させるマ
1059 クロ.プロセッサがエンディアン反転のための命令を持つ場合には,その命令
1060 を用いて実現する.これらのシンボルをマクロ定義しない場合には,デフォル
1061 トの定義が使われる.
1062
1063 4.4 メモリ空間アクセス関数
1064
1065 (4-4-1) TOPPERS_OMIT_SIL_ACCESS
1066
1067 標準のメモリ空間アクセス関数を使用せず,ターゲット依存部で用意する場合
1068 には,このシンボルをマクロ定義する.
1069
1070 (4-4-2) TOPPERS_OMIT_SIL_REH_LEM
1071 (4-4-3) TOPPERS_OMIT_SIL_WRH_LEM
1072 (4-4-4) TOPPERS_OMIT_SIL_REH_BEM
1073 (4-4-5) TOPPERS_OMIT_SIL_WRH_BEM
1074 (4-4-6) TOPPERS_OMIT_SIL_REW_LEM
1075 (4-4-7) TOPPERS_OMIT_SIL_WRW_LEM
1076 (4-4-8) TOPPERS_OMIT_SIL_REW_BEM
1077 (4-4-9) TOPPERS_OMIT_SIL_WRW_BEM
1078
1079 それぞれ,標準のsil_reh_lem,sil_wrh_lem,sil_reh_bem,sil_wrh_bem,
1080 sil_rew_lem,sil_wrw_lem,sil_rew_bem,sil_wrw_bemを使用せず,ターゲッ
1081 ト依存部で用意する場合には,これらのシンボルをマクロ定義する.
1082
1083 4.5 I/O空間アクセス関数
1084
1085 メモリ空間とは別にI/O空間を持つプロセッサでは,I/O空間にあるデバイスレ
1086 ジスタをアクセスするための関数として,sil_reb_iop,sil_wrb_iop,
1087 sil_reh_iop,sil_wrh_iop,sil_reh_lep,sil_wrh_lep,sil_reh_bep,
1088 sil_wrh_bep,sil_rew_iop,sil_wrw_iop,sil_rew_lep,sil_wrw_lep,
1089 sil_rew_bep,sil_wrw_bepの中で必要なものを,ターゲット依存部で用意する.
1090
1091
1092 5.カーネルAPIのターゲット依存部
1093
1094 カーネルAPI(kernel.h)のターゲット依存部の定義は,target_kernel.hまた
1095 はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存
1096 部で用意されるヘッダファイルなど)に含める.
1097
1098 5.1 ターゲット定義でサポートする機能
1099
1100 (5-1-1) TOPPERS_TARGET_SUPPORT_DIS_INT          dis_intをサポートする
1101 (5-1-2) TOPPERS_TARGET_SUPPORT_ENA_INT          ena_intをサポートする
1102 (5-1-3) TOPPERS_TARGET_SUPPORT_GET_UTM          get_utmをサポートする
1103
1104 dis_int,ena_int,get_utmをサポートする場合に,それぞれのシンボルをマク
1105 ロ定義する.
1106
1107 5.2 割込み優先度の範囲
1108
1109 (5-2-1) TMIN_INTPRI                             割込み優先度の最小値(最高値)
1110 (5-2-2) TMAX_INTPRI                             割込み優先度の最大値(最低値)
1111
1112 それぞれ,カーネル管理の割込み優先度の最小値(=優先度が最高),カーネ
1113 ル管理の割込み優先度の最大値(優先度が最低)に定義する.TMAX_INTPRIは-1
1114 に固定されているが,対称性のために,ターゲット依存部で定義することにし
1115 ている.
1116
1117 5.3 タイムティックの定義
1118
1119 (5-3-1) TIC_NUME                                タイムティックの周期の分子
1120 (5-3-2) TIC_DENO                                タイムティックの周期の分母
1121
1122 タイムティックの周期(signal_timeを呼び出す周期)を,ミリ秒単位で,
1123 TIC_NUME/TIC_DENOに定義する.例えば,タイムティックの周期が1/30秒の場合
1124 には,TIC_NUMEを100に,TIC_DENOを3に定義すればよい.
1125
1126 タイムティックの周期は,1ミリ秒とする(つまり,TIC_NUME,TIC_DENOとも1
1127 に定義する)ことを推奨するが,シミュレーション環境や性能の低いプロセッ
1128 サでそれが適切でない場合には,それ以外の値としてもよい.その場合でも,
1129 可能な限り,1ミリ秒の倍数である(つまり,TIC_DENOを1に定義する)ことが
1130 望ましい.
1131
1132 TIC_NUMEとTIC_DENOの定義を変更することで,タイムティックの周期を変更で
1133 きるようにタイマドライバを実装する場合には,この2つの定数の定義はデフォ
1134 ルト値を与えていることになる.そこで,これらの定義を「#ifndef TIC_NUME」
1135 「#endif」で囲んで記述する.
1136
1137 5.4 メモリ領域確保のための型定義
1138
1139 (5-4-1) TOPPERS_STK_T   スタック領域を確保するための型(オプション)
1140 (5-4-2) TOPPERS_MPF_T   固定長メモリプール領域を確保するための型(オプション)
1141
1142 スタック領域と固定長メモリプール領域は,標準では,intptr_t型の配列とし
1143 て確保するが,より大きい単位でアラインさせたいなどの理由で,それ以外の
1144 型の配列として確保する場合には,それぞれTOPPERS_STK_TとTOPPERS_MPF_Tを,
1145 配列のベースとなるデータ型にマクロ定義する.
1146
1147 5.5 ビットパターンのビット数
1148
1149 (5-5-1) TBIT_TEXPTN             タスク例外要因のビット数(オプション)
1150 (5-5-2) TBIT_FLGPTN             イベントフラグのビット数(オプション)
1151
1152 TBIT_TEXPTN,TBIT_FLGPTNの標準の定義では,整数型の有効ビット数が,その
1153 型のsizeofにCHAR_BITを乗じたものと一致していることを仮定している.多く
1154 のコンパイラでこの仮定が成り立つが,そうでない場合には,ターゲット依存
1155 部でこれらの定義を上書きする必要がある.ただし,これらの値は16以上でな
1156 ければならない.
1157
1158 5.6 メモリ領域確保のためのマクロ
1159
1160 (5-6-1) TOPPERS_ROUND_SZ(オプション)
1161 (5-6-2) TOPPERS_COUNT_SZ(オプション)
1162
1163 TOPPERS_COUNT_SZ(sz, unit)は,sz/unitを切り上げた値を求めるマクロで,サ
1164 イズがszのメモリ領域をサイズがunitのデータ型の配列で確保する場合の要素
1165 数を求めるために用いる.TOPPERS_ROUND_SZ(sz, unit)は,sz/unitを切り上げ
1166 たものにunitをかけた値を求めるマクロで,サイズがszのメモリ領域をサイズ
1167 がunitのデータ型の配列で確保する場合のトータルサイズを求めるために用い
1168 る.
1169
1170 それぞれ,標準のTOPPERS_ROUND_SZ,TOPPERS_COUNT_SZが適切でなく,ターゲッ
1171 ト依存部で用意する場合には,これらのシンボルを適切な値にマクロ定義する.
1172
1173 5.7 オーバランハンドラ機能拡張のための定義(オプション)
1174
1175 オーバランハンドラ機能拡張パッケージをサポートする(使用できるようにす
1176 る)場合には,次の3つを実施することが必要である.
1177
1178 ・この節で説明する定義を行う.
1179 ・6章に示すコード中で,TOPPERS_SUPPORT_OVRHDRがマクロ定義されている場
1180  合にのみ有効となるコードを実装する.
1181 ・オーバランタイマドライバを用意する.オーバランタイマドライバについて
1182  は,「6.14 オーバランタイマドライバ」の節を参照すること.
1183
1184 (5-7-1) TOPPERS_TARGET_SUPPORT_OVRHDR
1185
1186 オーバランハンドラ機能拡張パッケージをサポートする場合には,このシンボ
1187 ルをマクロ定義する.
1188
1189 (5-7-2) TMAX_OVRTIM(オプション,デフォルトはULONG_MAX)
1190
1191 プロセッサ時間としてオーバランタイマに設定できる最大値(単位はマイクロ
1192 秒)にマクロ定義する.
1193
1194
1195 6.カーネル実装のターゲット依存部
1196
1197 6.1 カーネル実装のターゲット依存部の共通事項
1198
1199 6.1.1 カーネル実装のターゲット依存部の構成要素
1200
1201 カーネル実装のターゲット依存部は,以下の要素で構成される.
1202
1203 (a) カーネル実装のターゲット依存の定義
1204
1205 カーネル実装のターゲット非依存部から参照されるターゲット依存の定義は,
1206 target_config.hまたはそこからインクルードされるファイル(プロセッサ・チッ
1207 プ・開発環境依存部で用意されるヘッダファイルなど)に含める.
1208
1209 ターゲットのハードウェア資源(割込みハンドラ番号やCPU例外ハンドラ番号,
1210 デバイスレジスタの番地など)の定義は,システムサービスやアプリケーショ
1211 ンにも有用であるため,カーネル実装のみに有用な定義を含むファイルとは切
1212 り分けて,独立したヘッダファイルに含める.このヘッダファイルの標準的な
1213 名称を,システム略称.h(または,チップ略称.h,プロセッサ略称.h)とする.
1214
1215 (b) カーネル実装のターゲット依存モジュール
1216
1217 カーネル実装のターゲット依存の変数定義や関数を含むモジュール.C言語で記
1218 述される部分をtarget_config.c,アセンブリ言語で記述される部分を
1219 target_support.Sに含める.プロセッサ・チップ・開発環境依存部を切り分け
1220 ることや,ファイルが大きくなる場合に複数のファイルに分割することも可能
1221 である.
1222
1223 (c) カーネル実装のターゲット依存部のためのリネーム記述
1224
1225 カーネル実装のターゲット依存部の変数名や関数名を,先頭に_kernel_を付与
1226 した名前にリネームするためのモジュール.target_rename.defを用意し,ツー
1227 ル(utils/genrename)により,target_rename.hとtarget_unrename.hを生成す
1228 る.プロセッサ・チップ・開発環境依存部を切り分ける場合には,リネーム記
1229 述も切り分ける.
1230
1231 (d) タイマドライバ
1232
1233 カーネルにタイムティックを通知する(signal_timeを周期的に呼び出す)ため
1234 のタイマドライバのヘッダファイル,実装ファイル,システムコンフィギュレー
1235 ションファイルを,それぞれ,target_timer.h,target_timer.c,
1236 target_timer.cfgに含める.プロセッサ・チップ・開発環境依存部を切り分け
1237 ることも可能である.
1238
1239 また,オーバランハンドラ機能拡張パッケージをサポートする場合には,オー
1240 バランハンドラを起動する(call_ovrhdrを呼び出す)ためのオーバランタイマ
1241 ドライバも,同じファイルに含める.
1242
1243 なお,この章に示すコード中で,TOPPERS_SUPPORT_OVRHDRがマクロ定義されて
1244 いる場合にのみ有効となるコードは,オーバランハンドラ機能拡張パッケージ
1245 をサポートしない場合には,実装する必要がない.
1246
1247 (e) コンフィギュレータ設定ファイル
1248
1249 コンフィギュレータの設定ファイルのターゲット依存部を,target_def.csv,
1250 target.tf,target_check.tfに用意する.コンフィギュレータ設定ファイルの
1251 記述方法については,7章で説明する.
1252
1253 6.1.2 ターゲット依存部の関数の命名規則
1254
1255 カーネル実装のターゲット依存部を構成する関数の中で,t_で始まるものはタ
1256 スクコンテキスト専用,i_で始まるものは非タスクコンテキスト専用,x_で始
1257 まるものはいずれのコンテキストからでも呼び出すことができる関数である.
1258
1259 6.2 トレースログ機能への対応
1260
1261 カーネルのトレースログ機能の中で,ディスパッチャ,割込みハンドラ,CPU例
1262 外ハンドラの開始・終了のトレースログ取得は,ターゲット依存部で実装する
1263 必要がある.ほとんどのターゲットシステムにおいて,それらの処理はアセン
1264 ブリ言語で記述されており,ターゲット非依存部向けのトレースログマクロと
1265 同じ方法(トレースログマクロを,トレースログ取得処理のC言語記述にマクロ
1266 定義する方法)は,用いることができない.
1267
1268 そこで,アセンブリ言語で記述されている処理中にトレースログ取得を埋め込
1269 む場合には,トレースログマクロが定義されていれば,それが何に定義されて
1270 いるかは無視して,標準的なトレースログ関数がC言語で記述されていると想定
1271 して,それを呼び出すようにコーディングする.
1272
1273 具体的には,下の表の左側に示したトレースログマクロが定義されていれば,
1274 表の右側に示したC言語記述と同等の処理を行うようにコーディングする.
1275
1276         トレースログマクロ             トレースログ取得処理
1277         -----------------------------------------------
1278         LOG_DSP_ENTER                   log_dsp_enter(p_runtsk)
1279         LOG_DSP_LEAVE                   log_dsp_leave(p_runtsk)
1280         LOG_INH_ENTER                   log_inh_enter(inhno)
1281         LOG_INH_LEAVE                   log_inh_leave(inhno)
1282         LOG_EXC_ENTER                   log_exc_enter(excno)
1283         LOG_EXC_LEAVE                   log_exc_leave(excno)
1284
1285 6.3 システム状態の管理
1286
1287 ASPカーネルを新たなターゲットシステムにポーティングする際に,最も重要な
1288 作業は,カーネルが定義するシステム状態を,ハードウェア(プロセッサ)上
1289 でどのように実現するかである.以下の説明は,TOPPERS新世代カーネルにおけ
1290 るシステム状態の定義・意味を知っていることを前提に記述している.
1291
1292 6.3.1 全割込みロック状態の管理
1293
1294 全割込みロック状態は,NMIを除くすべての割込みをマスクした状態である.全
1295 割込みロック状態を管理する機能は,システムインタフェースレイヤ(SIL)に
1296 よって提供され,カーネルは全割込みロック状態を管理しない.
1297
1298 全割込みロック状態では,sns_kerとext_ker以外のカーネルのサービスコール
1299 を呼ぶことはできないものとしており,呼んだ場合には何が起こるか保証して
1300 いない.sns_kerとext_kerから呼び出す処理は,トレースログ取得処理とSILの
1301 サービスコールを除くと,call_exit_kernelのみである.そのため,
1302 call_exit_kernelから呼び出すものを除いて,カーネルのターゲット依存部の
1303 関数が,全割込みロック状態で呼び出される状況は考える必要がない.
1304
1305 6.3.2 コンテキストの管理
1306
1307 処理単位が実行されるコンテキストは,タスクコンテキストと非タスクコンテ
1308 キストに分類される.
1309
1310 ターゲット依存部は,実行中の処理単位が,タスクコンテキストで実行されて
1311 いるか非タスクコンテキストで実行されているかを判別する機能を提供する.
1312 また,CPU例外が発生したコンテキストについて判別する機能を提供する.
1313
1314 ターゲット依存部では,割込みハンドラとCPU例外ハンドラの入口処理で非タス
1315 クコンテキストに切り換え,それらの出口処理で元のコンテキストに戻す.ま
1316 た,ディスパッチャの内部で一時的に非タスクコンテキストに切り換える.
1317
1318 (6-3-2-1) bool_t sense_context(void)
1319
1320 実行中の処理単位が,タスクコンテキストで実行されている場合にはfalse,非
1321 タスクコンテキストで実行されている場合にはtrueを返す関数.この関数は,
1322 CPUロック状態でもCPUロック解除状態でも呼び出せるように実装しなければな
1323 らない.
1324
1325 6.3.3 CPUロック状態の管理
1326
1327 ターゲット依存部は,CPUロック状態へ遷移する機能,CPUロック解除状態へ遷
1328 移する機能,CPUロック状態であるかを判別する機能を提供する.
1329
1330 (6-3-3-1) void t_lock_cpu(void)
1331 (6-3-3-2) void i_lock_cpu(void)
1332 (6-3-3-3) void x_lock_cpu(void)
1333
1334 CPUロック解除状態から,CPUロック状態へ遷移させる関数.これらの関数は,
1335 CPUロック状態で呼び出されることはなく,呼び出された場合の動作は保証する
1336 必要がない.
1337
1338 これらの関数を実現する際には,「1.6 クリティカルセクションの出入処理の
1339 実現に関する制約」の節に記述されている制約に従わなければならない.
1340
1341 (6-3-3-4) void t_unlock_cpu(void)
1342 (6-3-3-5) void i_unlock_cpu(void)
1343 (6-3-3-6) void x_unlock_cpu(void)
1344
1345 CPUロック状態から,CPUロック解除状態へ遷移させる関数.これらの関数は,
1346 CPUロック解除状態で呼び出されることはなく,呼び出された場合の動作は保証
1347 する必要がない.
1348
1349 タスクコンテキストでCPUロック状態に遷移した場合には,CPUロック解除状態
1350 に戻るのはタスクコンテキストに限られ,非タスクコンテキストでCPUロック解
1351 除状態に戻ることはない.言い換えると,t_unlock_cpuが呼び出されるのは,
1352 t_lock_cpuによってCPUロック状態になっている時である.i_lock_cpuによって
1353 CPUロック状態になっている時には,t_unlock_cpuが呼び出されることはない.
1354
1355 同様に,非タスクコンテキストでCPUロック状態に遷移した場合には,CPUロッ
1356 ク解除状態に戻るのは非タスクコンテキストに限られ,タスクコンテキストで
1357 CPUロック解除状態に戻ることはない.言い換えると,i_unlock_cpuが呼び出さ
1358 れるのは,i_lock_cpuによってCPUロック状態になっている時である.
1359 t_lock_cpuによってCPUロック状態になっている時には,i_unlock_cpuが呼び出
1360 されることはない.
1361
1362 これらの関数を実現する際には,「1.6 クリティカルセクションの出入処理の
1363 実現に関する制約」の節に記述されている制約に従わなければならない.
1364
1365 (6-3-3-7) bool_t t_sense_lock(void)
1366 (6-3-3-8) bool_t i_sense_lock(void)
1367 (6-3-3-9) bool_t x_sense_lock(void)
1368
1369 現在のシステム状態が,CPUロック状態の場合はtrue,CPUロック解除状態の場
1370 合にはfalseを返す関数.
1371
1372 これらの関数が全割込みロック状態で呼び出される状況は考える必要がないこ
1373 とから,全割込みロック状態とCPUロック状態を区別できる必要はない.NMI以
1374 外にカーネルの管理外の割込みを設けない場合には,全割込みロック状態と
1375 CPUロック状態が全く同一の状態でもかまわない.
1376
1377 6.4 割込みに関連するシステム状態の管理
1378
1379 6.4.1 割込み優先度マスクの管理
1380
1381 ターゲット依存部は,割込み優先度マスクを設定する機能と,割込み優先度マ
1382 スクを参照する機能を提供する.
1383
1384 (6-4-1-1) bool_t VALID_INTPRI_CHGIPM(PRI intpri)(オプション)
1385
1386 intpriが,chg_ipmに対する割込み優先度として有効な値である場合にtrue,そ
1387 うでない場合にfalseを返すマクロ.標準では,TMIN_INTPRI以上,TIPM_ENAALL
1388 (=0)以下の値がchg_ipmに対する割込み優先度として有効であるが,ターゲッ
1389 ト依存部でこのマクロを定義することで,TMIN_INTPRIよりも小さい値を有効と
1390 することができる(有効な値の範囲を狭めてはならない).
1391
1392 (6-4-1-2) void x_set_ipm(PRI intpri)
1393 (6-4-1-3) void t_set_ipm(PRI intpri)
1394 (6-4-1-4) void i_set_ipm(PRI intpri)
1395
1396 割込み優先度マスクの値をintpriに設定する関数.
1397
1398 これらの関数は,CPUロック状態でもCPUロック解除状態でも呼び出せるように
1399 実装するのが望ましい.ただし,x_set_ipmとt_set_ipmは,ターゲット非依存
1400 部がCPUロック解除状態で呼び出すことはないため,CPUロック解除状態で呼び
1401 出された場合の動作は保証する必要がない.i_set_ipmは,CPUロック状態でも
1402 CPUロック解除状態でも呼び出せるように実装しなければならない.
1403
1404 また,これらの関数は,VALID_INTPRI_CHGIPM(intpri)がtrueを返すintpriに対
1405 してのみ呼ばれる.intpriにそうでない値が渡された場合の動作は保証する必
1406 要がない.
1407
1408 (6-4-1-5) PRI x_get_ipm(void)
1409 (6-4-1-6) PRI t_get_ipm(void)
1410 (6-4-1-7) PRI i_get_ipm(void)
1411
1412 割込み優先度マスクの値を参照して返す関数.
1413
1414 これらの関数は,CPUロック状態でもCPUロック解除状態でも呼び出せるように
1415 実装するのが望ましい.ただし,x_get_ipmとt_get_ipmは,ターゲット非依存
1416 部がCPUロック解除状態で呼び出すことはないため,CPUロック解除状態で呼び
1417 出された場合の動作は保証する必要がない.i_get_ipmは,CPUロック状態でも
1418 CPUロック解除状態でも呼び出せるように実装しなければならない.
1419
1420 割込み優先度マスクを用いてカーネル管理の割込みをすべてマスクした状態は,
1421 CPUロック状態と区別できることが必要である.具体的には,CPUロック解除状
1422 態において,x_set_ipmを用いてカーネル管理の割込みをすべてマスクした場合
1423 でも,x_sense_lockはfalseを返す.
1424
1425 それに対して,割込み優先度マスクを用いてNMIを除くすべての割込みをマスク
1426 できる場合,その状態と全割込みロック状態を区別できる必要はなく,全く同
1427 一の状態でもかまわない.
1428
1429 6.4.2 割込み要求禁止フラグの管理
1430
1431 ターゲット依存部は,割込み要求禁止フラグをセットする機能とクリアする機
1432 能を提供する.
1433
1434 (6-4-2-1) bool_t VALID_INTNO_DISINT(INTNO intno)
1435
1436 intnoが,dis_int/ena_intに対する割込み番号として有効な値である場合に
1437 true,そうでない場合にfalseを返すマクロ.割込み要求禁止フラグがセット/
1438 クリアできないintnoに対しては,このマクロがfalseを返すようにする.
1439
1440 (6-4-2-2) bool_t x_disable_int(INTNO intno)
1441 (6-4-2-3) bool_t t_disable_int(INTNO intno)
1442 (6-4-2-4) bool_t i_disable_int(INTNO intno)
1443
1444 intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをセットし,
1445 trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ
1446 れていない場合には,falseを返す.
1447
1448 これらの関数は,ターゲット非依存部がCPUロック解除状態で呼び出すことはな
1449 いため,CPUロック解除状態で呼び出された場合の動作は保証する必要がない.
1450 ただし,ターゲット依存部からCPUロック解除状態で呼び出す場合には,保証す
1451 る必要がある.
1452
1453 また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し
1454 てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必要が
1455 ない.
1456
1457 dis_intサービスコールをサポートする場合(TOPPERS_SUPPORT_DIS_INTをマク
1458 ロ定義する場合)には,t_disable_intが用意されていなければならない.
1459
1460 (6-4-2-5) bool_t x_enable_int(INTNO intno)
1461 (6-4-2-6) bool_t t_enable_int(INTNO intno)
1462 (6-4-2-7) bool_t i_enable_int(INTNO intno)
1463
1464 intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをクリアし,
1465 trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ
1466 れていない場合には,falseを返す.
1467
1468 これらの関数は,ターゲット非依存部がCPUロック解除状態で呼び出すことはな
1469 いため,CPUロック解除状態で呼び出された場合の動作は保証する必要がない.
1470 ただし,ターゲット依存部からCPUロック解除状態で呼び出す場合には,保証す
1471 る必要がある.
1472
1473 また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し
1474 てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必要が
1475 ない.
1476
1477 ena_intサービスコールをサポートする場合(TOPPERS_SUPPORT_ENA_INTをマク
1478 ロ定義する場合)には,t_enable_intが用意されていなければならない.
1479
1480 6.4.3 割込み要求のクリア
1481
1482 (6-4-3-1) void x_clear_int(INTNO intno)
1483 (6-4-3-2) void t_clear_int(INTNO intno)
1484 (6-4-3-3) void i_clear_int(INTNO intno)
1485
1486 intnoで指定された割込み要求ラインがエッジトリガである場合に,トリガされ
1487 た割込み要求をクリアする関数.intnoで指定された割込み要求ラインがレベル
1488 トリガである場合には何もしない.
1489
1490 ASPカーネルのターゲット非依存部では,これらの関数を呼び出していないが,
1491 ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する
1492 こととしている.そのため,これらの関数がどのようなシステム状態で呼び出
1493 せるかは,ターゲット依存部内で一貫していればよい.
1494
1495 6.4.4 割込み要求のプローブ
1496
1497 (6-4-4-1) bool_t x_probe_int(INTNO intno)
1498 (6-4-4-2) bool_t t_probe_int(INTNO intno)
1499 (6-4-4-3) bool_t i_probe_int(INTNO intno)
1500
1501 intnoで指定された割込み要求ラインに対して,割込みが要求されている場合に
1502 true,そうでない場合にfalseを返す関数.
1503
1504 ASPカーネルのターゲット非依存部では,これらの関数を呼び出していないが,
1505 ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する
1506 こととしている.そのため,これらの関数がどのようなシステム状態で呼び出
1507 せるかは,ターゲット依存部内で一貫していればよい.
1508
1509 6.4.5 割込みハンドラの先頭処理と末尾処理
1510
1511 (6-4-5-1) void i_begin_int(INTNO intno)
1512
1513 intnoで指定された割込み要求ラインに対する割込みハンドラの先頭で行うべき
1514 処理を行う関数.ここで行うべき処理としては,割込み要求ラインがエッジト
1515 リガである場合のトリガされた割込み要求のクリアが挙げられる.
1516
1517 intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの
1518 先頭で呼び出される.そのためこの関数は,割込みハンドラの先頭(通常は
1519 CPUロック解除状態)で呼び出せるように実装しなければならない.
1520
1521 (6-4-5-2) void i_end_int(INTNO intno)
1522
1523 intnoで指定された割込み要求ラインに対する割込みハンドラの末尾で行うべき
1524 処理を行う関数.ここで行うべき処理としては,割込みコントローラ(IRC)に
1525 対する割込み処理の終了を通知が挙げられる.
1526
1527 intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの
1528 末尾で呼び出される.そのためこの関数は,割込みハンドラの末尾(通常は
1529 CPUロック解除状態)で呼び出せるように実装しなければならない.
1530
1531 6.5 タスクディスパッチャ
1532
1533 6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
1534
1535 (6-5-1-1) TSKCTXB
1536
1537 ターゲット依存のタスクコンテキストを保存するために,TCB中に持つことが必
1538 要なデータ構造の型を,TSKCTXBに定義する.標準的には,TSKCTXBには,タス
1539 クのスタックポインタと実行再開番地を格納する.
1540
1541 (6-5-1-2) USE_TSKINICTXB(オプション)
1542 (6-5-1-3) TSKINICTXB(オプション)
1543
1544 ターゲット依存の情報をタスク初期化ブロック(TINIB)に入れたい場合や,
1545 TINIB中のスタック領域とサイズと先頭番地の持ち方をターゲット依存に変更し
1546 たい場合には,USE_TSKINICTXBをマクロ定義し,TINIB中に持つことが必要なデー
1547 タ構造の型を,TSKINICTXBに定義する.
1548
1549 USE_TSKINICTXBをマクロ定義すると,TINIB中にスタック領域とサイズと先頭番
1550 地が含まれなくなるため,それに代わる情報をTSKINICTXB中に持つ必要がある.
1551 また,コンフィギュレータのパス2のテンプレートファイルのターゲット非依存
1552 部で,TSKINICTXBの初期化情報を生成するためのGENERATE_TSKINICTXBを定義す
1553 る必要がある.
1554
1555 6.5.2 ディスパッチャ本体
1556
1557 ディスパッチャ本体(dispatcher)は,ターゲット非依存部から直接呼び出さ
1558 れることはなく,カーネルのターゲット依存部の内部からのみ呼び出される.
1559 dispatcherは,タスクコンテキスト・CPUロック状態・割込み優先度マスク全解
1560 除状態・ディスパッチ許可状態で呼び出される.
1561
1562 dispatcherの処理内容は次の通り.
1563
1564 ----------------------------------------
1565 void
1566 dispatcher(void)
1567 {
1568 #ifdef LOG_DSP_ENTER
1569         log_dsp_enter(p_runtsk);
1570 #endif /* LOG_DSP_ENTER */
1571   dispatcher_0:
1572         while ((p_runtsk = p_schedtsk) == NULL) {
1573                 割込みを許可したらCPUロック解除状態になるよう準備する
1574                 非タスクコンテキストに切り換える … (*1)
1575                 do {
1576                         割込みをすべて許可し,割込み発生を待つ … (*2)
1577                         割込み許可前の状態に戻す(=カーネル管理の割込みを禁止する)
1578                 } while (!reqflg);
1579                 reqflg = false;
1580                 タスクコンテキストに戻す … (*1)
1581                 CPUロック状態に戻す ... (*3)
1582         }
1583         自タスク(p_runtsk)のTCBからスタックポインタを復帰する
1584 #ifdef LOG_DSP_LEAVE
1585         log_dsp_leave(p_runtsk);
1586 #endif /* LOG_DSP_LEAVE */
1587         自タスクのTCBから実行再開番地を復帰し,そこへ分岐する … (*a)
1588 }
1589 ----------------------------------------
1590
1591 割込み発生を待つ間に非タスクコンテキストに切り換えるのは,この間に実行
1592 される割込みハンドラ内で,タスクディスパッチをしないようにするためであ
1593 る.この時,割込みハンドラが,非タスクコンテキスト用のスタックを使うよ
1594 うにしなければならない.通常は,非タスクコンテキストに切り換える際に非
1595 タスクコンテキスト用のスタックに切り換え,タスクコンテキストに戻す際に
1596 元のスタックに切り換える.
1597
1598 ターゲットによっては(特に,シミュレーション環境の場合),強制的に非タ
1599 スクコンテキストに切り換えることが難しい場合がある.その場合には,この
1600 間に実行される割込みハンドラ内でタスクディスパッチをしないような仕組み
1601 を実装することで,非タスクコンテキストへの切換えを省略することができる.
1602
1603 (*1)の非タスクコンテキストに切り換える処理とタスクコンテキストに戻す処
1604 理は,doループの中で行ってもよい(ターゲットによっては,割込みの許可/
1605 禁止とまとめて処理した方が効率が良い).
1606
1607 (*2)において,割込みを許可する処理と,割込み発生を待つ処理とは,不可分
1608 に行なう必要がある.これを不可分に行なわない場合,割込みを許可した直後
1609 に割込みが入り,その中でタスクが実行可能状態になると,実行すべきタスク
1610 があるにもかかわらずプロセッサが割込み待ちになってしまう.
1611
1612 また,(*2)において,割込み発生を待つ命令が用意されていない場合や,それ
1613 を発行するのが不都合な場合には,割込みをすべて許可して割込みを受け付け
1614 られる状態になった後に,割込み発生を待たずに次に進んでもよい.この場合,
1615 その外側のdoループによって,割込み発生を待つことになる.
1616
1617 CPUロックを解除するための情報(例えば,CPUロック前の割込み優先度マスク)
1618 を変数に保持している場合には,(*3)でCPUロック状態に戻す際に,その変数の
1619 値も元に戻っている必要がある.特に,その変数が,割込み待ちの間に実行し
1620 た割込みハンドラ内で書き換えられる場合は,元の値に戻すことが必要である.
1621
1622 割込み待ちの間は,p_runtskをNULL(=0)に設定しなければならない(上の処
1623 理内容をそのまま実装すればこうなる).このように設定しないと,割込みハ
1624 ンドラからiget_tidを呼び出した際の動作が仕様に合致しなくなる.
1625
1626 (*a)において,実行再開番地は,TCBではなく,スタックに保存/復帰する方法
1627 もある.この場合,タスクの実行開始前にスタックを使ってはならないため,
1628 タスクの起動処理を例外扱いする必要がある.
1629
1630 dispatcherをアセンブリ言語で記述する場合には,トレースログ取得処理は,
1631 「6.2 トレースログ機能への対応」の節で記述した方法でコーディングするこ
1632 と.なお,log_dsp_enterは切換え前のタスクのスタックで,log_dsp_leave は
1633 切換え後のタスクのスタックで実行する.
1634
1635 6.5.3 タスクコンテキストからのディスパッチ
1636
1637 (6-5-3-1) void dispatch(void)
1638 (6-5-3-2) OMIT_CALLTEX(オプション)
1639
1640 タスクコンテキストからのディスパッチ(dispatch)は,タスクコンテキスト
1641 用のサービスコール処理においてタスク切換えが必要になった場合に,ターゲッ
1642 ト非依存部のサービスコール処理関数から呼び出される.
1643
1644 dispatchは,タスクコンテキスト・CPUロック状態・割込み優先度マスク全解除
1645 状態・ディスパッチ許可状態で呼び出される.
1646
1647 dispatchの処理内容は次の通り.
1648
1649 ----------------------------------------
1650 void
1651 dispatch(void)
1652 {
1653 #ifdef TOPPERS_SUPPORT_OVRHDR
1654         ovrtimer_stop();                                        /* オーバランタイマの停止 */
1655 #endif /* TOPPERS_SUPPORT_OVRHDR */
1656         スクラッチレジスタを除くすべてのレジスタをスタックに保存する
1657         スタックポインタを自タスク(p_runtsk)のTCBに保存する
1658         dispatch_rを,実行再開番地として自タスクのTCBに保存する … (*a)
1659         dispatcherに分岐する
1660
1661   dispatch_r:
1662         スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
1663 #ifdef TOPPERS_SUPPORT_OVRHDR
1664         ovrtimer_start();                                       /* オーバランタイマの動作開始 */
1665 #endif /* TOPPERS_SUPPORT_OVRHDR */
1666         calltex(); … (*b)
1667 }
1668 ----------------------------------------
1669
1670 dispatchを呼び出したタスクが次に実行される時には,実行再開番地として登
1671 録したdispatch_rに戻ってくる.dispatch_rには,dispatcherのみから分岐し,
1672 その時の状態は,タスクコンテキスト・CPUロック状態・割込み優先度マスク全
1673 解除状態・ディスパッチ許可状態である.
1674
1675 (*b)でcalltexを呼ぶ代わりに,calltexの処理内容(p_runtsk->enatexがtrue
1676 で,p_runtsk->texptnが0でない場合に,call_texrtnを呼ぶ)をここにインラ
1677 イン展開した方が効率がよい.ターゲット非依存部のcalltexを使わない場合に
1678 は,OMIT_CALLTEXをマクロ定義することで,ターゲット非依存部からcalltexを
1679 取り除くことができる.
1680
1681 6.5.4 ディスパッチャの動作開始
1682
1683 (6-5-4-1) void start_dispatch(void)
1684
1685 ディスパッチャの動作開始(start_dispatch)は,カーネル起動時に,カーネ
1686 ルの初期化処理から呼び出される.start_dispatchは,リターンすることのな
1687 い関数である.
1688
1689 start_dispatchは,非タスクコンテキストで,NMIを除くすべての割込みをマス
1690 クした状態(全割込みロック状態と同等の状態)で呼び出される.start_dispatch
1691 内で,タスクコンテキストに切り換え,CPUロック状態・割込み優先度マスク全
1692 解除状態にしなければならない.
1693
1694 start_dispatchの処理内容は次の通り.
1695
1696 ----------------------------------------
1697 void
1698 start_dispatch(void)
1699 {
1700         タスクコンテキストに切り換える
1701         CPUロック状態・割込み優先度マスク全解除状態にする
1702         dispatcher_0に分岐する
1703 }
1704 ----------------------------------------
1705
1706 6.5.5 現在のコンテキストを捨ててディスパッチ
1707
1708 (6-5-5-1) void exit_and_dispatch(void)
1709
1710 現在のコンテキストを捨ててディスパッチ(exit_and_dispatch)は,自タスク
1711 を終了させるサービスコール処理関数から呼び出される.exit_and_dispatchは,
1712 リターンすることのない関数である.
1713
1714 exit_and_dispatchは,タスクコンテキスト・CPUロック状態・割込み優先度マ
1715 スク全解除状態・ディスパッチ許可状態で呼び出される.
1716
1717 exit_and_dispatchの処理内容は次の通り.
1718
1719 ----------------------------------------
1720 void
1721 exit_and_dispatch(void)
1722 {
1723         dispatcherに分岐する
1724 }
1725 ----------------------------------------
1726
1727 6.5.6 タスクの起動処理
1728
1729 (6-5-6-1) void activate_context(TCB *p_tcb)
1730
1731 タスクの起動処理(activate_context)は,タスクを休止状態から実行できる
1732 状態にする時に呼ばれ,指定されたタスクのTCB中のスタックポインタを初期化
1733 し,実行再開番地をタスク開始時処理(start_r)に設定する.この時点では,
1734 指定されたタスクのスタック領域を使ってはならない.
1735
1736 指定されたタスクが最初に実行される時には,指定されたタスクを自タスクと
1737 して,実行再開番地として登録したstart_rに分岐してくる.start_rには,
1738 dispatcherのみから分岐し,その時の状態は,タスクコンテキスト・CPUロック
1739 状態・割込み優先度マスク全解除状態・ディスパッチ許可状態である.
1740
1741 start_rは,CPUロック状態を解除した後,タスクの起動番地を呼び出す.さら
1742 に,タスクの起動番地から戻ってきた場合には,ext_tskを呼び出す.
1743
1744 activate_contextとstart_rの処理内容は次の通り.
1745
1746 ----------------------------------------
1747 void
1748 activate_context(TCB *p_tcb)
1749 {
1750         指定されたタスク(p_tcb)のTCB中のスタックポインタを初期化する
1751         start_rを,実行再開番地として自タスクのTCBに保存する … (*a)
1752         return;
1753
1754   start_r:
1755 #ifdef TOPPERS_SUPPORT_OVRHDR
1756         ovrtimer_start();                                       /* オーバランタイマの動作開始 */
1757 #endif /* TOPPERS_SUPPORT_OVRHDR */
1758         CPUロック解除状態にする
1759         自タスク(p_runtsk)の起動番地を,拡張情報をパラメータとして呼び出す
1760         ext_tskに分岐する ... (*c)
1761 }
1762 ----------------------------------------
1763
1764 (*c)でext_tskを呼ぶ代わりに,自タスクの起動番地を呼び出す時の返り番地を
1765 ext_tskの番地としておく方法がある.
1766
1767 (*a)において,実行再開番地をスタックに保存/復帰する方法をとる場合には,
1768 この時点でスタックを使ってはならないため,この処理を例外扱いしなければ
1769 ならない.
1770
1771 6.6 割込みハンドラ
1772
1773 6.6.1 割込みハンドラの出入口処理
1774
1775 カーネル管理の割込みの出入口処理の方法は,プロセッサによって大きく異な
1776 るが,おおよその処理内容は次の通り.
1777
1778 ----------------------------------------
1779 void
1780 <割込みの出入口処理>(void)
1781 {
1782         少なくともカーネル管理の割込みを禁止した状態にする … (*f)
1783         スクラッチレジスタをスタックに保存する
1784         if (タスクコンテキストで割込み発生) {
1785 #ifdef TOPPERS_SUPPORT_OVRHDR
1786                 ovrtimer_stop();                                /* オーバランタイマの停止 */
1787 #endif /* TOPPERS_SUPPORT_OVRHDR */
1788                 スタックを非タスクコンテキスト用のスタックに切り換え,
1789                                                                 非タスクコンテキストに切り換える
1790         }
1791
1792         この割込みよりも優先度の高い割込みのみを受け付けられるようにして,
1793                                                                                                 CPUロック解除状態にする
1794 #ifdef LOG_INH_ENTER
1795         log_inh_enter(割込みハンドラ番号);
1796 #endif /* LOG_INH_ENTER */
1797         割込みハンドラを呼び出す
1798 #ifdef LOG_INH_LEAVE
1799         log_inh_leave(割込みハンドラ番号);
1800 #endif /* LOG_INH_LEAVE */
1801
1802   ret_int:
1803         if (タスクコンテキストで割込み発生) {
1804                 (少なくとも)カーネル管理の割込みを禁止した状態にする … (*d)
1805                 スタックをタスク用のスタックに戻し,タスクコンテキストに切り換える
1806                 if (reqflg) {
1807                         reqflg = false;
1808                         CPUロック状態にする … (*e)
1809                         if (dspflg && p_runtsk != p_schedtsk) {
1810                                 スクラッチレジスタを除くすべてのレジスタをスタックに保存する
1811                                 スタックポインタを自タスク(p_runtsk)のTCBに保存する
1812                                 ret_int_rを,実行再開番地として自タスクのTCBに保存する … (*a)
1813                                 dispatcherに分岐する
1814
1815                           ret_int_r:
1816                                 スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
1817                         }
1818 #ifdef TOPPERS_SUPPORT_OVRHDR
1819                         ovrtimer_start();                       /* オーバランタイマの動作開始 */
1820 #endif /* TOPPERS_SUPPORT_OVRHDR */
1821                         calltex(); … (*b)
1822                 }
1823 #ifdef TOPPERS_SUPPORT_OVRHDR
1824                 else {
1825                         ovrtimer_start();                       /* オーバランタイマの動作開始 */
1826                 }
1827 #endif /* TOPPERS_SUPPORT_OVRHDR */
1828         }
1829         割込み処理からのリターン後に,CPUロック解除状態に戻るように準備する
1830         スクラッチレジスタをスタックから復帰する
1831         割込み処理からのリターン
1832 }
1833 ----------------------------------------
1834
1835 割込みの受付けによりすべての割込みが禁止されないプロセッサでは,(*f)に
1836 おいて,少なくともカーネル管理の割込みを禁止する.この理由は次の通りで
1837 ある.
1838
1839 割込みの入口処理において,スタックを非タスクコンテキスト用のスタックに
1840 切り換える前に多重割込みが発生すると,タスクのスタック領域が使用される.
1841 上記のようなプロセッサでは,スタックの切換え前に,最大で割込み優先度の
1842 段数分の多重割込みが発生することを防ぐことはできず,各タスクのスタック
1843 領域を確保する際に,その分を見込んで確保しなければならない.各タスクの
1844 スタック領域をなるべく小さくするためには,スタックをなるべく使用しない
1845 内に,多重割込みを禁止するのが望ましい.そのため,スクラッチレジスタを
1846 スタックに保存する前に,割込みを禁止する.ただし,割込みの禁止処理に必
1847 要な最低限のレジスタについては,割込みの禁止に先立ってスタックに保存す
1848 る必要がある.
1849
1850 同様のことは,カーネル管理外の割込みにも当てはまる.すなわち,カーネル
1851 管理外の割込みについても,スタックをなるべく使用しない内に禁止するのが
1852 望ましい.このことから,カーネル管理外の割込みを使用する場合には,(*f)
1853 において,すべての割込みを禁止した状態にするのが望ましいことになる.ま
1854 た,カーネル管理外の割込み処理においても,非タスクコンテキスト用のスタッ
1855 クに切り換えることが望ましいが,これはカーネルの管轄外である.
1856
1857 (*d)においては,カーネル管理の割込みを禁止するだけで,CPUロック状態にす
1858 る必要はない.例えば,CPUロック状態であることを示す変数を用意している場
1859 合には,(*d)の時点ではその変数をCPUロック状態を示す値に変更する必要はな
1860 く,(*e)において変更すればよい.
1861
1862 タスクの実行中に割込みが発生し,上の処理中でdispatcherに分岐した場合,
1863 そのタスクが次に実行される時には,実行再開番地として登録したret_int_rに
1864 戻ってくる.ret_int_rには,dispatcherのみから分岐し,その時の状態は,タ
1865 スクコンテキスト・CPUロック状態・割込み優先度マスク全解除状態・ディスパッ
1866 チ許可状態である.
1867
1868 割込みの出入口処理をアセンブリ言語で記述する場合には,トレースログ取得
1869 処理は,「6.2 トレースログ機能への対応」の節で記述した方法でコーディン
1870 グすること.
1871
1872 6.6.2 割込みハンドラ毎の出入口処理の生成
1873
1874 割込みベクトルをハードウェアで実現している場合など,割込みハンドラ毎に
1875 出入口処理を用意した方が効率が良いターゲットのために,割込みハンドラ毎
1876 に出入口処理を生成する機構を用意している.
1877
1878 以下のマクロは,標準の割込み管理機能の初期化処理を用いた場合のみ,ター
1879 ゲット非依存部で使われる.割込み管理機能の初期化処理をターゲット依存部
1880 で用意し,その中でこれらのマクロを使わない場合には,これらのマクロを用
1881 意する必要はない.
1882
1883 (6-6-2-1) INT_ENTRY(inhno, inthdr)
1884
1885 割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ
1886 ンドラの出入口処理のラベルを作るマクロ.INTHDR_ENTRYを用いて割込みハン
1887 ドラ毎に出入口処理を生成する場合には,次のように定義する.
1888
1889 #define INT_ENTRY(inhno, inthdr)        _kernel_##inthdr##_##inhno
1890
1891 割込みハンドラ毎に出入口処理を作る必要がない場合には,次のように定義し
1892 て,割込みハンドラの関数名をそのまま返す.
1893
1894 #define INT_ENTRY(inhno, inthdr)        inthdr
1895
1896 (6-6-2-2) INTHDR_ENTRY(inhno, inhno_num, inthdr)
1897
1898 割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ
1899 ンドラの出入口処理を生成するマクロ.inhno_numには,アセンブリ言語記述用
1900 に,割込みハンドラ番号が数値で渡される.割込みハンドラ毎に出入口処理を
1901 作る必要がない場合には,空に定義する.
1902
1903 6.6.3 割込みハンドラの設定
1904
1905 (6-6-3-1) bool_t VALID_INHNO_DEFINH(INHNO inhno)(オプション)
1906
1907 inhnoが,DEF_INHに対する割込みハンドラ番号として有効な値である場合に
1908 true,そうでない場合にfalseを返すマクロ.
1909
1910 ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
1911 ゲット依存部で使わないなら,用意する必要がない.
1912
1913 (6-6-3-2) void x_define_inh(INHNO inhno, FP int_entry)
1914
1915 inhnoで指定された割込みハンドラの出入口処理の番地をint_entryに設定する.
1916
1917 この関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ
1918 ト非依存部から呼び出される.割込み管理機能の初期化処理をターゲット依存
1919 部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する
1920 必要はない.
1921
1922 この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
1923 カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼
1924 び出せるように実装すればよい.
1925
1926 指定された割込みハンドラ番号がDEF_INHに対するものとして有効な値でない場
1927 合の動作は保証する必要がない(assertでエラーとするのが望ましい).これ
1928 は,コンフィギュレータが,パス2のテンプレートファイルのターゲット依存部
1929 で定義するINHNO_DEFINH_VALIDを用いてエラーを検出するためである.
1930
1931 6.6.4 割込み要求ラインの属性の設定
1932
1933 (6-6-4-1) bool_t VALID_INTNO_CFGINT(INTNO intno)(オプション)
1934
1935 intnoが,CFG_INTに対する割込み番号として有効な値である場合にtrue,そう
1936 でない場合にfalseを返すマクロ.割込み要求ラインの属性を設定できない
1937 intnoに対しては,このマクロがfalseを返すようにする.
1938
1939 ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
1940 ゲット依存部で使わないなら,用意する必要がない.
1941
1942 (6-6-4-2) void x_config_int(INTNO intno, ATR intatr, PRI intpri)
1943
1944 intnoで指定された割込み要求ラインの割込み属性を,intatrで指定された通り
1945 に設定する.また,割込み優先度を,intpriで指定された値に設定する.
1946
1947 この関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ
1948 ト非依存部から呼び出される.割込み管理機能の初期化処理をターゲット依存
1949 部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する
1950 必要はない.
1951
1952 この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
1953 カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼
1954 び出せるように実装すればよい.
1955
1956 intatrとして設定できる割込み属性は次の通り.
1957
1958         TA_ENAINT               0x01    割込み要求禁止フラグをクリア
1959         TA_EDGE                 0x02    エッジトリガ
1960
1961 この他に,ターゲット定義で割込み属性を追加してもよい.ターゲット定義で
1962 追加するために,以下の属性名が予約されている.
1963
1964         TA_POSEDGE                              ポジティブエッジトリガ
1965         TA_NEGEDGE                              ネガティブエッジトリガ
1966         TA_BOTHEDGE                             両エッジトリガ
1967         TA_LOWLEVEL                             ローレベルトリガ
1968         TA_HIGHLEVEL                    ハイレベルトリガ
1969
1970 これらの属性名をターゲット定義で追加する場合には,その属性値を決定し,
1971 定義をtarget_kernel.h(または,そこからインクルードされるファイル)に含
1972 める.また,コンフィギュレータテンプレートファイルから参照できるように,
1973 target_def.csv(または,そこからインクルードされるファイル)に含め,コ
1974 ンフィギュレータテンプレートファイルのターゲット非依存部でエラーとなら
1975 ないように,target.tf(または,そこからインクルードされるファイル)で
1976 TARGET_INTATRに設定する.
1977
1978 指定された割込み番号がCFG_INTに対するものとして有効な値でない場合や,そ
1979 の割込み要求ラインに対して設定できない属性を指定した場合,設定できない
1980 割込み優先度を指定した場合の動作は保証する必要がない(assertでエラーと
1981 するのが望ましい).このようなケースは,コンフィギュレータでエラーを検
1982 出すべきである.コンフィギュレータテンプレートファイルのターゲット非依
1983 存部は,パス2のテンプレートファイルのターゲット依存部で定義する
1984 INTNO_CFGINT_VALID,TARGET_INTATR,INTPRI_CFGINT_VALIDを用いてエラーを
1985 検出するが,標準の割込み属性(TA_ENAINT,TA_EDGE)が設定できない場合や,
1986 設定できない属性や割込み優先度が割込み要求ラインによって異なる場合には,
1987 コンフィギュレータテンプレートファイルのターゲット依存部で検出しなけれ
1988 ばならない.
1989
1990 6.6.5 割込み管理機能の初期化処理の変更
1991
1992 (6-6-5-1) OMIT_INITIALIZE_INTERRUPT(オプション)
1993
1994 割込み管理機能の初期化処理をターゲット依存部で用意し,ターゲット非依存
1995 部に含まれる標準の割込み管理機能の初期化処理を用いない場合には,このシ
1996 ンボルをマクロ定義する.
1997
1998 このシンボルをマクロ定義すると,INHINIB,INTINIB,initialize_interrupt
1999 の定義が,カーネルのターゲット非依存部から取り除かれる.また,
2000 TNUM_INHNO,tnum_inhno,inhinib_table,TNUM_INTNO,tnum_intno,
2001 intinib_tableの定義と,割込みハンドラ毎の出入口処理を生成するための記述
2002 (INTHDR_ENTRYマクロのリスト)が,コンフィギュレータのパス2のテンプレー
2003 トファイルのターゲット非依存部によってkernel_cfg.cに生成されなくなる.
2004 ただし,コンフィギュレータのパス2のテンプレートファイルのターゲット依存
2005 部で,USE_INHINIB_TABLEとUSE_INTINIB_TABLEを設定することで,その一部
2006 分をkernel_cfg.cに生成することが可能である.
2007
2008 (6-6-5-2) void initialize_interrupt(void)(オプション)
2009
2010 OMIT_INITIALIZE_INTERRUPTをマクロ定義した場合には,この関数をターゲット
2011 依存部で用意する.OMIT_INITIALIZE_INTERRUPTをマクロ定義することにより取
2012 り除かれるその他のデータ型,変数,マクロは,この関数で使用する場合にの
2013 み用意すればよい.
2014
2015 6.6.6 デフォルトの割込みハンドラ
2016
2017 (6-6-6-1) default_int_handler(void)(オプション)
2018
2019 コンフィギュレータにより割込みハンドラのテーブルを生成する場合などには,
2020 割込みハンドラを登録しなかった割込みハンドラ番号に対して,デフォルトの
2021 割込みハンドラとして,default_int_handlerを登録する.
2022
2023 default_int_handlerは,標準のものをターゲット依存部で用意するが,ユーザ
2024 が用意したもので置き換えられるように,OMIT_DEFAULT_INT_HANDLERをマクロ
2025 定義した場合には,ターゲット依存部で定義しないようにする.なお,ユーザ
2026 が用意する場合の名称は,_kernel_default_int_handlerとなる.
2027
2028 6.6.7 カーネル管理外の割込み
2029
2030 カーネル管理外の割込みハンドラは,カーネル内の割込み出入口処理を経由せ
2031 ずに実行するのが基本である.
2032
2033 ただし,すべての割込みで同じアドレスに分岐するプロセッサでは,カーネル
2034 内の割込み出入口処理を全く経由せずにカーネル管理外の割込みハンドラを実
2035 行することができないため,割込み出入口処理のなるべく早いタイミングで,
2036 カーネル管理外の割込みであるかを判別し,処理内容を分ける必要がある.具
2037 体的には,カーネル管理外の割込みの出入口処理では,オーバランハンドラの
2038 停止と動作開始を行ってはならない.また,reqflgをチェックし,タスク切換
2039 えやタスク例外処理ルーチンの呼出しを行う必要がない.さらに,NMIの出入口
2040 処理では,トレースログ取得処理(log_inh_enterおよびlog_inh_leave)を呼
2041 び出してはならない.
2042
2043 カーネル管理外の割込みハンドラを実行する際に,カーネル内の割込み出入口
2044 処理の一部分を経由する場合には,CPU例外が起こる可能性を極力減らすととも
2045 に,CPU例外を起こす可能性がある場合には,その可能性をターゲット依存部の
2046 ユーザーズマニュアルに記載しなければならない.
2047
2048 次に,カーネル管理外の割込みの設定方法に関して,「TOPPERS新世代カーネル
2049 統合仕様書」の「2.7.8 カーネル管理外の割込みの設定方法」の節の3つの方法
2050 のいずれを採用するかを決定する.
2051
2052 (a-1)または(a-2)を採用し,カーネル管理外とした割込みに対して,カーネル
2053 のAPIによる割込みハンドラの登録と割込み要求ラインの属性の設定をサポート
2054 しない場合には,それに代わる方法をターゲット依存部のユーザーズマニュア
2055 ルに記述する.
2056
2057 (a-1)または(a-2)を採用してカーネルのAPIによる割込みハンドラの登録や割込
2058 み要求ラインの属性の設定をサポートする場合や,(b)を採用した場合には,ター
2059 ゲット依存部においてそれを実現する必要がある.
2060
2061 カーネル管理外の割込みに対して,DEF_INHによる割込みハンドラの登録をサポー
2062 トするには,次の設定が必要になる.
2063
2064 ・TARGET_INHATRに,TA_NONKERNELを設定する.
2065
2066 ・(a-1)または(a-2)を採用した場合には,INHNO_DEFINH_VALIDに,カーネル管
2067  理外とした割込みに対応する割込みハンドラ番号を含める.また,
2068  VALID_INHNO_DEFINHを,カーネル管理外とした割込みハンドラ番号を有効な
2069  値と判定するようにする.
2070
2071 ・(a-1)または(a-2)を採用した場合には,INHNO_FIX_KERNELにカーネル管理と
2072  した割込みハンドラ番号のリストを,INHNO_FIX_NONKERNELにカーネル管理外
2073  とした割込みハンドラ番号のリスト設定する.
2074
2075 ・DEF_INHがカーネル管理外の割込みに対応できるようにする.標準の割込み管
2076  理機能の初期化処理を用いる場合には,x_define_inhをカーネル管理外の割
2077  込みに対応させる.
2078
2079 ・必要な場合には,TA_NONKERNEL属性が設定された割込みハンドラをカーネル
2080  管理外と扱うように,カーネル内の割込み出入口処理を修正する.標準の割
2081  込み管理機能の初期化処理を用いる場合,カーネル管理外の割込みに対して
2082  は,カーネル内の割込み出入口処理を生成せず,アプリケーションが登録し
2083  た割込みハンドラを直接呼び出すように,ターゲット非依存部により設定さ
2084  れるため,ターゲット依存部では対応する必要がない.
2085
2086 カーネル管理外の割込みに対して,CFG_INTによる割込み要求ラインの属性の設
2087 定をサポートするには,次の設定が必要になる.
2088
2089 ・(a-1)または(a-2)を採用した場合には,INTNO_CFGINT_VALIDに,カーネル管
2090  理外とした割込みに対応する割込み番号を含める.また,VALID_INTNO_CFGINT
2091  を,カーネル管理外とした割込み番号を有効な値と判定するようにする.
2092
2093 ・(a-1)または(a-2)を採用した場合には,INTNO_FIX_KERNELにカーネル管理と
2094  した割込み番号のリストを,INTNO_FIX_NONKERNELにカーネル管理外とした割
2095  込み番号のリスト設定する.
2096
2097 ・INTPRI_CFGINT_VALIDに,カーネル管理外の割込みとなる優先度を含める.
2098
2099 ・CFG_INTがカーネル管理外の割込みに対応できるようにする.標準の割込み管
2100  理機能の初期化処理を用いる場合には,x_config_intをカーネル管理外の割
2101  込みに対応させる.
2102
2103 chg_ipmにより,(NMI以外の)カーネル管理外の割込みをマスクできるように
2104 する場合には,次の設定が必要になる.
2105
2106 ・VALID_INTPRI_CHGIPMを,カーネル管理外の割込みとなる優先度を有効な値と
2107  判定するようにする.
2108
2109 ・t_set_ipmを,カーネル管理外の割込みとなる優先度を扱えるようにする.
2110
2111 6.7 CPU例外ハンドラとCPU例外発生時のシステム状態の参照
2112
2113 6.7.1 CPU例外ハンドラの出入口処理
2114
2115 CPU例外の出入口処理の方法はプロセッサによって大きく異なるが,おおよその
2116 処理内容は次の通り.
2117
2118 ----------------------------------------
2119 void
2120 <CPU例外の出入口処理>(void)
2121 {
2122         スクラッチレジスタをスタックに保存する
2123         if (カーネル管理外のCPU例外) {
2124                 if (タスクコンテキストでCPU例外発生) {
2125                         スタックを非タスクコンテキスト用のスタックに切り換え,
2126                                                                         非タスクコンテキストに切り換える
2127                 }
2128                 システム状態(コンテキストは除く)を,CPU例外発生時の状態にする
2129                 CPU例外ハンドラを,CPU例外の情報を記憶している領域の先頭番地を
2130                                                                         パラメータ(p_excinf)として呼び出す
2131                 if (タスクコンテキストでCPU例外発生) {
2132                         スタックをタスク用のスタックに戻し,タスクコンテキストに切り換える
2133                 }
2134                 CPU例外処理からのリターン後に,CPU例外発生時のシステム状態に
2135                                                                                                         戻るように準備する
2136         }
2137         else {
2138                 if (タスクコンテキストでCPU例外発生) {
2139 #ifdef TOPPERS_SUPPORT_OVRHDR
2140                         (少なくとも)カーネル管理の割込みを禁止した状態にする
2141                         ovrtimer_stop();                        /* オーバランタイマの停止 */
2142                         (必要なら)元の状態に戻す
2143 #endif /* TOPPERS_SUPPORT_OVRHDR */
2144                         スタックを非タスクコンテキスト用のスタックに切り換え,
2145                                                                         非タスクコンテキストに切り換える
2146                 }
2147                 システム状態(コンテキストは除く)を,CPU例外発生時の状態にする
2148                          (CPU例外発生時の割込み優先度マスクよりも優先度の高い割込み
2149                                 のみを受け付けられるようにして,CPUロック解除状態にする)
2150
2151 #ifdef LOG_EXC_ENTER
2152                 log_exc_enter(CPU例外ハンドラ番号);
2153 #endif /* LOG_EXC_ENTER */
2154                 CPU例外ハンドラを,CPU例外の情報を記憶している領域の先頭番地を
2155                                                                         パラメータ(p_excinf)として呼び出す
2156 #ifdef LOG_EXC_LEAVE
2157                 log_exc_leave(CPU例外ハンドラ番号);
2158 #endif /* LOG_EXC_LEAVE */
2159
2160           ret_exc:
2161                 if (タスクコンテキストでCPU例外発生) {
2162                         (少なくとも)カーネル管理の割込みを禁止した状態にする … (*d)
2163                         スタックをタスク用のスタックに戻し,タスクコンテキストに切り換える
2164                         if (reqflg) {
2165                                 reqflg = false;
2166                                 CPUロック状態にする … (*e)
2167                                 if (dspflg && p_runtsk != p_schedtsk) {
2168                                         スクラッチレジスタを除くすべてのレジスタをスタックに保存する
2169                                         スタックポインタを自タスク(p_runtsk)のTCBに保存する
2170                                         ret_exc_rを,実行再開番地として自タスクのTCBに保存する
2171                                                                                                                                         … (*a)
2172                                         dispatcherに分岐する
2173
2174                                   ret_exc_r:
2175                                         スクラッチレジスタを除くすべてのレジスタを
2176                                                                                                 スタックから復帰する
2177                                 }
2178 #ifdef TOPPERS_SUPPORT_OVRHDR
2179                                 ovrtimer_start();               /* オーバランタイマの動作開始 */
2180 #endif /* TOPPERS_SUPPORT_OVRHDR */
2181                                 calltex(); … (*b)
2182                         }
2183 #ifdef TOPPERS_SUPPORT_OVRHDR
2184                         else {
2185                                 ovrtimer_start();               /* オーバランタイマの動作開始 */
2186                         }
2187 #endif /* TOPPERS_SUPPORT_OVRHDR */
2188                 }
2189                 CPU例外処理からのリターン後に,CPUロック解除状態に戻るように準備する
2190         }
2191         スクラッチレジスタをスタックから復帰する
2192         CPU例外処理からのリターン
2193 }
2194 ----------------------------------------
2195
2196 CPU例外ハンドラは,非コンテキストに切り換えることを除いては,CPU例外発
2197 生時と同じシステム状態で呼び出さなければならない.例えば,CPU例外がCPU
2198 ロック状態で発生した場合にはCPUロック状態,CPUロック解除状態で発生した
2199 場合にはCPUロック解除状態で,CPU例外ハンドラを呼び出さなければならない.
2200 CPUロック状態で発生したCPU例外は,カーネル管理外のCPU例外となるため,カー
2201 ネル管理のCPU例外ハンドラについては,CPUロック解除状態で呼び出すことに
2202 なる.
2203
2204 カーネル管理外のCPU例外であることは,exc_sense_unlockがfalseを返す条件
2205 と,タスクコンテキストであることを調べないだけの違いであり,ほぼ同じコー
2206 ドで判定することができる.
2207
2208 上のコードでは,カーネル管理外のCPU例外に対して,トレースログ取得処理
2209 (log_exc_enterおよびlog_exc_leave)を呼び出していないが,全割込みロッ
2210 ク状態かNMIの処理中にCPU例外が発生した場合を除外すれば,呼び出してもか
2211 まわない.全割込みロック状態かNMIの処理中に発生したCPU例外の場合には,
2212 トレースログ取得処理を呼び出してはならない.
2213
2214 CPU例外ハンドラを実行する際に経由する部分では,CPU例外が起こる可能性を
2215 極力減らすとともに,CPU例外を起こす可能性がある場合(例えば,スクラッチ
2216 レジスタをスタックに保存する時に,バスエラーなどのCPU例外が発生する可能
2217 性が考えられる)には,その可能性をターゲット依存部のユーザーズマニュア
2218 ルに記載しなければならない.
2219
2220 ret_exc以降の処理は,割込みの出入口処理のret_int以降の処理と同じである
2221 ため,ターゲットによっては,共通のルーチンを用いることができる可能性が
2222 ある.
2223
2224 CPU例外の出入口処理をアセンブリ言語で記述する場合には,トレースログ取得
2225 処理は,「6.2 トレースログ機能への対応」の節で記述した方法でコーディン
2226 グすること.
2227
2228 6.7.2 CPU例外ハンドラの出入口処理の生成
2229
2230 CPU例外ベクトルをハードウェアで実現している場合など,CPU例外ハンドラ毎
2231 に出入口処理を用意した方が効率が良いターゲットのために,CPU例外ハンドラ
2232 毎に出入口処理を生成する機構を用意している.
2233
2234 以下のマクロは,標準のCPU例外管理機能の初期化処理を用いた場合のみ,ター
2235 ゲット非依存部で使われる.CPU例外管理機能の初期化処理をターゲット依存部
2236 で用意し,その中でこれらのマクロを使わない場合には,これらのマクロを用
2237 意する必要はない.
2238
2239 (6-7-2-1) EXC_ENTRY(excno, exchdr)
2240
2241 CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例
2242 外ハンドラの出入口処理のラベルを作るマクロ.EXCHDR_ENTRYを用いてCPU例外
2243 ハンドラ毎に出入口処理を生成する場合には,次のように定義する.
2244
2245 #define EXC_ENTRY(excno, exchdr)        _kernel_##exchdr##_##excno
2246
2247 CPU例外ハンドラ毎に出入口処理を作る必要がない場合には,次のように定義し
2248 て,CPU例外ハンドラの関数名をそのまま返す.
2249
2250 #define EXC_ENTRY(excno, exchdr)        exchdr
2251
2252 (6-7-2-2) EXCHDR_ENTRY(excno, excno_num, exchdr)
2253
2254 CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例
2255 外ハンドラの出入口処理を生成するマクロ.excno_numには,アセンブリ言語記
2256 述用に,CPU例外ハンドラ番号が数値で渡される.CPU例外ハンドラ毎に出入口
2257 処理を作る必要がない場合には,空に定義する.
2258
2259 6.7.3 CPU例外ハンドラの設定
2260
2261 (6-7-3-1) bool_t VALID_EXCNO_DEFEXC(EXCNO excno)(オプション)
2262
2263 excnoが,DEF_EXCに対するCPU例外ハンドラ番号として有効な値である場合に
2264 true,そうでない場合にfalseを返すマクロ.
2265
2266 ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
2267 ゲット依存部で使わないなら,用意する必要がない.
2268
2269 (6-7-3-2) void x_define_exc(EXCNO excno, FP exc_entry)
2270
2271 excnoで指定されたCPU例外ハンドラの出入口処理の番地をexc_entryに設定する.
2272
2273 この関数は,標準のCPU例外管理機能の初期化処理を用いた場合のみ,ターゲッ
2274 ト非依存部から呼び出される.CPU例外管理機能の初期化処理をターゲット依存
2275 部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する
2276 必要はない.
2277
2278 この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
2279 カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼
2280 び出せるように実装すればよい.
2281
2282 指定されたCPU例外ハンドラ番号がDEF_EXCに対するものとして有効な値でない
2283 場合の動作は保証する必要がない(assertでエラーとするのが望ましい).こ
2284 れは,コンフィギュレータが,パス2のテンプレートファイルのターゲット依存
2285 部で定義するEXCNO_DEFEXC_VALIDを用いてエラーを検出するためである.
2286
2287 6.7.4 CPU例外管理機能の初期化処理の変更
2288
2289 (6-7-4-1) OMIT_INITIALIZE_EXCEPTION(オプション)
2290
2291 CPU例外管理機能の初期化処理をターゲット依存部で用意し,ターゲット非依存
2292 部に含まれる標準の割込み管理機能の初期化処理を用いない場合には,このシ
2293 ンボルをマクロ定義する.
2294
2295 このシンボルをマクロ定義すると,EXCINIBとinitialize_exceptionの定義が,
2296 カーネルのターゲット非依存部から取り除かれる.また,TNUM_EXCNO,
2297 tnum_excno,excinib_tableの定義と,CPU例外ハンドラ毎の出入口処理を生成
2298 するための記述(EXCHDR_ENTRYマクロのリスト)を,コンフィギュレータのパ
2299 ス2のテンプレートファイルのターゲット非依存部によってkernel_cfg.cに生成
2300 されなくなる.
2301
2302 (6-7-4-2) void initialize_exception(void)(オプション)
2303
2304 OMIT_INITIALIZE_EXCEPTIONをマクロ定義した場合には,この関数をターゲット
2305 依存部で用意する.OMIT_INITIALIZE_EXCEPTIONをマクロ定義することにより取
2306 り除かれるその他のデータ型,変数,マクロは,この関数で使用する場合にの
2307 み用意すればよい.
2308
2309 6.7.5 デフォルトのCPU例外ハンドラ
2310
2311 (6-7-5-1) default_exc_handler(void)(オプション)
2312
2313 コンフィギュレータによりCPU例外ハンドラのテーブルを生成する場合などには,
2314 CPU例外ハンドラを登録しなかったCPU例外ハンドラ番号に対して,デフォルト
2315 のCPU例外ハンドラとして,default_exc_handlerを登録する.
2316
2317 default_exc_handlerは,標準のものをターゲット依存部で用意するが,ユーザ
2318 が用意したもので置き換えられるように,OMIT_DEFAULT_EXC_HANDLERをマクロ
2319 定義した場合には,ターゲット依存部で定義しないようにする.なお,ユーザ
2320 が用意する場合の名称は,_kernel_default_exc_handlerとなる.
2321
2322 6.7.6 CPU例外発生時のシステム状態の参照
2323
2324 (6-7-6-1) bool_t exc_sense_intmask(void *p_excinf)
2325
2326 CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコンテ
2327 キストであり,全割込みロック状態でなく,CPUロック状態でなく,(モデル上
2328 の)割込み優先度マスク全解除状態である時にtrue,そうでない時にfalseを返
2329 す関数.CPU例外がカーネル管理外の割込み処理中で発生した場合にもfalseを
2330 返す.
2331
2332 p_excinfには,CPU例外の情報を記憶している領域の先頭番地が渡される.
2333
2334 (6-7-6-2) bool_t exc_sense_unlock(void *p_excinf)
2335
2336 CPU例外の発生した時のシステム状態が,カーネル実行中でなく,タスクコンテ
2337 キストであり,全割込みロック状態でなく,CPUロック状態でない時にtrue,そ
2338 うでない時にfalseを返す関数.CPU例外がカーネル管理外の割込み処理中で発
2339 生した場合にもfalseを返す.
2340
2341 ターゲットによっては,全割込みロック(またはCPUロック)を小さいオーバヘッ
2342 ドで実現しようとすると,CPU例外ハンドラの中で,全割込みロック状態(また
2343 はCPUロック状態)と割込み優先度マスクを高いレベルに設定した状態を区別で
2344 きない場合がある.また,カーネル管理外の割込み処理中やカーネル実行中で
2345 あることを正確に判断することも難しい.そこで,ターゲット定義で,割込み
2346 優先度マスクをTMIN_INTPRIと同じかそれよりも高い値に設定している状態で発
2347 生したCPU例外をカーネル管理外のCPU例外と扱うこととし,それに対して
2348 falseを返すこととしてもよい.
2349
2350 p_excinfには,CPU例外の情報を記憶している領域の先頭番地が渡される.
2351
2352 6.8 カーネルの起動・終了とスタック領域など
2353
2354 (6-8-1) スタートアップモジュール
2355
2356 カーネルのスタートアップモジュールは,システムのリセット後に最初に実行
2357 されるプログラムである.スタートアップモジュールは,標準的には,プロセッ
2358 サ依存部またはチップ依存部で用意し以下の処理を行うが,それにこだわる必
2359 要はない.具体的には,開発環境に用意されているスタートアップモジュール
2360 を用いる方法(この場合,ターゲット依存部でmain関数を用意する必要がある)
2361 や,アプリケーションで用意する場合が考えられる.
2362
2363 (a) プロセッサ状態の初期化
2364
2365 プロセッサモード,スタックポインタ,フレームポインタ等,プロセッサの状
2366 態を初期化する.また,NMIを除くすべての割込みをマスクした状態(全割込み
2367 ロック状態と同等の状態)とする.DRAMコントローラの初期化など,メモリを
2368 アクセスするために必要な初期化処理をここで行ってもよい(次の
2369 hardware_init_hookで行ってもよい).
2370
2371 (b) hardware_init_hookを呼び出す
2372
2373 システムのリセット後すぐに行う必要のあるターゲットシステム依存の初期化
2374 処理を行うために,hardware_init_hookを呼び出す.hardware_init_hookが用
2375 意されていない場合は,何もしない.GNU開発環境では,リンカスクリプト中の
2376 weak definitionにより,hardware_init_hookが用意されていない場合の値を0
2377 とすることで,これを実現できる.weak definitionの機能を持たない開発環境
2378 では,hardware_init_hookを必ず呼び出すことにする.
2379
2380 hardware_init_hookは,ターゲット依存部で用意するのが標準であるが,シス
2381 テムのリセット後すぐに行う必要のある初期化処理を追加するために,アプリ
2382 ケーションで用意したものを用いる場合もある.
2383
2384 メモリアクセスに必要な初期化処理をhardware_init_hookで行う場合には,こ
2385 れを呼び出す時点でメモリにアクセスすることができないため,関数(サブルー
2386 チン)を呼び出すためにスタックを使用するプロセッサでは,戻り番地を汎用
2387 レジスタに入れて呼び出すといった工夫が必要である.この場合,
2388 hardware_init_hookをC言語で記述することはできなくなるが,やむをえない.
2389
2390 (c) bssセクションとdataセクションの初期化
2391
2392 bssセクションをクリアし,dataセクションに初期値を設定する.
2393
2394 ただし,カーネル本体は,kerflgがfalse(=0)に初期化されること以外に,
2395 これらのセクションが初期化されることに依存していないため,スタートアッ
2396 プモジュールをアプリケーションで用意する場合で,システムサービスやアプ
2397 リケーションがこれらのセクションが初期化されることに依存していない場合
2398 には,システムの起動時間を短縮するために,kerflgをfalseに初期化するだけ
2399 で十分である.
2400
2401 (d) software_init_hookを呼び出す
2402
2403 開発環境(特にライブラリ)に依存して必要な初期化処理を行うために,
2404 software_init_hookを呼び出す.software_init_hookが用意されていない場合
2405 は,何もしない.GNU開発環境では,リンカスクリプト中のweak definitionに
2406 より,software_init_hookが用意されていない場合の値を0とすることで,これ
2407 を実現できる.weak definitionの機能を持たない開発環境では,
2408 software_init_hookを必ず呼び出すことにする.
2409
2410 software_init_hookは,ターゲット依存部で用意するのが標準である.
2411
2412 (e) sta_kerへ分岐
2413
2414 sta_kerを呼び出す.sta_kerは,NMIを除くすべての割込みをマスクした状態
2415 (全割込みロック状態と同等の状態)で呼び出さなければならない.sta_kerか
2416 らはリターンすることがないため,スタートアップモジュールに戻ってくるこ
2417 とは考える必要がない.
2418
2419 (6-8-2) void target_initialize(void)
2420
2421 ターゲット依存部の初期化を行う関数.sta_kerの最初で呼び出される.プロセッ
2422 サ・チップ・開発環境依存の初期化処理を,それらの依存部に切り分けること
2423 も可能である.
2424
2425 この関数は,あくまでもカーネルのターゲット依存部の初期化処理を行うため
2426 のものである.アプリケーションに必要な初期化処理は,初期化ルーチンで行
2427 うのが基本であるが,システムのリセット後すぐに行う必要がある場合には,
2428 hardware_init_hookを用いる.
2429
2430 (6-8-3) void call_exit_kernel(void)
2431
2432 非タスクコンテキストに切り換えて,exit_kernelへ分岐する関数.ext_kerか
2433 ら呼び出される.exit_kernelからはリターンすることがないため,この関数に
2434 戻ってくることは考える必要がない.
2435
2436 非タスクコンテキストに切り換えるのは,終了処理ルーチンを,非タスクコン
2437 テキスト用のスタックで実行するためである.終了処理ルーチンをタスク用の
2438 スタックで実行すると,各タスクのスタック領域のサイズを決定する際に,終
2439 了処理ルーチンが使用するスタック領域を考慮しなければならない.これには,
2440 終了処理ルーチンが使用するスタック領域が大きい場合に各タスクのスタック
2441 領域を無駄に大きくしなければならないことに加えて,意図しないスタックオー
2442 バーフローが発生する可能性を高めるという問題がある.
2443
2444 この関数は,全割込みロック状態で呼ばれるため,全割込みロック状態から呼
2445 び出すことができない関数を呼ばないように実装しなければならない.
2446
2447 (6-8-4) void target_exit(void)
2448
2449 ターゲット依存部の終了処理を行う関数.この関数は,カーネル終了処理の最
2450 後に呼び出され,リターンしてはならない.プロセッサ・チップ・開発環境依
2451 存の終了処理を,それらの依存部に切り分けることも可能である.
2452
2453 この関数では,最初に,atexitによって登録された関数とデストラクタを呼び
2454 出すことを意図しており,標準的には,software_term_hookを呼び出す.
2455 software_term_hookが用意されていない場合は,何もしない.GNU開発環境では,
2456 リンカスクリプト中のweak definitionにより,software_term_hookが用意され
2457 ていない場合の値を0とすることで,これを実現できる.weak definitionの機
2458 能を持たない開発環境では,software_term_hookを必ず呼び出すことにする.
2459
2460 この関数は,全割込みロック状態で呼ばれるため,全割込みロック状態から呼
2461 び出すことができない関数を呼ばないように実装しなければならない.
2462
2463 6.9 カーネル内部のチューニング
2464
2465 6.9.1 ビットマップサーチ
2466
2467 (6-9-1-1) OMIT_BITMAP_SEARCH(オプション)
2468 (6-9-1-2) uint_t bitmap_search(uint16_t bitmap)(オプション)
2469
2470 ターゲット非依存部で,uint16_t型の整数値(bitmap)中の1のビットの内,最
2471 も下位(右)のものをサーチし,そのビット番号を返す関数bitmap_searchを用
2472 意している.ここで,ビット番号は最下位ビットを0とし,bitmapに0を指定し
2473 てはならないものとしている.
2474
2475 ビットサーチ命令を持つプロセッサでは,bitmap_searchを,ビットサーチ命令
2476 を使うように書き直した方が効率が良い場合がある.このような場合には,ター
2477 ゲット依存部でビットサーチ命令を使ったbitmap_searchを定義し,
2478 OMIT_BITMAP_SEARCHをマクロ定義する.
2479
2480 標準ライブラリにビットサーチ命令を用いたffsがある場合,bitmap_searchを
2481 (ffs(bitmap) - 1)に定義するとよい.
2482
2483 (6-9-1-3) uint16_t PRIMAP_BIT(PRI pri)(オプション)
2484
2485 ビットサーチ命令のサーチ方向が逆などの理由で,優先度とビットとの対応を
2486 変更したい場合には,PRIMAP_BITをマクロ定義する.
2487
2488 6.9.2 ビットフィールド
2489
2490 (6-9-2-1) BIT_FIELD_UINT(オプション)
2491
2492 8ビット以下の幅のビットフィールドで,符号無し整数値を保持したい場合に用
2493 いるべきデータ型.デフォルトの定義はunsigned intとなっているが,ターゲッ
2494 トやツール依存で,unsigned charまたはunsigned shortに定義した方が効率が
2495 良い場合がある.
2496
2497 (6-9-2-2) BIT_FIELD_BOOL(オプション)
2498
2499 1ビット幅のビットフィールドで,ブール値を保持したい場合に用いるべきデー
2500 タ型.デフォルトではBIT_FIELD_UINTと同一に定義しているが,ブール値を保
2501 持することを明示するために別の名前としている.
2502
2503 (6-9-2-3) TBIT_TCB_PRIORITY(オプション)
2504
2505 現在優先度(および,ミューテックス拡張におけるベース優先度)を保持する
2506 ためのTCB中のフィールドのビット数.デフォルトでは8ビットに定義している
2507 が,それ以外に定義したい場合に,ビット数をこの名前にマクロ定義する.
2508
2509 6.10 カーネル実装に関するその他の定義
2510
2511 6.10.1 非タスクコンテキスト用のスタック領域
2512
2513 (6-10-1-1) DEFAULT_ISTKSZ
2514
2515 DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の,
2516 デフォルトのスタック領域のサイズ.
2517
2518 (6-10-1-2) DEFAULT_ISTK(オプション)
2519
2520 DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の,
2521 デフォルトのスタック領域の先頭番地.このマクロが定義されない場合には,
2522 サイズがDEFAULT_ISTKSZのスタック領域が,配列により確保される.
2523
2524 (6-10-1-3) STK_T *TOPPERS_ISTKPT(STK_T *istk, SIZE istksz)(オプション)
2525
2526 非タスクコンテキスト用のスタックポインタの初期値を保持する変数(istkpt)
2527 を用いる場合に,このシンボルに,スタック領域の先頭番地(istk)とスタッ
2528 ク領域のサイズ(istksz)から,スタックポインタの初期値を求めるマクロを
2529 定義する.
2530
2531 6.10.2 空ラベルの定義
2532
2533 (6-10-2-1) TOPPERS_EMPTY_LABEL(type, symbol)(オプション)
2534
2535 リンクエラーを防ぐために,データ型typeの配列である変数symbolに定義を与
2536 えるためのマクロ.与えた定義が参照されることはないため,どのような定義
2537 を与えてもよい.
2538
2539 デフォルトでは,symbolを,要素型がtypeでサイズが0の配列に定義している.
2540 サイズが0の配列がエラーとならないコンパイラ(GCCはこれに該当)を用いる
2541 場合には,ターゲット依存部で定義する必要はない.
2542
2543 6.11 トレースログ機能に関する設定
2544
2545 ASPカーネルのソースコードには,カーネルの実行トレースログを取得するため
2546 のマクロ等が埋め込んである.デフォルトでは,これらのマクロは空に定義さ
2547 れてトレースログの取得は行わないが,これらのマクロを適切に定義すること
2548 でトレースログの取得を行うことができる.
2549
2550 6.11.1 取得できるトレースログの種類とマクロ
2551
2552 取得できるトレースログの種類と,それを取得するために定義するマクロは次
2553 の通りである.
2554
2555 (a) カーネルの動作開始と終了
2556
2557 次のマクロを定義することで,カーネルの動作開始時と終了時のトレースログ
2558 を取得することができる.
2559
2560         LOG_KER_ENTER           カーネルが動作を開始する直前(初期化の完了後)
2561         LOG_KER_LEAVE           カーネルの終了(ext_ker)が呼ばれた直後(終了処
2562                                                 理の実行前)
2563
2564 (b) 処理単位の実行開始と終了
2565
2566 次のマクロを定義することで,割込みハンドラ(INH),割込みサービスルーチ
2567 ン(ISR),周期ハンドラ(CYC),アラームハンドラ(ALM),CPU例外ハンド
2568 ラ(EXC),タスク例外処理ルーチン(TEX)の実行開始前と終了後のトレース
2569 ログを取得することができる.
2570
2571         LOG_<処理単位略号>_ENTER  処理単位の実行開始直前
2572         LOG_<処理単位略号>_LEAVE  処理単位の終了直後
2573
2574 割込みハンドラは,アプリケーションが登録したもののみを対象とし,割込み
2575 サービスルーチンを呼び出すためにカーネル内に生成されるものは対象としな
2576 い.タスクの実行開始と終了は,他の方法で取得できるため,この方法は用意
2577 していない.
2578
2579 なお,割込みハンドラとCPU例外ハンドラの実行開始と終了のトレースログ取得
2580 は,ターゲット依存部で実装する必要がある.詳しくは,「6.2 トレースログ
2581 機能への対応」「6.6.1 割込みハンドラの出入口処理」「6.7.1 CPU例外ハンド
2582 ラの出入口処理」の節を参照すること.
2583
2584 (c) タスク状態の変化
2585
2586 次のマクロを定義することで,タスク状態が変化した時のトレースログを取得
2587 することができる.ただし,実行状態と実行可能状態の間の遷移は,他の方法
2588 で取得できるため,このマクロでは取得できない.
2589
2590         LOG_TSKSTAT             タスク状態の変化
2591
2592 (d) ディスパッチャの実行開始と終了
2593
2594 次のマクロを定義することで,ディスパッチャが実行開始する時と,終了する
2595 時のトレースログを取得することができる.
2596
2597         LOG_DSP_ENTER   ディスパッチャの実行開始
2598         LOG_DSP_LEAVE   ディスパッチャの終了
2599
2600 ディスパッチャの実行開始は,タスクが実行状態から実行可能状態に遷移する
2601 タイミングであるため,実行可能状態へ遷移するタスクのTCBへのポインタをパ
2602 ラメータとする.逆に,ディスパッチャの終了は,タスクが実行可能状態から
2603 実行状態に遷移するタイミングであるため,実行状態へ遷移するタスクのTCBへ
2604 のポインタをパラメータとする.
2605
2606 ASPカーネルでは,実行できるタスクがなく,カーネルがアイドル状態になる場
2607 合には,ディスパッチャの中に留まる.そのため,アイドル状態への遷移とア
2608 イドル状態から他の状態への遷移は,このマクロでは取得できない.
2609
2610 なお,ディスパッチャの実行開始と終了のトレースログ取得は,ターゲット依
2611 存部で実装する必要がある.詳しくは,「6.2 トレースログ機能への対応」と
2612 「6.5.2 ディスパッチャ本体」の節を参照すること.
2613
2614 (e) サービスコールの入口と出口
2615
2616 次のマクロを定義することで,各サービスコールの入口と出口のトレースログ
2617 を取得することができる.
2618
2619         LOG_<サービスコールの大文字表記>_ENTER             サービスコール名の入口
2620         LOG_<サービスコールの大文字表記>_LEAVE             サービスコール名の出口
2621
2622 それぞれのマクロの名称やパラメータの詳細については,カーネルのソースコー
2623 ドを参照すること.
2624
2625 6.11.2 トレースログ記録のサンプルコード
2626
2627 トレースログを記録する方法の一例として,メモリ上にトレースログを記録す
2628 るためのサンプルコードをarch/logtraceディレクトリに用意している.このサ
2629 ンプルコードは,システムログ機能と同様のトレースログ機能を用意し,トレー
2630 スログ情報をメモリ上に記録するとともに,それを読み出して表示する機能を
2631 実現している.
2632
2633 このサンプルコードを組み込む方法は次の通りである.
2634
2635 (1) target_config.hおよびtarget_syssvc.hに,次の記述を追加する.
2636
2637         #ifdef TOPPERS_ENABLE_TRACE
2638         #include "logtrace/trace_config.h"
2639         #endif /* TOPPERS_ENABLE_TRACE */
2640
2641 (2) Makefile.targetに,次の記述を追加する.
2642
2643         ifeq ($(ENABLE_TRACE),true)
2644                 COPTS := $(COPTS) -DTOPPERS_ENABLE_TRACE
2645                 KERNEL_DIR := $(KERNEL_DIR) $(SRCDIR)/arch/logtrace
2646                 KERNEL_COBJS := $(KERNEL_COBJS) trace_config.o trace_dump.o
2647         endif
2648
2649 (3) スタートアップモジュールで,bssセクションのクリアを省略している場合
2650     には,trace_modeをTRACE_STOP(=0)に初期化するコードを追加する.こ
2651     れは,トレースログ機能が初期化される前に書き込まれるトレースログを
2652     無視するためである.
2653
2654 このサンプルコードを用いて,トレースログを記録・ダンプする方法の例につ
2655 いては,「TOPPERS/ASPカーネル ユーザーズマニュアル」の「11.5 トレースロ
2656 グ記録のサンプルコードの使用方法」の節を参照すること.
2657
2658 なお,このサンプルコードでは,ディスパッチャの出口,タスクの状態遷移,
2659 システムログの出力の3つのトレースログのみを記録している.他のトレースロ
2660 グを記録したい場合には,trace_config.h(およびtrace_dump.c)を修正する
2661 必要がある.なお,カーネルのトレースログを網羅的に記録するためのコード
2662 は,TLV(TraceLogVisualizer)の配布パッケージに含まれている.
2663
2664 6.12 カーネル実装のターゲット依存部のためのリネーム記述
2665
2666 カーネル内部に閉じて使われる関数や変数などの名称で,オブジェクトファイ
2667 ルのシンボル表に登録されて外部から参照できる名称は,C言語レベルで,先頭
2668 が"_kernel_"または"_KERNEL_"である名称としなければならないが,ASPカーネ
2669 ルでは,ソースコードをコンパクトに保ちつつこれを実現するために,リネー
2670 ム記述ファイルを導入している.
2671
2672 具体的には,リネームすべき名称をリストアップしたxxx_rename.defを用意し,
2673 このファイルからツール(utils/genrename)により,名称をリネームするため
2674 のマクロ定義を含むxxx_rename.hと,それらのマクロ定義を解除するための
2675 xxx_unrename.hを生成する.ツールの起動方法は次の通りである.
2676
2677         % genrename xxx
2678
2679 xxx_rename.defには,リネームすべき名称を1行に1つ記述する.xxxxという名
2680 称が記述されている場合,xxx_rename.hには次のような記述が生成される.
2681
2682 #define xxxx                            _kernel_xxxx
2683 #ifdef TOPPERS_LABEL_ASM
2684 #define _xxxx                           __kernel_xxxx
2685 #endif /* TOPPERS_LABEL_ASM */
2686
2687 また,xxx_unrename.hには次のような記述が生成される.
2688
2689 #undef xxxx
2690 #ifdef TOPPERS_LABEL_ASM
2691 #undef _xxxx
2692 #endif /* TOPPERS_LABEL_ASM */
2693
2694 xxx_rename.defの中には,他のリネーム記述を取り込むために,「INCLUDE
2695 "yyy"」または「INCLUDE <yyy>」という記述を含めることができる.この記述
2696 がされている場合,xxx_rename.hには「#include "yyy_rename.h"」または
2697 「#include <yyy_rename.h>」という記述が,xxx_unrename.hには「#include
2698 "yyy_unrename.h"」または「#include <yyy_unrename.h>」という記述が生成さ
2699 れる.
2700
2701 xxx_rename.defの中の"#"で始まる行はコメントとして読み飛ばされる.また,
2702 空行も無視される.
2703
2704 カーネルのターゲット非依存部で使われる名称をリネームするために,kernel
2705 ディレクトリに,kernel_rename.defと,そこから生成したkernel_rename.hお
2706 よびkernel_unrename.hが用意されている.kernel_rename.defには,
2707 「INCLUDE "target"」という記述が含まれており,ターゲット依存部のリネー
2708 ム記述を取り込むようになっている.ターゲット依存部で定義し,ターゲット
2709 非依存部で参照される名称は,ターゲット依存部のリネーム記述に含める.
2710
2711 ターゲット依存部では,ターゲット依存部で使われる名称をリネームするため
2712 に,target_rename.defと,そこから生成したtarget_rename.hおよび
2713 target_unrename.hを用意する.ターゲット依存部からプロセッサ・チップ・開
2714 発環境依存部を切り分ける場合には,target_rename.defにINCLUDE記述を入れ,
2715 プロセッサ・チップ・開発環境依存部のリネーム記述を取り込むようにする.
2716
2717 6.13 タイマドライバ
2718
2719 タイマドライバは,カーネルにタイムティックを通知するためのタイマドライ
2720 バである.
2721
2722 6.13.1 タイマドライバのファイル構成
2723
2724 タイマドライバを組み込むための静的APIを記述したシステムコンフィギュレー
2725 ションファイルを,target_timer.cfgに用意する.このファイルには,タイマ
2726 ドライバを初期化するための初期化ルーチンの追加,タイマドライバを終了さ
2727 せるための終了処理ルーチンの追加,タイマ割込みのための割込みハンドラの
2728 定義(または,割込みサービスルーチンの追加),タイマ割込みのための割込
2729 み要求ラインの属性の設定の静的APIなどを含むことになる.
2730
2731 タイマドライバを呼び出すために必要な定義を含むヘッダファイルを,
2732 target_timer.hに用意する.また,タイマドライバの実装ファイルを
2733 target_timer.cに用意する.
2734
2735 タイムティックの通知により行う処理の多くは,タスクの起動や待ち解除を行
2736 うものであるため,タイマ割込みの割込み優先度は,割込みの中で最低の優先
2737 度で十分である.ただし,周期ハンドラやアラームハンドラの実行開始遅れが
2738 問題になる場合には,タイマ割込みの割込み優先度をより高い値に設定したい.
2739 そこで,タイマ割込みの割込み優先度を変更する方法を,ターゲット依存部の
2740 ユーザーズマニュアルに記載すべきである.
2741
2742 6.13.2 タイマの初期化・終了処理・割込み処理
2743
2744 (6-13-2-1) void target_timer_initialize(intptr_t exinf)
2745
2746 タイマを初期化し,タイマ割込みを周期的に発生させる関数.タイマ割込みの
2747 周期は,TIC_NUMEとTIC_DENOで指定された時間と一致させる(「5.2 タイム
2748 ティックの定義」の節を参照).
2749
2750 この関数は,target_timer.cfg中に記述する静的APIにより,初期化ルーチンと
2751 してカーネルに登録することを想定している.
2752
2753 (6-13-2-2) void target_timer_terminate(intptr_t exinf)
2754
2755 タイマの動作を停止させ,タイマ割込みを発生しないようにする関数.
2756
2757 この関数は,target_timer.cfg中に記述する静的APIにより,終了処理ルーチン
2758 としてカーネルに登録することを想定している.
2759
2760 (6-13-2-3) void target_timer_handler(void)
2761     または void target_timer_isr(intptr_t exinf)
2762
2763 タイマ割込みにより起動される割込み処理プログラム.割込みハンドラとして
2764 実現する場合にはtarget_timer_handler,割込みサービスルーチンとして実現
2765 する場合にはtarget_timer_isrの名称とする.ターゲット非依存部の
2766 signal_timeを呼び出す.
2767
2768 target_timer_handlerは,標準的には次のように定義する.
2769
2770 ----------------------------------------
2771 void
2772 target_timer_handler(void)
2773 {
2774         i_begin_int(<タイマ割込みの割込み番号>);
2775         signal_time();
2776         i_end_int(<タイマ割込みの割込み番号>);
2777 }
2778 ----------------------------------------
2779
2780 この関数は,target_timer.cfg中に記述する静的APIにより,割込みハンドラま
2781 たは割込みサービスルーチンとしてカーネルに登録することを想定している.
2782
2783 6.13.3 性能評価用システム時刻の参照のための機能
2784
2785 性能評価用システム時刻の参照機能(get_utm)をサポートする場合には,タイ
2786 マドライバで,以下のデータ型や関数などを用意する.
2787
2788 (6-13-3-1) OMIT_GET_UTM(オプション)
2789
2790 ターゲット非依存部のget_utmの実装を使用せず,ターゲット依存部でget_utm
2791 を用意する場合には,このシンボルをマクロ定義する.このシンボルをマクロ
2792 定義した場合,以下のデータ型や関数などを用意する必要はない.
2793
2794 (6-13-3-2) CLOCK
2795
2796 タイマ値の内部表現のためのデータ型.
2797
2798 (6-13-3-3) CLOCK target_timer_get_current(void)
2799
2800 タイマの現在値を読み出し,内部表現で返す関数.タイマ値は,時間の経過と
2801 ともに増加することを想定している.ハードウェアのタイマが,タイマ値が減
2802 少するものである場合には,この関数内で増加する値となるように変換する.
2803
2804 (6-13-3-4) bool_t target_timer_probe_int(void)
2805
2806 タイマ割込み要求をチェックする関数.タイマ割込みが要求されている場合に
2807 true,要求されていない場合にfalseを返す.
2808
2809 (6-13-3-5) TO_USEC(clock)
2810
2811 タイマ値の内部表現を,1μ秒単位に変換するためのマクロ(または関数).
2812 targettimer_get_currentで読み出した値を,タイマ割込み発生からの経過時間
2813 (単位: 1μ秒)に変換するために用いる.
2814
2815 6.14 オーバランタイマドライバ(オプション)
2816
2817 オーバランタイマドライバは,オーバランハンドラを起動するためのタイマの
2818 ドライバである.オーバランハンドラ機能拡張パッケージをサポートしない場
2819 合には,オーバランタイマドライバを用意する必要はない.
2820
2821 6.14.1 オーバランタイマドライバのファイル構成
2822
2823 オーバランタイマドライバは,タイマドライバと同じファイルの中に記述する.
2824 オーバランタイマドライバのための記述は,TOPPERS_SUPPORT_OVRHDRがマクロ
2825 定義されている場合にのみ有効になるようにする.
2826
2827 すなわち,オーバランタイマドライバを組み込むための静的APIは
2828 target_timer.cfgの中に記述する.このファイルには,オーバランタイマドラ
2829 イバを初期化するための初期化ルーチンの追加,オーバランタイマドライバを
2830 終了させるための終了処理ルーチンの追加,オーバランタイマ割込みのための
2831 割込みハンドラの定義(または,割込みサービスルーチンの追加),オーバラ
2832 ンタイマ割込みのための割込み要求ラインの属性の設定の静的APIなどを含むこ
2833 とになる.
2834
2835 また,オーバランタイマドライバを呼び出すために必要な定義は
2836 target_timer.hの中に,オーバランタイマドライバの実装はtarget_timer.cの
2837 中に記述する.
2838
2839 オーバランハンドラは,タスクのオーバランに対する処理を行うものであるた
2840 め,オーバランタイマ割込みの割込み優先度は,割込みの中で最低の優先度で
2841 十分である.ただし,オーバランタイマ割込みの割込み優先度をより高い値に
2842 設定したい場合もないとは言えないため,オーバランタイマ割込みの割込み優
2843 先度を変更する方法を,ターゲット依存部のユーザーズマニュアルに記載すべ
2844 きである.
2845
2846 6.14.2 オーバランタイマの操作と割込み処理
2847
2848 (6-14-2-1) void target_ovrtimer_initialize(intptr_t exinf)
2849
2850 オーバランタイマの初期化処理を行う.タイマの動作開始は行わない.
2851
2852 この関数は,target_timer.cfg中に記述する静的APIにより,初期化ルーチンと
2853 してカーネルに登録することを想定している.
2854
2855 (6-14-2-2) void target_ovrtimer_terminate(intptr_t exinf)
2856
2857 オーバランタイマを停止させ,オーバランタイマ割込みを発生しないようにす
2858 る.
2859
2860 この関数は,target_timer.cfg中に記述する静的APIにより,終了処理ルーチン
2861 としてカーネルに登録することを想定している.
2862
2863 (6-14-2-3) void target_ovrtimer_start(OVRTIM ovrtim)
2864
2865 オーバランタイマに,残り時間ovrtimを設定し,動作開始する.ovrtimの単位
2866 はマイクロ秒とする.
2867
2868 (6-14-2-4) OVRTIM target_ovrtimer_stop(void)
2869
2870 オーバランタイマを停止し,タイマの残り時間を読み出す.もし残り時間が
2871 0(またはそれ未満)になっていた場合には,1を返す.また,オーバランタイ
2872 マからの割込みをクリアする.
2873
2874 (6-14-2-5) OVRTIM target_ovrtimer_get_current(void)
2875
2876 オーバランタイマの残り時間を読み出す.もし残り時間が0(またはそれ未満)
2877 になっていた場合には,0を返す.オーバランタイマからの割込みはクリアしな
2878 い.
2879
2880 (6-14-2-6) void target_ovrtimer_handler(void)
2881     または void target_ovrtimer_isr(intptr_t exinf)
2882
2883 オーバランタイマ割込みにより起動される割込み処理プログラム.割込みハン
2884 ドラとして実現する場合にはtarget_ovrtimer_handler,割込みサービスルーチ
2885 ンとして実現する場合にはtarget_ovrtimer_isrの名称とする.ターゲット非依
2886 存部のcall_ovrhdrを呼び出す.
2887
2888 target_timer_handlerは,標準的には次のように定義する.
2889
2890 ----------------------------------------
2891 void
2892 target_ovrtimer_handler(void)
2893 {
2894         i_begin_int(<オーバランタイマ割込みの割込み番号>);
2895         call_ovrhdr();
2896         i_end_int(<オーバランタイマ割込みの割込み番号>);
2897 }
2898 ----------------------------------------
2899
2900 この関数は,target_timer.cfg中に記述する静的APIにより,割込みハンドラま
2901 たは割込みサービスルーチンとしてカーネルに登録することを想定している.
2902
2903
2904 7.コンフィギュレータ設定ファイルのターゲット依存部
2905
2906 7.1 設定ファイルとターゲット依存部の位置付け
2907
2908 ASPカーネルのコンフィギュレータは,設定ファイルの記述に従ってファイルの
2909 生成およびエラーチェックを行う.コンフィギュレータの設定ファイルには,
2910 以下の4つがある.
2911
2912 (a) 静的APIテーブル
2913
2914 静的APIの一覧と,各静的APIのパラメータについて記述したファイル.静的
2915 APIを拡張する場合以外は変更する必要がないため,ターゲット非依存部で用意
2916 している(kernel/kernel_api.csv).
2917
2918 (b) 値取得シンボルテーブル
2919
2920 コンフィギュレータのパス1において,パラメータ計算用C言語ファイルに出力
2921 し,値を求めたいシンボル(一般には式)を記述するためのファイル.ターゲッ
2922 ト非依存部では,ターゲットに依存せずに必要となるシンボルを記述したファ
2923 イルを用意している(kernel/kernel_def.csv).
2924
2925 ターゲットに依存して必要となるシンボルがある場合には,targetディレクト
2926 リに置かれたtarget_def.csv中に記述する.target_def.csv中に記述して値を
2927 求めることができるシンボルは,kernel/kernel_int.hおよびそこからインクルー
2928 ドされるファイルで定義されていなければならない.kernel_int.hからは,
2929 target_stddef.h,target_kernel.h,target_config.hを(間接的に)インクルー
2930 ドしているため,これらのファイルおよびそこからインクルードされるファイ
2931 ルで定義されるターゲット依存のシンボルは,target_def.csv中に記述するこ
2932 とができる.
2933
2934 ここで値を求めたシンボルの値は,コンフィギュレータのパス2およびパス3の
2935 テンプレートファイル中で参照することができる.
2936
2937 (c) パス2のテンプレートファイル
2938
2939 コンフィギュレータのパス2は,テンプレートファイルに従って,カーネルの構
2940 成・初期化ファイル(kernel_cfg.c),構成・初期化ヘッダファイル
2941 (kernel_cfg.h)などを生成する.このテンプレートファイルは,ターゲット
2942 非依存部とターゲット依存部に切り分けてあるが,他のファイルのターゲット
2943 依存部とは逆に,ターゲット依存部からターゲット非依存部をインクルードす
2944 る形になっている.
2945
2946 具体的には,targetディレクトリに置かれたtarget.tfで,必要な変数を定義し
2947 た後,テンプレートファイルのターゲット非依存部(kernel/kernel.tf)をイ
2948 ンクルードする.kernel.tfでは,カーネルのターゲット非依存部で使用する変
2949 数定義等を生成する.kernel.tfをインクルードした後,target.tfでは,カー
2950 ネルのターゲット依存部で使用する変数定義等を生成する.target.tfから,プ
2951 ロセッサ依存部,チップ依存部を,開発環境依存部を切り分けてもよい.
2952
2953 (d) パス3のテンプレートファイル
2954
2955 コンフィギュレータのパス3は,テンプレートファイルに従って,静的APIの一
2956 般定数式パラメータのチェックを行う.このテンプレートファイルも,ターゲッ
2957 ト非依存部とターゲット依存部に切り分けてあり,ターゲット依存部からター
2958 ゲット非依存部をインクルードする形になっている.
2959
2960 具体的には,targetディレクトリに置かれたtarget_check.tfで,必要な変数を
2961 定義した後,テンプレートファイルのターゲット非依存部
2962 (kernel/kernel_check.tf)をインクルードする.kernel_check.tfでは,カー
2963 ネルのターゲット非依存部で初期化ブロックに出力した一般定数式パラメータ
2964 のチェックを行う.kernel_check.tfをインクルードした後,target_check.tf
2965 では,ターゲットに依存するチェックを行う.target_check.tfから,プロセッ
2966 サ依存部,チップ依存部を,開発環境依存部を切り分けてもよい.
2967
2968 なお,コンフィギュレータの詳細仕様と設定ファイルの記述方法については,
2969 別途PDFファイルの形で配布している「TOPPERS新世代カーネル用コンフィギュ
2970 レータ仕様」および「TOPPERS新世代カーネル用コンフィギュレータ内蔵マクロ
2971 プロセッサ仕様」を参照すること.
2972
2973 7.2 パス2のテンプレートファイルのターゲット依存部
2974
2975 以下では,パス2のテンプレートファイルのターゲット依存部を記述する上で必
2976 要な事項について説明する.
2977
2978 7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
2979
2980 target.tfからkernel.tfをインクルードする前に,次の変数を定義しておかな
2981 ければならない.
2982
2983 (7-2-1) INTNO_ATTISR_VALID              ATT_ISRで使用できる割込み番号
2984 (7-2-2) INHNO_ATTISR_VALID              INTNO_ATTISR_VALIDに対応する割込ハンドラ番号
2985 (7-2-3) INHNO_DEFINH_VALID              DEF_INTで使用できる割込みハンドラ番号
2986 (7-2-4) EXCNO_DEFEXC_VALID              DEF_EXCで使用できるCPU例外ハンドラ番号
2987 (7-2-5) INTNO_CFGINT_VALID              CFG_INTで使用できる割込み番号
2988 (7-2-6) INTPRI_CFGINT_VALID             CFG_INTで使用できる割込み優先度
2989
2990 APIで使用できる割込み番号/割込みハンドラ番号/CPU例外ハンドラ番号/割
2991 込み優先度のリストを,各変数に定義する.INHNO_ATTISR_VALIDには,
2992 INTNO_ATTISR_VALIDにリストアップした割込み番号に対応する割込みハンドラ
2993 番号のリストを定義する.
2994
2995 (7-2-7) TARGET_TSKATR(オプション)              ターゲット定義のタスク属性
2996 (7-2-8) TARGET_ISRATR(オプション)              ターゲット定義のISR属性
2997 (7-2-9) TARGET_INHATR(オプション)              ターゲット定義の割込みハンドラ属性
2998 (7-2-10) TARGET_INTATR(オプション)     ターゲット定義の割込み属性
2999 (7-2-11) TARGET_EXCATR(オプション)     ターゲット定義のCPU例外ハンドラ属性
3000
3001 各オブジェクトの属性を,ターゲット定義に拡張する場合に,該当するオブジェ
3002 クト属性を示す変数に,拡張に使用するビットの論理和を定義する.これによ
3003 り,拡張に使用するビットが設定されている場合に,エラーになるのを防ぐ.
3004
3005 (7-2-12) INTNO_FIX_KERNEL(オプション)          カーネル管理に固定されている
3006                                                                                         割込み番号
3007 (7-2-13) INHNO_FIX_KERNEL(オプション)          カーネル管理に固定されている
3008                                                                                         割込みハンドラ番号
3009 (7-2-14) INHNO_FIX_NONKERNEL(オプション)       カーネル管理外に固定されている
3010                                                                                         割込み番号
3011 (7-2-15) INHNO_FIX_NONKERNEL(オプション)       カーネル管理外に固定されている
3012                                                                                         割込みハンドラ番号
3013
3014 カーネル管理またはカーネル管理外に固定されている割込みがある場合には,
3015 それらの割込み番号と割込みハンドラ番号のリストを,各変数に定義する.
3016
3017 (7-2-16) USE_INHINIB_TABLE(オプション)
3018
3019 OMIT_INITIALIZE_INTERRUPTを定義したが,割込みハンドラの初期化に必要な情
3020 報をkernel_cfg.cに生成したい場合には,この変数を1に設定する.具体的には,
3021 TNUM_INHNO,tnum_inhno,inhinib_tableの定義と,割込みハンドラ毎の出入口
3022 処理を生成するための記述(INTHDR_ENTRYマクロのリスト)が,ターゲット非
3023 依存部によって生成される.
3024
3025 (7-2-17) USE_INTINIB_TABLE(オプション)
3026
3027 OMIT_INITIALIZE_INTERRUPTを定義したが,割込み要求ラインの初期化に必要な
3028 情報をkernel_cfg.cに生成したい場合には,この変数を1に設定する.具体的に
3029 は,TNUM_INTNO,tnum_intno,intinib_tableの定義が,ターゲット非依存部に
3030 よって生成される.
3031
3032 (7-2-18) TARGET_MIN_STKSZ(オプション)
3033
3034 ターゲット定義で,タスクのスタックサイズの最小値を設定する場合には,こ
3035 の変数をスタックサイズの最小値に定義する.
3036
3037 (7-2-19) CHECK_STKSZ_ALIGN(オプション)
3038
3039 スタック領域のサイズがある値の倍数でなければならない場合に,この変数を
3040 その値に定義する.この変数を定義することで,kernel.tfにおいて,スタック
3041 領域のサイズが正しくない(この変数に定義した値の倍数でない)場合のエラー
3042 をチェックするようになる.チェックが必要ない場合には,この変数を定義し
3043 ない.
3044
3045 (7-2-20) GENERATE_TSKINICTXB(オプション)
3046
3047 USE_TSKINICTXBをマクロ定義した場合,TSKINICTXBの初期化情報を生成するた
3048 めテンプレートファイル関数GENERATE_TSKINICTXBを定義する.
3049 GENERATE_TSKINICTXBには,タスクIDがパラメータとして渡される.
3050
3051 7.2.2 ターゲット非依存部で定義される変数
3052
3053 kernel.tfの中では次の変数が定義されるため,kernel.tfをインクルードした
3054 後,target.tfの中でこれらを参照することができる.
3055
3056 (7-3-1) INTNO[inhno]            inhnoを対応するintnoに変換するための連想配列
3057 (7-3-2) INHNO[intno]            intnoを対応するinhnoに変換するための連想配列
3058
3059 7.3 パス3のテンプレートファイルのターゲット依存部
3060
3061 以下では,パス3のテンプレートファイルのターゲット依存部を記述する上で必
3062 要な事項について説明する.
3063
3064 target_check.tfからkernel_check.tfをインクルードする前に,必要に応じて,
3065 次の変数を定義しておかなければならない.
3066
3067 (7-3-1) CHECK_FUNC_ALIGN(オプション) 関数のアライン単位
3068 (7-3-2) CHECK_FUNC_NONNULL(オプション)関数の非NULLチェック
3069 (7-3-3) CHECK_STACK_ALIGN(オプション)  スタック領域のアライン単位
3070 (7-3-4) CHECK_STACK_NONNULL(オプション)スタック領域の非NULLチェック
3071 (7-3-5) CHECK_MPF_ALIGN(オプション)    固定長メモリプール領域のアライン単位
3072 (7-3-6) CHECK_MPF_NONNULL(オプション)  固定長メモリプール領域の非NULLチェック
3073
3074 関数/スタック領域/固定長メモリプール領域の先頭番地のアラインメントの
3075 チェックを行う場合には,それぞれ,CHECK_FUNC_ALIGN/CHECK_STACK_ALIGN/
3076 CHECK_MPF_ALIGNをアライン単位に定義する.関数/スタック領域/固定長メモ
3077 リプール領域の先頭番地がNULLでないかのチェックを行う場合には,それぞれ
3078 CHECK_FUNC_NONNULL/CHECK_STACK_NONNULL/CHECK_MPF_NONNULLを1に定義する.
3079 チェックが必要ない場合には,該当する変数を定義しない.
3080
3081 7.4 cfg1_out.cのリンクに必要なスタブの定義ファイル
3082
3083 コンフィギュレータに関してターゲット依存に用意する必要があるファイルと
3084 して,設定ファイル以外に,cfg1_out.cをリンクするために必要なスタブの定
3085 義ファイルがある.
3086
3087 コンフィギュレータのパス1では,静的APIの整数定数式パラメータの値をCコン
3088 パイラを用いて求めるために,cfg1_out.cを生成する.これをコンパイル,リ
3089 ンクしてオブジェクトファイルを生成する際に,スタートアップモジュールか
3090 ら参照されるシンボルの定義を与える必要がある.
3091
3092 この定義を与えるために,cfg1_out.cから,ターゲット依存部の
3093 target_cfg1_out.hをインクルードしている.target_cfg1_out.h(または,そ
3094 こからインクルードされるファイル)には,スタートアップモジュールから参
3095 照されるシンボルのスタブの定義を含める.典型的には,以下のような定義を
3096 含める必要がある.
3097
3098 ----------------------------------------
3099 void sta_ker(void)
3100 {
3101 }
3102
3103 void hardware_init_hook(void)
3104 {
3105 }
3106
3107 void software_init_hook(void)
3108 {
3109 }
3110
3111 const SIZE              _kernel_istksz = 0;
3112
3113 STK_T *const    _kernel_istk = NULL;
3114 ----------------------------------------
3115
3116
3117 8.システムサービス等のターゲット依存部
3118
3119 8.0 システムサービスのターゲット依存部
3120
3121 シリアルポート数やシステムログタスク関連の定数など,システムサービスの
3122 構成を決定するための定義をtarget_syssvc.hまたはそこからインクルードされ
3123 るファイル(プロセッサ・チップ・開発環境依存部で用意されるヘッダファイ
3124 ルなど)に含める.
3125
3126 なお,TOPPERS組込みコンポーネントシステムが導入されると,このファイルの
3127 内容はコンポーネント記述ファイルに記述されることになり,このファイルは
3128 無くなる(または,大幅に縮小される)見込みである.
3129
3130 8.1 システムログ機能のターゲット依存定義
3131
3132 システムログ機能を使用する場合で,スタートアップモジュールでbssセクショ
3133 ンのクリアを省略している場合には,syslog_logmaskとsyslog_lowmask_notを
3134 0に初期化するコードを追加する.これは,システムログ機能が初期化される前
3135 に出力されたログ情報を,低レベル出力機能を用いて出力するためである.
3136
3137 ターゲット依存部で提供すべきシステムログ機能のための定義は次の通りであ
3138 る.
3139
3140 (8-1-1) TCNT_SYSLOG_BUFFER
3141
3142 システムログ機能のログバッファのサイズを定義するマクロ.定義しない場合
3143 のデフォルト値は32.
3144
3145 (8-1-2) void target_fput_log(char_t c)
3146
3147 システムログの低レベル出力のための文字出力関数.ターゲット依存の方法で,
3148 文字cを表示/出力/保存する.
3149
3150 この関数は,リエントラントに実装しなければならない.この関数内で排他制
3151 御が必要な場合には,SILを用いて全割込みロック状態にすること.また,全割
3152 込みロック状態で呼ばれる場合があるため,全割込みロック状態から呼び出す
3153 ことができない関数を呼ばないように実装しなければならない.
3154
3155 低レベル出力をシリアルポート経由で行う場合で,シリアルインタフェースド
3156 ライバとポートを共用しないことが望ましいが,ポート数が足りないためにや
3157 むをえず共用する場合には,両者が競合しないように注意が必要である.具体
3158 的には,両者が同じ設定でシリアルI/Oデバイスを使うようにし,シリアルイン
3159 タフェースドライバの動作中に低レベル出力が行われても差し支えないように
3160 設計する.また,低レベル出力が動作開始後にシリアルインタフェースドライ
3161 バがシリアルI/Oデバイスを初期化すると,文字化けが起こる可能性があるため,
3162 共用するポートは,低レベル出力機能側で初期化し,シリアルインタフェース
3163 ドライバでは初期化しないようにするとよい.
3164
3165 なお,この関数の本体を,どのファイルに記述するかが問題になる.システム
3166 サービスのターゲット依存部には,標準では,関数定義を記述するためのファ
3167 イルを用意していない.ターゲット依存で用意してもよいが,例外的に,カー
3168 ネル実装のターゲット依存モジュール(target_config.c)に記述してもよい.
3169 この場合,target_fput_logを,リネーム記述(target_rename.defなど)に含
3170 めてはならない.
3171
3172 8.2 ログタスクのターゲット依存定義
3173
3174 ターゲット依存部で提供すべきログタスクのための定義は次の通りである.こ
3175 れらの定義は,target_syssvc.hまたはそこからインクルードされるファイルに
3176 含める.
3177
3178 (8-2-1) LOGTASK_PRIORITY(オプション)
3179
3180 ログタスクの優先度を定義するマクロ.定義しない場合のデフォルト値は3.
3181
3182 (8-2-2) LOGTASK_STACK_SIZE(オプション)
3183
3184 ログタスクのスタックサイズを定義するマクロ.定義しない場合のデフォルト
3185 値は1024.
3186
3187 (8-2-3) LOGTASK_PORTID(オプション)
3188
3189 ログタスクの出力先のシリアルポート番号.定義しない場合のデフォルト値は1.
3190
3191 (8-2-4) LOGTASK_INTERVAL(オプション)
3192
3193 ログタスクの動作間隔(単位はミリ秒).定義しない場合のデフォルト値は10.
3194
3195 (8-2-5) LOGTASK_FLUSH_WAIT(オプション)
3196
3197 ログ出力を待ち合わせる処理において,タスクを待たせる単位となる時間(単
3198 位はミリ秒).定義しない場合のデフォルト値は1.
3199
3200 8.3 シリアルインタフェースドライバのターゲット依存部
3201
3202 ターゲット依存部で提供すべきシリアルインタフェースドライバのための定義
3203 は次の通りである.これらの定義は,別に指定がない限り,target_serial.hま
3204 たはそこからインクルードされるファイルに含め,必要なコンフィギュレーショ
3205 ン情報をtarget_serial.cfgに記述する.関数の実体が必要な場合には,
3206 target_serial.c等のファイルを用意する.
3207
3208 シリアルインタフェースドライバの中で,ターゲットのシリアルI/Oデバイスに
3209 依存する部分を,シリアルI/Oデバイスドライバと呼ぶ.シリアルI/Oデバイス
3210 ドライバは,おおよそ,ITRONデバイスドライバ設計ガイドラインのPDICに相当
3211 する.PDICに相当するファイルで,他のシステムにも共通に使える可能性があ
3212 る場合には,pdicディレクトリに置く.
3213
3214 8.3.1 変数,データ型,管理関数
3215
3216 (8-3-1-1) TNUM_PORT
3217
3218 シリアルインタフェースドライバがサポートするシリアルポート数を定義する
3219 マクロ.このマクロの定義は,target_syssvc.hまたはそこからインクルードさ
3220 れるファイルに含める.
3221
3222 (8-3-1-2) void sio_initialize(intptr_t exinf)(オプション)
3223
3224 シリアルI/Oデバイスドライバの初期化処理.target_serial.cfgに,この関数
3225 を初期化ルーチンとして登録する静的APIを含める.
3226
3227 (8-3-1-3) void sio_terminate(intptr_t exinf)(オプション)
3228
3229 シリアルI/Oデバイスドライバの終了処理.target_serial.cfgに,この関数を
3230 終了処理ルーチンとして登録する静的APIを含める.
3231
3232 (8-3-1-4) void sio_isr(intptr_t exinf)
3233
3234 シリアルI/Oデバイスの割込みサービスルーチン.target_serial.cfgに,この
3235 関数を割込みサービスルーチンとして登録する静的APIを含める.また,その静
3236 的APIに必要なシリアルI/Oデバイスの割込み番号などは,target_serial.hでマ
3237 クロ定義する.割込みサービスルーチンではなく,割込みハンドラとすること
3238 もできる.
3239
3240 (8-3-1-5) SIOPCB
3241
3242 シリアルI/Oポート管理ブロックのデータ型(target_serial.hには,データ型
3243 の宣言だけ含まれていればよい).
3244
3245 (8-3-1-6) SIO_RDY_SNDとSIO_RDY_RCV
3246
3247 送信可能コールバックの識別番号をSIO_RDY_SNDに,受信通知コールバックの識
3248 別番号をSIO_RDY_RCVにマクロ定義する.コールバックの禁止/許可を行なうサー
3249 ビスコール(sio_ena_cbrとsio_dis_cbr)で用いる.
3250
3251 8.3.2 デバイスサービスルーチン
3252
3253 以下のデバイスサービルルーチンは,(少なくとも)シリアルI/Oポートからの
3254 割込みがマスクされた状態で呼び出される.また,タスクコンテキスト,非タ
3255 スクコンテキストのいずれで呼び出される場合もある(いずれで呼び出されて
3256 も動作するようにしなければならない).
3257
3258 (8-3-2-1) SIOPCB *sio_opn_por(ID siopid, intptr_t exinf)
3259
3260 siopidで指定されるシリアルI/Oポートをオープンする関数.exinfはシリアル
3261 I/Oポートに対する拡張情報で,コールバックを呼ぶ時にポートを区別するた
3262 めに渡す.
3263
3264 (8-3-2-2) void sio_cls_por(SIOPCB *siopcb)
3265
3266 siopcbで指定されるシリアルI/Oポートをクローズする関数.
3267
3268 (8-3-2-3) bool_t sio_snd_chr(SIOPCB *siopcb, char_t c)
3269
3270 siopcbで指定されるシリアルI/Oポートに,cで示される文字を送信する関数.
3271 文字を送信レジスタに入れた場合にはtrueを,前に送信した文字の送信が終わっ
3272 ていないために,文字を送信レジスタに入れられなかった場合にはfalseを返す.
3273
3274 (8-3-2-4) int_t sio_rcv_chr(SIOPCB *siopcb)
3275
3276 siopcbで指定されるシリアルI/Oポートから文字を読む関数.文字を受信してい
3277 た場合,読んだ文字のコードは正の値として返し,文字を受信していない場合
3278 には-1を返す.
3279
3280 (8-3-2-5) void sio_ena_cbr(SIOPCB *siopcb, uint_t cbrtn)
3281
3282 siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ
3283 クを許可する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる.
3284
3285 (8-3-2-6) void sio_dis_cbr(SIOPCB *siopcb, uint_t cbrtn)
3286
3287 siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ
3288 クを禁止する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる.
3289
3290 8.3.3 コールバックルーチン
3291
3292 ターゲット依存部は,必要なタイミングで,シリアルインタフェースドライバ
3293 のターゲット非依存部に含まれる以下のコールバックルーチンを呼び出びださ
3294 なければならない.ただし,それぞれのコールバックが禁止されている時は,
3295 コールバックルーチンを呼び出してはならない.
3296
3297 コールバックルーチンは,(少なくとも)シリアルI/Oポートからの割込みが禁
3298 止された状態で,非タスクコンテキストで呼び出す.exinfには,シリアルI/O
3299 ポートのオープン時に指定された拡張情報を渡す.
3300
3301 (8-3-3-1) void sio_irdy_snd(intptr_t exinf)
3302
3303 送信可能コールバックルーチン.シリアルI/Oポートに対して文字が送信できる
3304 状態になった場合に呼び出す.シリアルインタフェースドライバは,このコー
3305 ルバックルーチンの中で,sio_snd_chrを呼び出して次の文字を送信するか,送
3306 信すべき文字がない場合には送信可能コールバックを禁止する.
3307
3308 (8-3-3-2) void sio_irdy_rcv(intptr_t exinf)
3309
3310 受信通知コールバックルーチン.シリアルI/Oポートから文字を受信した場合に
3311 呼び出す.シリアルインタフェースドライバは,このコールバックルーチンの
3312 中で,必ずsio_rcv_chrを呼び出して受信した文字を取り出す.
3313
3314 8.4 カーネル起動メッセージの出力のターゲット依存定義
3315
3316 ターゲット依存部で提供すべきカーネル起動メッセージの出力のための定義は
3317 次の通りである.
3318
3319 (8-4-1) TARGET_NAME
3320
3321 ターゲットの名称に定義する.
3322
3323 (8-4-2) TARGET_COPYRIGHT(オプション)
3324
3325 カーネル起動メッセージに,ターゲット依存部の著作権表示を追加するための
3326 マクロ.デフォルトでは,ターゲット依存部の著作権表示を追加しない.
3327
3328 8.5 サンプルプログラムとテストプログラムのターゲット依存定義
3329
3330 ターゲット依存部で提供すべきサンプルプログラムおよびテストプログラムの
3331 ための定義は次の通りである.これらの定義は,target_test.h(またはそれら
3332 からインクルードされるファイル)に含める.
3333
3334 (8-5-1) STACK_SIZE(オプション)
3335
3336 サンプルプログラムおよびテストプログラムのタスクのスタックサイズを定義
3337 するマクロ.定義しない場合のデフォルト値は4096.デフォルト設定ではメモ
3338 リが不足する場合や,シミュレーション環境などで大きいスタック領域が必要
3339 な場合には,ターゲット依存部でこのマクロを設定するスタックサイズに定義
3340 する.
3341
3342 (8-5-2) CPUEXC1(オプション)
3343
3344 サンプルプログラムおよびテストプログラムで用いるCPU例外のCPU例外ハンド
3345 ラ番号を定義するマクロ.このマクロを定義しない場合,CPU例外ハンドラを使
3346 う部分がサンプルプログラムから除外される.CPU例外ハンドラのテストをする
3347 テストプログラムはコンパイルできない.
3348
3349 (8-5-3) RAISE_CPU_EXCEPTION(オプション)
3350
3351 CPUEXC1に定義したCPU例外を発生させるC言語のプログラムを定義するマクロ.
3352 CPUEXC1を定義した場合には必ず定義しなければならない.
3353
3354 (8-5-4) CANNOT_RETURN_CPUEXC(オプション)
3355
3356 ターゲットシステムの制約により,CPU例外ハンドラからリターンした後に,タ
3357 スクの実行を継続できない場合に定義するマクロ.このマクロを定義すると,
3358 CPU例外ハンドラのテストをするテストプログラムから,CPU例外ハンドラから
3359 リターンした後の処理が除外される.サンプルプログラムの該当部分は正しく
3360 動作しない.
3361
3362 (8-5-5) TASK_PORTID(オプション)
3363
3364 サンプルプログラムにおいて,コマンド文字を読み込むシリアルポート番号を
3365 定義するマクロ.定義しない場合のデフォルト値は1.
3366
3367 (8-5-6) LOOP_REF(オプション)
3368
3369 サンプルプログラムにおいて,プロセッサの速度を計測するためのループ回数
3370 を定義するマクロ.定義しない場合のデフォルト値は1000000.デフォルト設定
3371 では,値が大き過ぎて計測に時間がかかりすぎる場合や,値が小さ過ぎて計測
3372 結果が安定しない場合に,ターゲット依存部でこのマクロを設定するループ回
3373 数に定義する.
3374
3375 (8-5-7) MEASURE_TWICE(オプション)
3376
3377 サンプルプログラムにおいて,プロセッサの速度を2度計測する場合に定義する
3378 マクロ.シミュレーション環境などプロセッサの速度が変動する環境で,1度の
3379 計測では計測結果が安定しない場合に定義する.
3380
3381 (8-5-8) TASK_LOOP(オプション)
3382
3383 サンプルプログラムにおいて,プロセッサの速度を計測せずに,タスク内での
3384 ループ回数を固定する場合に,ループ回数を定義するマクロ.ループ全体の実
3385 行時間が0.4秒程度になるようなループ回数を,このマクロに定義する.
3386
3387 8.6 実行時間分布集計モジュールのターゲット依存定義
3388
3389 実行時間分布集計モジュールの設定をターゲット依存部で変更する場合に,ター
3390 ゲット依存部で提供すべき実行時間分布集計モジュールのための定義は次の通
3391 りである.これらの定義は,target_test.h(またはそこからインクルードされ
3392 るファイル)に含める.この他に,ターゲット依存で必要な初期化処理がある
3393 場合にも,ターゲット依存部に含める.
3394
3395 (8-6-1) HISTTIM(オプション)
3396
3397 実行時間計測用の時刻のデータ型を定義するマクロ.定義しない場合のデフォ
3398 ルトはSYSUTM.
3399
3400 (8-6-2) void HIST_GET_TIM(HISTTIM *p_time)(オプション)
3401
3402 実行時間計測用の現在時刻を*p_timeに取得する処理に定義するマクロ.定義し
3403 ない場合のデフォルトはget_utm.
3404
3405 (8-6-3) uint_t HIST_CONV_TIM(HISTTIM time)(オプション)
3406
3407 実行時間計測用の時刻の差(時間)を,実行時間分布集計用の値に変換する処
3408 理に定義するマクロ.時刻が過去に戻ったかオーバフローしたかの区別がつか
3409 ない場合には,最上位ビットが1の値(INT_MAXよりも大きい値)を返す.定義
3410 しない場合のデフォルトは,timeをuint_tにキャストする処理.
3411
3412 (8-6-4) void HIST_BM_HOOK(void)(オプション)
3413
3414 実行時間計測直前に行うべき処理に定義するマクロ.キャッシュのパージやフィ
3415 ル,メモリバリア処理等を行いたい場合には,このマクロに定義する.定義し
3416 ない場合のデフォルトは,空の処理になる.
3417
3418
3419 9.その他
3420
3421 9.1 ドキュメント
3422
3423 ターゲット依存部のユーザーズマニュアルを,target_user.txtに用意する.プ
3424 ロセッサ・チップ・開発環境依存部のユーザーズマニュアルを切り分けてもよ
3425 いし,ファイルが大きくなる場合には複数のファイルに分割してよいが,その
3426 場合には,target_user.txt中にそれらのファイル名を記述すること.
3427
3428 ターゲット依存部のユーザーズマニュアルには,少なくとも次のような内容を
3429 記述することが望ましい.
3430
3431 (1) 対応しているターゲットシステムの種類・構成,バージョン番号
3432         ・ターゲットハードウェア(ボード等)の名称と対応している構成
3433         ・ターゲット略称
3434         ・ターゲット非依存部のバージョン番号
3435         ・プロセッサ,チップ,開発環境依存部の構成とバージョン番号
3436         ・使用するPDICとバージョン番号
3437
3438 (2) 使用する開発環境と動作検証した条件(バージョン,オプション等)
3439         ・言語処理系(コンパイラ,アセンブラ,リンカ等)
3440         ・デバッグ環境
3441
3442 (3) ターゲット定義事項の規定
3443
3444 (3-1) データ型に関する規定
3445         ・int_t型,long_t型のサイズ
3446         ・char_t型,int_least8_t型,void *型,intptr_t型のサイズ
3447         ・int8_t型,uint8_t型,int64_t型,uint64_t型,int128_t型,
3448          uint128_t型,float32_t型,double64_t型のサポートの有無
3449
3450 (3-2) 割込み処理に関する規定
3451         ・割込みハンドラ番号と割込み番号の割当て,両者の対応
3452         ・割込み優先度の段階数(TMIN_INTPRIの値)
3453         ・dis_intとena_intのサポートの有無,その制限事項
3454         ・CFG_INTの制限事項と拡張(ターゲット定義で使用できる割込み属性)
3455         ・TOPPERS標準割込み処理モデルからのその他の逸脱
3456
3457 (3-3) カーネル管理外の割込みに関する規定
3458         ・TMIN_INTPRIは固定か設定できるか,その設定方法
3459         ・NMI以外にカーネル管理外の割込みを設けるか(設けられるようにするか)
3460         ・カーネル管理外の割込みの設定方法
3461         ・カーネル管理外の割込みに対してDEF_INH,CFG_INTをサポートするか
3462         ・カーネル管理外の割込みハンドラが実行開始される時のシステム状態と
3463          コンテキスト
3464         ・割込みハンドラの終了時に行われる処理
3465         ・カーネル管理外の割込みハンドラの記述方法
3466         ・カーネル内の割込み出入口処理で起こる可能性のあるCPU例外
3467
3468 (3-4) CPU例外処理に関する規定
3469         ・CPU例外ハンドラ番号の割当て
3470         ・割込み優先度マスクをTMIN_INTPRIと同じかそれよりも高い値に設定して
3471          いる状態で発生したCPU例外を,カーネル管理外のCPU例外と扱うか
3472         ・カーネル内のCPU例外出入口処理で起こる可能性のあるCPU例外
3473
3474 (3-5) 性能評価用システム時刻の参照に関する規定
3475         ・get_utmのサポートの有無,その制限事項
3476
3477 (3-6) オーバランハンドラ機能拡張のサポートに関する規定
3478         ・オーバランハンドラ機能拡張パッケージのサポートの有無
3479         ・プロセッサ時間に指定できる値の最大値(TMAX_OVRTIMの値)
3480
3481 (3-7) その他
3482         ・その他の制限事項
3483         ・その他の拡張機能
3484
3485 (4) カーネルの起動/終了処理に関する情報
3486         ・用意しているスタートアップモジュールの処理内容
3487         ・スタートアップモジュールからhardware_init_hookを呼び出している場
3488          合には,hardware_init_hookをアプリケーションで用意する場合の作成
3489          方法や制限事項など
3490         ・カーネルを終了した後の振舞い
3491
3492 (5) メモリマップ
3493         ・デフォルトのメモリマップ,その変更方法
3494
3495 (6) タイマドライバ関連の情報
3496         ・タイムティックの周期,その変更方法
3497         ・使用するリソース(タイマ)
3498         ・タイマ割込みの割込み優先度の変更方法
3499         ・オーバランタイマ割込みの割込み優先度の変更方法
3500
3501 (7) シリアルインタフェースドライバの情報
3502         ・使用するリソース(SIOコントローラ)
3503         ・通信パラメータ(ボーレート,ビット数,パリティの有無,ストップビット)
3504
3505 (8) システムログ機能の情報
3506         ・システムログの低レベル出力の実現方法
3507         ・通信パラメータ(ボーレート,ビット数,パリティの有無,ストップビット)
3508
3509 (9) システム構築手順
3510
3511 (10) ターゲットシステム固有の注意事項
3512         ・タスクコンテキストに含まれるレジスタ,含まれないレジスタ
3513
3514 (10) 類似のターゲットにポーティングする開発者向けの参考情報
3515
3516 (12) ディレクトリ構成・ファイル構成
3517
3518 (13) バージョン履歴
3519
3520 また,必要に応じて,ターゲット依存部の設計メモを,target_design.txtに用
3521 意する.プロセッサ・チップ・開発環境依存部に関する設計メモを切り分けて
3522 もよいし,ファイルが大きくなる場合には複数のファイルに分割してもよいが,
3523 その場合には,target_design.txt中にそれらのファイル名を記述すること.
3524
3525 9.2 パッケージ記述ファイル
3526
3527 リリースパッケージ(個別パッケージおよび簡易パッケージ)を作成するため
3528 に,パッケージに含めるファイルを記述したパッケージ記述ファイルを用意す
3529 る.パッケージ記述ファイルの名称は,個別パッケージ用をMANIFEST,簡易パッ
3530 ケージ用をE_PACKAGEとする.
3531
3532 例えば,arch/arm_gccディレクトリに置かれたMANIFESTファイルを用いて個別
3533 パッケージを作成する場合には,次のコマンドを実行する.
3534
3535         % utils/makerelease arch/arm_gcc/MANIFEST
3536
3537 このコマンドにより,RELEASE/asp_arch_arm_gcc-<バージョン番号>.tar.gzが
3538 作成される.また,target/at91skyeye_gccディレクトリに置かれたE_PACKAGE
3539 ファイルを用いて簡易パッケージを作成する場合には,次のコマンドを実行す
3540 る.
3541
3542         % utils/makerelease target/at91skyeye_gcc/E_PACKAGE
3543
3544 このコマンドにより,RELEASE/asp_at91skyeye_gcc-<バージョン番号>.tar.gz
3545 が作成される(RELEASEディレクトリがない場合には,ディレクトリが作られ
3546 る).
3547
3548 なお,makereleaseユーティリティは,ASPカーネルのソースファイルが置かれ
3549 たディレクトリが,aspという名称であることを仮定している(異なる名称の場
3550 合でもパッケージは作成できるが,パッケージを展開した時に展開されるディ
3551 レクトリがaspでなくなる).また,標準のtarコマンドがGNU tarであること
3552 (正確には,zオプションに対応していること)を想定している.
3553
3554 パッケージ記述ファイルには,パッケージに含めるファイル名を,パッケージ
3555 記述ファイルが置かれたディレクトリからの相対パス名で,1行に1つずつ記述
3556 する.また,必要に応じて,以下のディレクティブを含める.
3557
3558 (a) E_PACKAGE <簡易パッケージ名>
3559
3560 簡易パッケージ名を指定する.簡易パッケージ記述ファイル(E_PACKAGE)の先
3561 頭に記述する.簡易パッケージ名は,asp_<ターゲット略称>とする.例えば,
3562 ターゲット略称がat91skyeye_gccの場合には,asp_at91skyeye_gccとなる.個
3563 別パッケージと区別するために,簡易パッケージのファイル名には"target"を
3564 含めない.
3565
3566 (b) PACKAGE <個別パッケージ名>
3567
3568 個別パッケージ名を指定する.個別パッケージ記述ファイル(MANIFEST)の先
3569 頭に記述する.また,そこからインクルードされる各ファイルの先頭にも記述
3570 し,それをインクルードしている個別パッケージ名を指定する.ターゲット依
3571 存部の個別パッケージ名は,個別パッケージ記述ファイルが置かれたディレク
3572 トリの相対パス中の"/"を"_"に置き換えた文字列を,"asp_"の後につなげたも
3573 のとする.例えば,個別パッケージ記述ファイルがarch/arm_gcc/MANIFESTの場
3574 合には,asp_arch_arm_gccとなる.
3575
3576 (c) VERSION <バージョン番号>
3577
3578 パッケージのバージョン番号を指定する.簡易パッケージ記述ファイルおよび
3579 個別パッケージ記述ファイルの中に記述する.簡易パッケージにおいて,バー
3580 ジョン番号をパッケージ化した日付とする場合には,パッケージ番号の代わり
3581 に%dateと記述する.
3582
3583 バージョン番号の付与方法については,「TOPPERS/ASPカーネル ユーザーズマ
3584 ニュアル」の「2.2 簡易パッケージ」および「2.3 個別パッケージ」の節を参
3585 照すること.
3586
3587 (d) INCLUDE <ファイル名>
3588
3589 別のパッケージ記述ファイルをインクルードする.簡易パッケージ記述ファイ
3590 ルからは,個別パッケージ記述ファイルのみをインクルードするのを原則とす
3591 る.個別パッケージ記述ファイルからインクルードされるファイル中で指定さ
3592 れる個別パッケージ名は,すべて一致していなければならない.
3593
3594
3595 10.リファレンス
3596
3597 10.1 ターゲット依存部のファイル一覧
3598
3599 標準的なターゲット依存部のファイル構成は次の通りである.
3600
3601 Makefile.target         Makefileのターゲット依存部(2章).
3602
3603 target_stddef.h         TOPPERS共通定義(t_stddef.h)のターゲット依存部(3
3604                                         章).アプリケーションとカーネルの両方からインクルー
3605                                         ドされる.
3606 target_sil.h            システムインタフェースレイヤ(sil.h)のターゲット依
3607                                         存部(4章).アプリケーションとカーネルの両方から
3608                                         インクルードされる.
3609 target_kernel.h         カーネルAPI(kernel.h)のターゲット依存部(5章).
3610                                         アプリケーションとカーネルの両方からインクルードさ
3611                                         れる.
3612
3613 target_config.h         カーネル実装のターゲット依存部のヘッダファイル(6
3614                                         章).カーネルのみからインクルードされる.
3615 target_config.c         カーネル実装のターゲット依存部のC言語で記述される
3616                                         部分(6章,オプション).
3617 target_support.S        カーネル実装のターゲット依存部のアセンブリ言語で記
3618                                         述される部分(6章,オプション).
3619 target_rename.def       カーネル実装のターゲット依存部のためのリネーム記述
3620                                         (6.12節).
3621 target_rename.h         target_rename.defから生成されるファイル(6.12節).
3622 target_unrename.h       target_rename.defから生成されるファイル(6.12節).
3623 target_timer.cfg        タイマドライバのシステムコンフィギュレーションファ
3624                                         イル(6.13節).
3625 target_timer.h          タイマドライバのヘッダファイル(6.13節).カーネル
3626                                         のみからインクルードされる.
3627 target_timer.c          タイマドライバの実装ファイル(6.13節,オプション).
3628 システム略称.h            ターゲットのハードウェア資源(割込みハンドラ番号や
3629                                         CPU例外ハンドラ番号,デバイスレジスタの番地など)の
3630                                         定義を含むヘッダファイル.アプリケーションとカーネ
3631                                         ルの両方からインクルードされる(6章,オプション).
3632
3633 target_def.csv          コンフィギュレータの値取得シンボルテーブルのターゲッ
3634                                         ト依存部(7章,オプション).
3635 target.tf                       コンフィギュレータのパス2のテンプレートファイルの
3636                                         ターゲット依存部(7.2節).
3637 target_check.tf         コンフィギュレータのパス3のテンプレートファイル(7.3
3638                                         節).
3639 target_cfg1_out.h       cfg1_out.cのリンクに必要なスタブの定義ファイル(7.4
3640                                         節).
3641
3642 target_syssvc.h         システムサービスのターゲット依存定義(8.0節).
3643 target_serial.cfg       シリアルドライバのシステムコンフィギュレーションファ
3644                                         イル(8.3節).
3645 target_serial.h         シリアルドライバのヘッダファイル(8.3節).シリアル
3646                                         ドライバのみからインクルードされる.
3647 target_serial.c         シリアルドライバの実装ファイル(8.3節,オプション).
3648 target_test.h           テストプログラムのターゲット依存定義(8.4節).
3649
3650 target_user.txt         ユーザーズマニュアル(9.1節)
3651 target_design.txt       設計メモ(9.1節,オプション)
3652 MANIFEST                        個別パッケージに含めるファイルのリスト(9.2節,オプ
3653                                         ション)
3654 E_PACKAGE                       簡易パッケージに含めるファイルのリスト(9.2節,オプ
3655                                         ション)
3656
3657 以上