source: ssp_qb_r5f100le_cs/trunk/doc/porting.txt@ 95

Last change on this file since 95 was 95, checked in by nmir-saito, 9 years ago

ファイルの mime-type 変更

  • Property svn:mime-type set to text/plain; charset=shift_jis
File size: 121.1 KB
Line 
1
2 TOPPERS/SSPカーネル
3 ターゲット依存部 ポーティングガイド
4
5 対応バージョン: Release 1.3.0
6 最終更新: 2015年5月11日
7
8このドキュメントは,TOPPERS/SSPカーネルを,未サポートのターゲットシステ
9ムにポーティングするために必要となるターゲット依存部の実装方法を説明す
10るものである.
11
12----------------------------------------------------------------------
13 TOPPERS/SSP Kernel
14 Smallest Set Profile Kernel
15
16 Copyright (C) 2011-2012 by Meika Sugimoto
17 Copyright (C) 2015 by Naoki Saito
18 Nagoya Municipal Industrial Research Institute, 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----------------------------------------------------------------------
50
51○目次
52
531. 共通事項
54 1.1 ターゲット依存部の構成
55 1.2 名前の衝突の防止
56 1.3 多重インクルードの防止
57 1.4 アセンブリ言語とのヘッダファイルの共用
58 1.5 インクルード記述の方法
59 1.6 クリティカルセクションの出入処理の実現に関する制約
602. システム構築環境のターゲット依存部
61 2.1 ターゲット略称とターゲット依存部のディレクトリ
62 2.2 Makefileのターゲット依存部
63 2.3 開発環境名とコマンド名の設定
64 2.4 コンパイルオプションとオブジェクトファイルの設定
65 2.5 リンク方法の設定
66 2.6 依存関係の定義
67 2.7 その他の設定
683. TOPPERS共通定義のターゲット依存部
69 3.1 ターゲット識別マクロ
70 3.2 整数型の最大値・最小値・ビット数
71 3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
72 3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
73 3.5 コンパイラの拡張機能のためのマクロ定義
74 3.6 標準的な定義の上書き
75 3.7 アサーションのための定義
764. システムインタフェースレイヤ(SIL)のターゲット依存部
77 4.1 全割込みロック状態の管理
78 4.2 微少時間待ち
79 4.3 プロセッサのエンディアン
80 4.4 メモリ空間アクセス関数
81 4.5 I/O空間アクセス関数
825. カーネルAPIのターゲット依存部
83 5.1 ターゲット定義でサポートする機能
84 5.2 割込み優先度の範囲
85 5.3 タイムティックの定義
86 5.4 メモリ領域確保のための型定義
87 5.5 メモリ領域確保のためのマクロ
88 5.6 オーバランハンドラ機能拡張のための定義(オプション)
896. カーネル実装のターゲット依存部
90 6.1 カーネル実装のターゲット依存部の共通事項
91 6.1.1 カーネル実装のターゲット依存部の構成要素
92 6.1.2 ターゲット依存部の関数の命名規則
93 6.2 トレースログ機能への対応
94 6.3 システム状態の管理
95 6.3.1 全割込みロック状態の管理
96 6.3.2 コンテキストの管理
97 6.3.3 CPUロック状態の管理
98 6.4 割込みに関連するシステム状態の管理
99 6.4.1 割込み優先度マスクの管理
100 6.4.2 割込み要求禁止フラグの管理
101 6.4.3 割込み要求のクリア
102 6.4.4 割込み要求のプローブ
103 6.4.5 割込みハンドラの先頭処理と末尾処理
104 6.5 タスクディスパッチャ
105 6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
106 6.5.2 ディスパッチャ本体
107 6.5.3 タスクコンテキストからのディスパッチ
108 6.5.4 ディスパッチャの動作開始
109 6.5.5 現在のコンテキストを捨ててディスパッチ
110 6.5.6 タスクの起動処理
111 6.6 割込みハンドラ
112 6.6.1 割込みハンドラの出入口処理
113 6.6.2 割込みハンドラ毎の出入口処理の生成
114 6.6.3 割込みハンドラの設定
115 6.6.4 割込み要求ラインの属性の設定
116 6.6.5 割込み管理機能の初期化処理の変更
117 6.6.6 デフォルトの割込みハンドラ
118 6.6.7 カーネル管理外の割込み
119 6.7 CPU例外ハンドラとCPU例外発生時のシステム状態の参照
120 6.7.1 CPU例外ハンドラの出入口処理
121 6.7.2 CPU例外ハンドラの出入口処理の生成
122 6.7.3 CPU例外ハンドラの設定
123 6.7.4 CPU例外管理機能の初期化処理の変更
124 6.7.5 デフォルトのCPU例外ハンドラ
125 6.7.6 CPU例外発生時のシステム状態の参照
126 6.8 カーネルの起動・終了とスタック領域など
127 6.9 カーネル内部のチューニング
128 6.9.1 ビットマップサーチ
129 6.9.2 ビットフィールド
130 6.10 カーネル実装に関するその他の定義
131 6.10.1 非タスクコンテキスト用のスタック領域
132 6.10.2 空ラベルの定義
133 6.11 カーネル実装のターゲット依存部のためのリネーム記述
134 6.12 タイマドライバ
135 6.12.1 タイマドライバのファイル構成
136 6.12.2 タイマの初期化・終了処理・割込み処理
137 6.12.3 性能評価用システム時刻の参照のための機能
1387. コンフィギュレータ設定ファイルのターゲット依存部
139 7.1 設定ファイルとターゲット依存部の位置付け
140 7.2 パス2のテンプレートファイルのターゲット依存部
141 7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
142 7.2.2 ターゲット非依存部で定義される変数
143 7.3 パス3のテンプレートファイルのターゲット依存部
144 7.4 cfg1_out.cのリンクに必要なスタブの定義ファイル
1458. システムサービス等のターゲット依存部
146 8.1 システムサービスのターゲット依存部
147 8.2 シリアルインタフェースドライバのターゲット依存部
148 8.2.1 変数,データ型,管理関数
149 8.2.2 デバイスサービスルーチン
150 8.2.3 コールバックルーチン
151 8.3 カーネル起動メッセージの出力のターゲット依存定義
152 8.4 サンプルプログラムとテストプログラムのターゲット依存定義
1539. その他
154 9.1 ドキュメント
155 9.2 パッケージ記述ファイル
15610. リファレンス
157 10.1 ターゲット依存部のファイル一覧
158
159
1601. 共通事項
161
1621.1 ターゲット依存部の構成
163
164ターゲット依存部は,targetディレクトリの下に,ターゲットハードウェアと
165開発環境の組み合わせ毎に用意する.ただし,ターゲット依存部の再利用性を
166考慮し,プロセッサ,チップ,開発環境のみに依存する部分を,プロセッサ依
167存部,チップ依存部,開発環境依存部という形で切り分けてもよい.切り分け
168方は,ターゲット依存部の実装に任されている.プロセッサ依存部,チップ依
169存部,開発環境依存部は,archディレクトリの下に置く.
170
171SSPカーネルのターゲット依存部は,システム構築環境(Makefile等)のターゲッ
172ト依存部,TOPPERS共通定義(t_stddef.h)のターゲット依存部,システムイン
173タフェースレイヤ(SIL,sil.h)のターゲット依存部,カーネルAPI(kernel.h)
174のターゲット依存部,カーネル実装のターゲット依存部(コンフィギュレータ
175設定ファイルのターゲット依存部を含む),システムサービスのターゲット依
176存部,ターゲット依存部に関するドキュメント等で構成される.
177
1781.2 名前の衝突の防止
179
180TOPPERSプロジェクトが提供するソフトウェアのために,TOPPERS_で始まるシン
181ボルを予約している.ヘッダファイル中に記述され,アプリケーションから参
182照できる内部シンボルは,TOPPERS_で始まる名前とする.
183
184また,_kernel_で始まるシンボルは,カーネル内部の変数や関数のために予約
185している.カーネル内部の変数や関数の名前で,リンク時にアプリケーション
186の名前と衝突する可能性があるものは,リネーム記述にリストアップすること
187で,コンパイル時に_kernel_で始まる名前に置き換えることとしている.
188
1891.3 多重インクルードの防止
190
191すべてのヘッダファイルは,多重にインクルードされるのを防止するための条
192件コンパイル記述を入れることとする.例えば,target_config.hであれば,ファ
193イルの先頭に
194
195#ifndef TOPPERS_TARGET_CONFIG_H
196#define TOPPERS_TARGET_CONFIG_H
197
198を,ファイルの末尾に
199
200#endif /* TOPPERS_TARGET_CONFIG_H */
201
202を記述する.
203
2041.4 アセンブリ言語とのヘッダファイルの共用
205
206SSPカーネルのヘッダファイルの多くは,アセンブリ言語のソースファイルから
207もインクルードできるようにするために,次のルールに従って記述するものと
208する.
209
210・TOPPERS_MACRO_ONLYがマクロ定義されている場合には,アセンブリ言語では
211 解釈できない記述(マクロ定義以外の記述)を除くように記述する.
212
213・符号無し整数型の定数値は,UINT_CやULONG_Cなどの整数定数を作るためのマ
214 クロを用いて記述する.ただし,アセンブリ言語のソースファイルからもイ
215 ンクルードできるファイル中であっても,C言語のみで用いる定数をこれらの
216 マクロを使って記述する必要はない.
217
218また,カーネル実装においては,次のルールに従うものとする.
219
220・アセンブリ言語からも用いる定数の定義中に型キャストを用いる場合には,
221 CASTマクロを用いて記述する.
222
223アセンブリ言語からヘッダファイルをインクルードする際には,必要に応じて,
224TOPPERS_MACRO_ONLY,UINC_C,ULONG_C,CASTをマクロ定義してから,インクルー
225ドしなければならない.
226
2271.5 インクルード記述の方法
228
229開発環境で用意されている標準ヘッダファイルおよびincludeディレクトリ下の
230標準ヘッダファイルは,「#include <...>」によりインクルードする.
231
232その他のヘッダファイルは,「#include "..."」によりインクルードする.ヘッ
233ダファイルが,カレントディレクトリやインクルードするファイルと同じディ
234レクトリ以外のディレクトリに置かれている場合には,次のようにパス指定を
235行う.
236
237・ターゲット依存部(target/<ターゲット名>)のディレクトリに置かれている
238 場合は,パス指定を行わず,ファイル名のみを記述する.
239 例)#include "target_config.h"
240
241・archディレクトリ下のディレクトリに置かれている場合には,archディレク
242 トリからの相対パスで記述する.
243 例)#include "m68k_gcc/prc_config.h"
244
245・その他の場合には,ソースプログラムのルートディレクトリ(configureが置
246 かれているディレクトリ)からの相対パスで記述する.
247 例)#include "pdic/upd72001/upd72001.h"
248
249・カーネルを構成するファイルから,kernelディレクトリ下のヘッダファイル
250 をインクルードする場合は,パス指定を行わず,ファイル名のみを記述する.
251 例)#include "kernel_impl.h"
252
2531.6 クリティカルセクションの出入処理の実現に関する制約
254
255カーネル内で用いるクリティカルセクションの出入処理を実現する場合には,
256次の2つの条件を満たすように実装しなければならない.
257
258(1-6-1) 出入処理から抜けた時点では,割込みの禁止/許可が完了していなけ
259ればならない.例えば,割込み禁止/許可命令を実行してから実際に割込みが
260禁止/許可されるまで何命令か遅延するプロセッサの場合には,出入処理の中
261にNOP命令を入れるなどの方法で,出入処理を抜けた時点では,割込みが禁止/
262許可された状態になっていることを保証しなければならない.
263
264(1-6-2) メモリ上のデータ構造が書き変わる可能性があることを,何らかの方
265法でコンパイラに知らせなければならない.GNU開発環境では,次のいずれかの
266方法でこの制約を満たすことができる.
267
268(a) クリティカルセクションの出入処理の全体または出入処理の本質的な部分
269 (具体的には,割込み禁止/許可する処理)を(インラインでない)通常
270 の関数により実現する.
271
272(b) クリティカルセクションの出入処理の本質的な部分をインラインアセンブ
273 ラによって実現している場合には,そのインラインアセンブラのclobber変
274 数リストに"memory"を追加する.
275
276(c) クリティカルセクションの出入処理の本質的な部分が,マクロやインライ
277 ン関数呼出しで実現している場合には,クリティカルセクションに入る処
278 理の最後と出る処理の先頭に,Asm("":::"memory")という記述を入れる.
279
280このような制約を設ける理由については,「TOPPERS/ASPカーネル 設計メモ」
281の「カーネルのデータ構造に対するvolatile宣言について」の節を参照するこ
282と.
283
2842. システム構築環境のターゲット依存部
285
286この章の説明は,GNU開発環境(GCC,GAS,BINUTILS,GNU Make)を用いること
287を想定して記述してある.それ以外の開発環境を用いる場合には,開発環境に
288あわせて修正する必要がある.
289
2902.1 ターゲット略称とターゲット依存部のディレクトリ
291
292新しいターゲット依存部を作成する時は,まず,ターゲット略称を定める.ター
293ゲット略称は,システム略称と開発環境略称を"_"で連結したものとする.シス
294テム略称に用いる文字は英小文字と数字と"_"に,開発環境略称に用いる文字は
295英小文字と数字に限定する.GNU開発環境の開発環境略称は,"gcc"とする.例
296えば,システム略称が"dve68k"で,GNU開発環境を用いる場合には,ターゲット
297略称は"dve68k_gcc"となる.
298
299ターゲット依存部のファイルを置くために,targetディレクトリの下に,ター
300ゲット略称を名称とするディレクトリを作成する.これをターゲット依存部ディ
301レクトリと呼ぶ.
302
303ターゲット依存部からプロセッサ依存部やチップ依存部を切り分ける場合には,
304依存部略称を定める.依存部略称は,プロセッサやチップの略称と開発環境略
305称を"_"で連結したものとする.プロセッサやチップの略称に用いる文字は,英
306小文字と数字と"_"に限定する.例えば,プロセッサ略称が"m68k"で,GNU開発
307環境を用いる場合には,依存部略称は"m68k_gcc"となる.
308
309また,ターゲット依存部から開発環境依存部を切り分ける場合には,開発環境
310略称を依存部略称とする.例えば,GNU開発環境依存部の依存部略称は,"gcc"
311となる.
312
313これらの依存部のファイルを置くために,archディレクトリの下に,依存部略
314称を名称とするディレクトリを作成する.
315
316なお,GNU開発環境以外の開発環境を用いる場合には,コンフィギュレーション
317スクリプト(configure),サンプルのMakefile(sample/Makefile),一部の
318ユーティリティプログラム(utils/genoffset,utils/makedep)を,その開発
319環境用に用意する必要がある場合がある.その場合には,これらのファイルを,
320ターゲット依存部ディレクトリか開発環境依存部ディレクトリに置くものとす
321る.また,開発環境用のプロジェクトファイルが必要な場合には,ターゲット
322依存部ディレクトリに置くものとする.
323
3242.2 Makefileのターゲット依存部
325
326Makefileのターゲット依存部は,ターゲット依存部ディレクトリに置いた
327Makefile.targetまたはそこからインクルードされるファイル(プロセッサ・チッ
328プ・開発環境依存部で用意されるファイルなど)に含める.
329
3302.3 開発環境名とコマンド名の設定
331
332開発環境名とコマンド名を設定するために,Makefileのターゲット依存部で次
333の変数を定義する.
334
335(2-3-1) TOOL 開発環境名
336
337開発環境名に定義する.GNU開発環境を用いる場合には,gccに定義する.
338
339(2-3-2) GCC_TARGET GNU開発環境のターゲット名
340
341GNU開発環境を用いる場合に,GNU開発環境をconfigureする場合に指定するター
342ゲット名に定義する.ここで指定したターゲット名は,開発環境のコマンド名
343の先頭に付与される文字列となる.例えば,GCC_TARGETをm68k-unknown-elfに
344定義した場合には,コンパイラとしてm68k-unknown-elf-gccが使われる.この
345変数が定義されない場合には,単なるgccが使われる.
346
347(2-3-3) CC Cコンパイラドライバの名称
348(2-3-4) CXX C++コンパイラドライバの名称
349(2-3-5) AS アセンブラの名称
350(2-3-6) LD リンカの名称
351(2-3-7) AR アーカイバの名称
352(2-3-8) NM nmプログラムの名称
353(2-3-9) RANLIB ranlibプログラムの名称
354(2-3-10) OBJCOPY objcopyプログラムの名称
355(2-3-11) OBJDUMP objdumpプログラムの名称
356
357GNU開発環境以外の開発環境を用いる場合に,それぞれのコマンドの名称に定義
358する.対応するコマンドがない場合や,コマンドパラメータが異なる場合には,
359Makefile中でそのコマンドを呼び出している部分を変更する必要がある.
360
361GNU開発環境では,これらはGCC_TARGETを用いて定義されるので,定義する必要
362はない.
363
3642.4 コンパイルオプションとオブジェクトファイルの設定
365
366Makefileのターゲット依存部で以下で説明する変数を定義する時には,":="を
367用いて,それまでの定義に追加する形で行う.例えば,コンパイラに対するそ
368の他のオプションとして「-Wall -g -O2」を追加したい場合には,「COPTS :=
369$(COPTS) -Wall -g -O2」という記述をMakefileのターゲット依存部に含める.
370
371(2-4-1) COPTS コンパイラに対するその他のオプション
372(2-4-2) CDEFS マクロ定義オプション(-Dオプション)
373(2-4-3) INCLUDES ヘッダファイルの置かれたディレクトリ指定オ
374 プション(-Iオプション)
375(2-4-4) LDFLAGS リンカに対するその他のオプション
376(2-4-5) LIBS ライブラリリンク指定のためのオプション
377
378ターゲットに依存して,すべてのソースファイルに共通するコンパイルオプショ
379ンの追加が必要な場合には,オプションの種類毎に上に示した変数に定義する.
380
381ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
382下の記述を含める必要がある.
383
384----------------------------------------
385INCLUDES := $(INCLUDES) -I$(TARGETDIR)
386----------------------------------------
387
388ここでTARGETDIRは,ターゲット依存部ディレクトリに定義されている.また
389SRCDIRは,Makefileにおいて,ソースプログラムのルートディレクトリ
390(configureが置かれているディレクトリ)に定義されている.
391
392コンパイラの問題等で,警告メッセージが出ることを防げない状況以外では,
393COPTSに-Werrorを追加することを推奨する.
394
395----------------------------------------
396COPTS := $(COPTS) -Werror
397----------------------------------------
398
399カーネルのコンパイル時に,dereferencing type-punned pointer will break
400strict-aliasing rulesという警告が出る場合には,以下を追加するとよい.こ
401の警告メッセージに関する詳細は,「TOPPERS/ASPカーネル 設計メモ」の「型
402キャストに伴う警告メッセージ」の節を参照すること.
403
404----------------------------------------
405KERNEL_CFLAGS := $(KERNEL_CFLAGS) -fno-strict-aliasing
406----------------------------------------
407
408また,アセンブリ言語レベルの識別名が,C言語レベルの識別名の先頭に"_"が
409付いたものになる場合には,CDEFSに-DTOPPERS_LABEL_ASMを追加する.
410
411(2-4-6) SYSSVC_DIR システムサービスのソースが置かれたディレクトリ
412(2-4-7) SYSSVC_ASMOBJS アセンブリ言語で記述されたシステムサービスの
413 オブジェクト
414(2-4-8) SYSSVC_COBJS C言語で記述されたシステムサービスのオブジェクト
415(2-4-9) SYSSVC_CFLAGS システムサービスに対するコンパイルオプション
416(2-4-10) SYSSVC_LIBS システムサービスに対するライブラリリンク指定
417
418ターゲットに依存して,システムサービス(システムログタスクやデバイスド
419ライバなど)のソースが置かれたディレクトリ,システムサービスを構成する
420オブジェクトファイルのリスト,それらをコンパイルする際に適用するコンパ
421イルオプション,その構成に必要なライブラリリンク指定を追加する場合には,
422上に示した変数に定義する.
423
424(2-4-11) KERNEL_DIR カーネルのソースが置かれたディレクトリ
425(2-4-12) KERNEL_ASMOBJS アセンブリ言語で記述されたカーネルのオブジェクト
426(2-4-13) KERNEL_COBJS C言語で記述されたカーネルのオブジェクト
427(2-4-14) KERNEL_CFLAGS カーネルに対するコンパイルオプション
428
429ターゲットに依存して,カーネルのソースが置かれたディレクトリ,カーネル
430を構成するオブジェクトファイルのリスト,それらをコンパイルする際に適用
431するコンパイルオプションを追加する場合には,上に示した変数に定義する.
432
433ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
434下の記述を含める必要がある.
435
436----------------------------------------
437KERNEL_DIR := $(KERNEL_DIR) $(TARGETDIR)
438KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) target_support.o
439KERNEL_COBJS := $(KERNEL_COBJS) target_config.o target_timer.o
440----------------------------------------
441
442(2-4-15) CFG_TABS コンフィギュレータに対するオプション
443
444ターゲットに依存して,コンフィギュレータに対するオプションを追加する場
445合には,上に示した変数に定義する.具体的には,コンフィギュレータの値取
446得シンボルテーブルのターゲット依存部(target_def.csv)がある場合には,
447それを指定するオプションを追加する必要がある.
448
449ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
450下の記述を含める必要がある.
451
452----------------------------------------
453CFG_TABS := $(CFG_TABS) --cfg1-def-table $(TARGETDIR)/target_def.csv
454----------------------------------------
455
456(2-4-16) CFG1_OUT_LDFLAGS cfg1_out.cに対するリンクオプション
457
458ターゲットに依存して,cfg1_out.cをリンクする際に適用するオプションを追
459加する場合には,上に示した変数に定義する.
460
461(2-4-17) CFG_OBJS システムコンフィギュレーションのためのオブ
462 ジェクト
463
464ターゲットに依存して,システムコンフィギュレーションのためのオブジェク
465トファイルを(kernel_cfg.o以外に)追加する場合には,上に示した変数に定
466義する.この場合,追加したオブジェクトファイルの作成ルール(コンパイル/
467アセンブルルールと依存関係作成ルール)を,Makefileのターゲット依存部に
468記述する必要がある.
469
470(2-4-18) CFG2_OUT
471
472ターゲットに依存して,コンフィギュレータのパス2でkernel_cfg.cと
473kernel_cfg.h以外のファイルを生成する場合には,上に示した変数に定義する.
474
475(2-4-19) OMIT_WARINIG_ALL
476(2-4-20) OMIT_OPTIMIZATION
477
478サンプルのMakefileでは,コンパイラに対するオプションに「-Wall -g -O2」
479を追加する.-Wallを追加したくない場合には,Makefileのターゲット依存部で
480OMIT_WARNING_ALLを"true"に定義する.-O2を追加したくない場合には,
481Makefileのターゲット依存部でOMIT_OPTIMIZATIONを"true"に定義する.
482
4832.5 リンク方法の設定
484
485(2-5-1) LDSCRIPT リンカスクリプトのファイル名
486
487開発環境に標準のリンカスクリプトが使用できない場合には,ターゲット依存
488部でリンカスクリプトを用意し,そのファイル名をこの変数に定義する.
489
490(2-5-2) TEXT_START_ADDRESS テキストセクションの先頭番地
491(2-5-3) DATA_START_ADDRESS データセクションの先頭番地
492
493各セクションの先頭番地の指定が必要な場合には,これらの変数に先頭番地を
494定義する.
495
496(2-5-4) START_OBJS 先頭にリンクすべきモジュール名
497(2-5-5) END_OBJS 最後にリンクすべきモジュール名
498
499ターゲットによっては,ロードモジュールの先頭と最後にリンクすべきモジュー
500ルを,ターゲット依存部で用意する必要がある.多くの場合,スタートアップ
501モジュールをロードモジュールの先頭にリンクする必要がある.
502
503ロードモジュールの先頭にリンクすべきプログラムがある場合には,Makefile
504のターゲット依存部において,そのオブジェクトファイル名をSTART_OBJSに定
505義し,それに対するコンパイルルールと依存関係作成ルールを定義する.ロー
506ドモジュールの最後にリンクすべきモジュールがある場合には,そのオブジェ
507クトファイル名をEND_OBJSに定義し,それに対するコンパイルルールと依存関
508係作成ルールを定義する.また,標準のスタートアップモジュール(crt0.o)
509をリンクしないように,LDFLAGSに-nostdlibを追加する必要がある.さら
510に,-nostdlibをつけることで標準ライブラリがリンクされなくなるため,
511LIBSに-lgccを追加しなければならない.
512
513例えば,スタートアップモジュールのソースファイルがstart.Sの場合には,
514Makefileのターゲット依存部に次のような記述を入れるとよい.
515
516----------------------------------------
517# スタートアップモジュールのオブジェクトファイル名
518START_OBJS = start.o
519
520# スタートアップモジュールのコンパイルルール
521$(START_OBJS): %.o: %.S
522 $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
523
524# スタートアップモジュールの依存関係作成ルール
525$(START_OBJS:.o=.d): %.d: %.S
526 @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
527 -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
528
529# リンカに対するオプション
530LDFLAGS := -nostdlib $(LDFLAGS)
531LIBS := $(LIBS) -lgcc
532----------------------------------------
533
534また,GNU開発環境で,コンパイラに標準のcrtbegin.oとcrtend.oを用いる場合
535には,Makefile のターゲット依存部に次のような記述を入れるとよい.
536
537----------------------------------------
538# オブジェクトファイル名
539START_OBJS = $(shell $(CC) -print-file-name=crtbegin.o)
540END_OBJS = $(shell $(CC) -print-file-name=crtend.o)
541
542# 依存関係作成ルール
543$(START_OBJS:.o=.d): %.d:
544$(END_OBJS:.o=.d): %.d:
545
546# リンカに対するオプション
547LDFLAGS := -nostdlib $(LDFLAGS)
548LIBS := $(LIBS) -lgcc
549----------------------------------------
550
551この場合,これらのファイルをコンパイルすることはないため,コンパイルルー
552ルは不要である.また,依存関係作成ルールはダミーでよい(依存関係作成ルー
553ルがないとエラーになる).
554
555(2-5-6) HIDDEN_OBJS 指定しなくてもリンクされるモジュール名
556
557ロードモジュールにリンクすべきモジュールを,リンカに対するパラメータで
558はなく,リンカスクリプト中に(例えば,GNU開発環境のリンカスクリプトの
559STARTUPを使って)記述する場合には,そのオブジェクトファイル名を,
560(START_OBJSまたはEND_OBJSではなく)HIDDEN_OBJSに定義し,それに対するコ
561ンパイルルールと依存関係作成ルールを定義する.HIDDEN_OBJSに定義したモ
562ジュールは,リンカに対するパラメータからは除外される.LIBSとLDFLAGSにつ
563いては,START_OBJSまたはEND_OBJSを用いる場合と同様である.
564
565例えば,スタートアップモジュールのソースファイルがstart.Sで,start.oを
566リンクすることをリンカスクリプト中に記述する場合には,Makefileのターゲッ
567ト依存部に次のような記述を入れるとよい.
568
569----------------------------------------
570# スタートアップモジュールのオブジェクトファイル名
571HIDDEN_OBJS = start.o
572
573# スタートアップモジュールのコンパイルルール
574$(HIDDEN_OBJS): %.o: %.S
575 $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
576
577# スタートアップモジュールの依存関係作成ルール
578$(HIDDEN_OBJS:.o=.d): %.d: %.S
579 @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
580 -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
581
582# リンカに対するオプション
583LDFLAGS := -nostdlib $(LDFLAGS)
584LIBS := $(LIBS) -lgcc
585----------------------------------------
586
5872.6 依存関係の定義
588
589コンフィギュレータの各パスに対して,ターゲット依存のファイルへの依存関
590係を定義する.具体的には,パス1,パス2,パス3が依存するファイルを,それ
591ぞれcfg1_out.c,kernel_cfg.timestamp,$(OBJFILE)に対する依存関係の形で
592記述する.
593
594ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
595下の記述を含める必要がある.
596
597----------------------------------------
598cfg1_out.c: $(TARGETDIR)/target_def.csv
599kernel_cfg.timestamp: $(TARGETDIR)/target.tf
600$(OBJFILE): $(TARGETDIR)/target_check.tf
601----------------------------------------
602
6032.7 その他の設定
604
605(2-7-1) CLEAN_FILES cleanにより削除するファイル名
606
607cleanにより削除するファイルをターゲット依存部で追加したい場合には,ファ
608イル名をこの変数に追加定義する.
609
610(2-7-2) REALCLEAN_FILES realcleanにより削除するファイル名
611
612realcleanにより削除するファイルをターゲット依存部で追加したい場合には,
613ファイル名をこの変数に追加定義する.
614
615
6163. TOPPERS共通定義のターゲット依存部
617
618TOPPERS共通定義(t_stddef.h)のターゲット依存部は,target_stddef.hまた
619はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存
620部で用意されるヘッダファイルなど)に含める.
621
6223.1 ターゲット識別マクロ
623
624アプリケーションやシステムサービスでターゲットを識別するために,
625"TOPPERS_"にシステム略称を大文字にした文字列を連結したもの(例えば,
626"TOPPERS_DVE68K")をマクロ定義する.
627
628また,ターゲット依存部からプロセッサ依存部やチップ依存部を切り分けた場
629合には,"TOPPERS_"に依存部略称を大文字にした文字列を連結したもの(例え
630ば,"TOPPERS_M68K")をマクロ定義する.
631
6323.2 整数型の最大値・最小値・ビット数
633
634(3-2-1) INT_MAX intに格納できる最大値(C90準拠)
635(3-2-2) INT_MIN intに格納できる最小値(C90準拠)
636(3-2-3) UINT_MAX unsigned intに格納できる最大値(C90準拠)
637(3-2-4) LONG_MAX longに格納できる最大値(C90準拠)
638(3-2-5) LONG_MIN longに格納できる最小値(C90準拠)
639(3-2-6) ULONG_MAX unsigned longに格納できる最大値(C90準拠)
640(3-2-7) CHAR_BIT char型のビット数(C90準拠)
641
642整数型の最大値・最小値・ビット数を,これらのシンボルにマクロに定義する.
643
644これらのマクロは,C90に準拠したものである.開発環境にC90に準拠した
645limits.hが用意されている場合には,これらのマクロを定義することに代えて,
646limits.hをインクルードすればよい.
647
6483.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
649
650(3-3-1) int8_t 符号付き8ビット整数(オプション,C99準拠)
651(3-3-2) uint8_t 符号無し8ビット整数(オプション,C99準拠)
652(3-3-3) int16_t 符号付き16ビット整数(C99準拠)
653(3-3-4) uint16_t 符号無し16ビット整数(C99準拠)
654(3-3-5) int32_t 符号付き32ビット整数(C99準拠)
655(3-3-6) uint32_t 符号無し32ビット整数(C99準拠)
656(3-3-7) int64_t 符号付き64ビット整数(オプション,C99準拠)
657(3-3-8) uint64_t 符号無し64ビット整数(オプション,C99準拠)
658(3-3-9) int128_t 符号付き128ビット整数(オプション,C99準拠)
659(3-3-10) uint128_t 符号無し128ビット整数(オプション,C99準拠)
660(3-3-11) int_least8_t 8ビット以上の符号付き整数(C99準拠)
661(3-3-12) uint_least8_t 8ビット以上の符号無し整数(C99準拠)
662(3-3-13) intptr_t ポインタを格納できるサイズの符号付き整数(C99準拠)
663(3-3-14) uintptr_t ポインタを格納できるサイズの符号無し整数(C99準拠)
664(3-3-15) INT8_MAX int8_tに格納できる最大値(オプション,C99準拠)
665(3-3-16) INT8_MIN int8_tに格納できる最小値(オプション,C99準拠)
666(3-3-17) UINT8_MAX uint8_tに格納できる最大値(オプション,C99準拠)
667(3-3-18) INT16_MAX int16_tに格納できる最大値(C99準拠)
668(3-3-19) INT16_MIN int16_tに格納できる最小値(C99準拠)
669(3-3-20) UINT16_MAX uint16_tに格納できる最大値(C99準拠)
670(3-3-21) INT32_MAX int32_tに格納できる最大値(C99準拠)
671(3-3-22) INT32_MIN int32_tに格納できる最小値(C99準拠)
672(3-3-23) UINT32_MAX uint32_tに格納できる最大値(C99準拠)
673(3-3-24) INT64_MAX int64_tに格納できる最大値(オプション,C99準拠)
674(3-3-25) INT64_MIN int64_tに格納できる最小値(オプション,C99準拠)
675(3-3-26) UINT64_MAX uint64_tに格納できる最大値(オプション,C99準拠)
676(3-3-27) INT128_MAX int128_tに格納できる最大値(オプション,C99準拠)
677(3-3-28) INT128_MIN int128_tに格納できる最小値(オプション,C99準拠)
678(3-3-29) UINT128_MAX uint128_tに格納できる最大値(オプション,C99準拠)
679(3-3-30) INT_LEAST8_MAX int_least8_tに格納できる最大値(C99準拠)
680(3-3-31) INT_LEAST8_MIN int_least8_tに格納できる最小値(C99準拠)
681(3-3-32) UINT_LEAST8_MAX uint_least8_tに格納できる最大値(C99準拠)
682(3-3-33) INT8_C(val) int_least8_t型の定数を作るマクロ(C99準拠)
683(3-3-34) UINT8_C(val) uint_least8_t型の定数を作るマクロ(C99準拠)
684(3-3-35) INT16_C(val) int16_t型の定数を作るマクロ(C99準拠)
685(3-3-36) UINT16_C(val) uint16_t型の定数を作るマクロ(C99準拠)
686(3-3-37) INT32_C(val) int32_t型の定数を作るマクロ(C99準拠)
687(3-3-38) UINT32_C(val) uint32_t型の定数を作るマクロ(C99準拠)
688(3-3-39) INT64_C(val) int64_t型の定数を作るマクロ(オプション,C99準拠)
689(3-3-40) UINT64_C(val) uint64_t型の定数を作るマクロ(オプション,C99準拠)
690(3-3-41) INT128_C(val) int128_t型の定数を作るマクロ(オプション,C99準拠)
691(3-3-42) UINT128_C(val) uint128_t型の定数を作るマクロ(オプション,C99準拠)
692
693指定されたサイズの整数型を,これらのシンボルに型定義する.また,データ
694型に格納できる最大値・最小値と,整数定数を作るマクロを,これらのシンボ
695ルにマクロ定義する.
696
697これらのデータ型およびマクロは,C99に準拠したものである.開発環境にC99
698に準拠したstdint.hが用意されている場合には,これらのデータ型およびマク
699ロを定義することに代えて,stdint.hをインクルードすればよい.
700
701上でオプションと記述したものは,該当するデータ型がコンパイラでサポート
702されている場合にのみ定義することを示す.
703
7043.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
705
706(3-4-1) float32_t IEEE754準拠の32ビット単精度浮動小数点数(オプ
707 ション)
708(3-4-2) double64_t IEEE754準拠の64ビット倍精度浮動小数点数(オプ
709 ション)
710(3-4-3) FLOAT32_MIN float32_tに格納できる最小の正規化された正の浮
711 動小数点数(オプション)
712(3-4-4) FLOAT32_MAX float32_tに格納できる表現可能な最大の有限浮動
713 小数点数(オプション)
714(3-4-5) DOUBLE64_MIN double64_tに格納できる最小の正規化された正の浮
715 動小数点数(オプション)
716(3-4-6) DOUBLE64_MAX double64_tに格納できる表現可能な最大の有限浮動
717 小数点数(オプション)
718
719指定されたサイズ・表現形式の浮動小数点型を,これらのシンボルに型定義す
720る.また,データ型に格納できる最大値・最小値を,これらのシンボルにマク
721ロ定義する.
722
723いずれも,該当するデータ型がコンパイラでサポートされている場合にのみ定
724義する.
725
7263.5 コンパイラの拡張機能のためのマクロ定義
727
728コンパイラの拡張機能を用いるためのマクロとして,必要に応じて,以下のマ
729クロの定義を含める.
730
731(3-5-1) inline(オプション,デフォルトは未定義)
732(3-5-2) Inline(オプション,デフォルトはstatic inline)
733
734インライン関数であることを示す指定.Inlineは,コンパイル単位にローカル
735なインライン関数であることを示す.
736
737(3-5-3) asm(オプション,デフォルトは未定義)
738(3-5-4) Asm(オプション,デフォルトは未定義)
739
740インラインアセンブラを記述するための指定.Asmは,最適化により削除しては
741ならないことを示す.これらは,ターゲット依存部でのみ使うマクロであるた
742め,ターゲット依存部で使わないなら定義する必要はない.
743
744(3-5-5) offsetof(structure, field)(オプション,デフォルトの定義あり)
745
746構造体structureの中での,フィールドfieldのオフセットを求めるマクロ.
747
748(3-5-6) alignof(type)(オプション,デフォルトの定義あり)
749
750データ型typeのアラインメント単位を求めるマクロ.
751
752(3-5-7) NoReturn(オプション,デフォルトは未定義)
753
754リターンすることのない関数であることを示す指定.これは,ターゲット依存
755部のみ使うマクロであるため,ターゲット依存部で使わないなら定義する必要
756はない.
757
7583.6 標準的な定義の上書き
759
760t_stddef.hに含まれるTOPPERS共通定義の標準的な定義を上書きする場合には,
761以下のマクロを定義する.
762
763(3-6-1) TOPPERS_bool(オプション,デフォルトはint)
764(3-6-2) TOPPERS_size(オプション,デフォルトはuintptr_t)
765(3-6-3) TOPPERS_fp(オプション,デフォルトは他と互換性のない関数ポインタ)
766
767それぞれ,bool_t,SIZE,FPに型定義すべきデータ型.
768
769(3-6-4) UINT_C(val)(オプション,デフォルトはUを付加)
770(3-6-5) ULONG_C(val)(オプション,デフォルトはULを付加)
771
772それぞれ,unsigned uint型,unsigned long型の定数を作るためのマクロ.
773
774(3-6-6) NULL(オプション,デフォルトは0)
775
776C90準拠のC言語環境では,NULLの定義はstddef.hに含まれているため,これを
777インクルードしてもよい.
778
779(3-6-7) ERCD(mercd, sercd)(オプション)
780(3-6-8) MERCD(ercd)(オプション)
781(3-6-9) SERCD(ercd)(オプション)
782
783ERCD,MERCD,SERCDの標準の定義は,符号付き整数が2の補数で表現されており,
784右シフト演算子(>>)が算術シフトされることを仮定している.多くのコンパ
785イラでこの仮定が成り立つが,そうでない場合には,ターゲット依存部でこれ
786らの定義を上書きする必要がある.
787
788(3-6-10) ALIGN_TYPE(addr, type)(オプション)
789
790アドレスaddrが,データ型typeのアラインメント単位にアラインしているか
791チェックするマクロ.
792
7933.7 アサーションのための定義
794
795t_stddef.hには,assertの定義が含まれる.assertが失敗した場合(assertの
796パラメータがfalseになった場合)の処理を,ターゲット依存に用意する必要が
797ある.これらの定義は,assertマクロを使用する前であれば,t_stddef.h以降
798にインクルードされるファイルに含まれていてもよい.なお,assertを無効に
799する(NDEBUGをマクロ定義してコンパイルする)場合には,これらを用意する
800必要はない.
801
802(3-7-1) TOPPERS_assert_abort(void)
803
804assertが失敗した場合に,プログラムを停止させる関数.システム開発中はデ
805バッガに落とすのが理想的である.システム稼働時には例外処理を行わせるこ
806とになる.
807
808本関数を無限ループで実装する際は,以下の形式とすること(TECSのパーサの
809制限に合わせるため).
810
811Inline void
812TOPPERS_assert_abort(void)
813{
814 while(1)
815 {
816 }
817}
818
819(3-7-2) TOPPERS_assert_fail(exp, file, line)
820
821assertが失敗した時の情報を表示/記録するためのマクロ.システムログ機能を
822用いる場合には,t_syslog.hにシステムログ機能に記録するための定義が含ま
823れているので,ターゲット依存部で用意する必要はない.
824
825
8264. システムインタフェースレイヤ(SIL)のターゲット依存部
827
828システムインタフェースレイヤ(SIL,sil.h)のターゲット依存部の定義は,
829target_sil.hまたはそこからインクルードされるファイル(プロセッサ・チッ
830プ・開発環境依存部で用意されるヘッダファイルなど)に含める.
831
832SILのサービスコールは,任意のシステム状態で呼び出すことができる.そのた
833め,SILのターゲット依存部の関数は,任意のシステム状態で呼び出せるように
834実装しなければならない.
835
8364.1 全割込みロック状態の管理
837
838SILのターゲット依存部では,全割込みロック状態へ遷移する機能と,元の状態
839へ戻す機能(元の状態を記憶するために変数を使う)を提供する.全割込みロッ
840ク状態であるかを判別する機能は提供する必要がない.
841
842SILの機能は,カーネルを使用しない場合にも使用できる必要がある.そのため,
843全割込みロック状態への遷移と元の状態への復帰は,カーネルを用いず,プロ
844セッサのリソースを直接操作することによって実現する.また,全割込みロッ
845ク状態への遷移と元の状態への復帰は,全割込みロック状態やCPUロック状態で
846も行える必要がある.
847
848保護機能を持ったカーネルでは,ユーザタスクからプロセッサのリソースを直
849接操作することができないため,ユーザタスクからはこれらの機能を用いるこ
850とができない.用いた場合の振舞いはターゲットプロセッサに依存するが,典
851型的には,特権命令違反などのCPU例外が発生することになる.
852
853(4-1-1) SIL_PRE_LOC
854
855全割込みロックフラグの状態を保存するための変数を定義するマクロ.型名の
856後に,変数名を続けたものに定義する.変数名は,他の名前と衝突しないよう
857に,"TOPPERS_"で始まる名前にする.
858
859(4-1-2) SIL_LOC_INT()
860
861現在の全割込みロックフラグの状態をSIL_PRE_LOCで定義した変数に保存し,全
862割込みロック状態に遷移させるマクロ.このマクロを実現する際には,「1.6
863クリティカルセクションの出入処理の実現に関する制約」の節に記述されてい
864る制約に従わなければならない.
865
866(4-1-3) SIL_UNL_INT()
867
868SIL_LOC_INT()によって変数に保存した状態に戻すマクロ.このマクロを実現す
869る際には,「1.6 クリティカルセクションの出入処理の実現に関する制約」の
870節に記述されている制約に従わなければならない.
871
8724.2 微少時間待ち
873
874(4-2-1) void sil_dly_nse(ulong_t dlytim)
875
876dlytimで指定された以上の時間(単位はナノ秒),ループなどによって待つ関
877数.
878
879以下の関数と等価な処理を,アセンブリ言語で記述する方法を,標準的な実装
880方法とする.アセンブリ言語で記述するのは,コンパイラの最適化に依存しな
881いようにするためである.またこの関数は,キャッシュ等の影響を受けないよ
882うに,できる限りメモリアクセスを行わないように実装すべきである.
883
884 void sil_dly_nse(ulong_t dlytim)
885 {
886 dlytim -= SIL_DLY_TIM1;
887 if (結果が0より大きい) {
888 do {
889 dlytim -= SIL_DLY_TIM2;
890 } while (結果が0より大きい);
891 }
892 }
893
894この関数の動作は次の通りである.dlytimがSIL_DLY_TIM1以下の場合には,最
895初のif文の条件が成立せず,すぐに関数から抜ける.dlytimがSIL_DLY_TIM1よ
896り大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2)以下の場合には,最初のif文の条件は
897成立するが,doループは1回も回らずに関数から抜ける.dlytimが
898(SIL_DLY_TIM1+SIL_DLY_TIM2)より大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2*2)以
899下の場合には,doループを1回だけ回って関数から抜ける.その後,dlytimが
900SIL_DLY_TIM2大きくなる度に,whileループを回る回数が1回ずつ増える.
901
902なお,この関数をアセンブリ言語(または,C言語)で記述する場合,どのファ
903イルに記述するかが問題になる.SILのターゲット依存部には,標準では,アセ
904ンブリ言語(または,C言語)の関数定義を記述するためのファイルを用意して
905いない.ターゲット依存で用意してもよいが,例外的に,カーネル実装のター
906ゲット依存モジュール(target_support.Sまたはtarget_config.c)に記述して
907もよいことにする.
908
909(4-2-2) SIL_DLY_TIM1(オプション)
910(4-2-3) SIL_DLY_TIM2(オプション)
911
912sil_dly_nseを上記の標準的な方法で実現した場合,この2つの定数をターゲッ
913ト依存部でマクロ定義する.
914
915SIL_DLY_TIM2は,上記の関数において,doループ1回の実行時間(単位はナノ秒)
916に設定する.ターゲットプロセッサの命令セットにもよるが,おおよそ,減算
917命令と条件分岐命令各1回の実行時間になる.SIL_DLY_TIM2が決まれば,関数呼
918出しも含めた全体の時間がdlytimで指定された以上の時間になるように,
919SIL_DLY_TIM1を決める.
920
921※下記の内容は,現時点でSSPカーネルでは未サポートである.
922
923この2つの定数値の決定を支援するプログラムとして,testディレクトリに,
924test_dlynseを用意している.test_dlynseを実行すると,次のような出力が得
925られる.
926
927-- for fitting parameters --
928sil_dly_nse(0): 430 OK
929sil_dly_nse(420): 430 OK
930sil_dly_nse(510): 520 OK
931sil_dly_nse(600): 610 OK
932<中略>
933-- for checking boundary conditions --
934sil_dly_nse(421): 520 OK
935sil_dly_nse(511): 610 OK
936sil_dly_nse(601): 700 OK
937
938"for fitting parameters"に続く出力は,sil_dly_nse(dlytim)を呼び出した場
939合の待ち時間を測定した結果である.このプログラムを用いて,":"の右側の数
940値が,dlytimよりも大きい範囲でなるべく近い値になるように,2つの定数値を
941調整する."for checking boundary conditions"に続く出力は,プログラムの
942妥当性をチェックするためのもので,":"の右側の数値が,dlytimよりも大きい
943ことを確認する(近い値になる必要はない).
944
9454.3 プロセッサのエンディアン
946
947(4-3-1) SIL_ENDIAN_BIG
948(4-3-2) SIL_ENDIAN_LITTLE
949
950プロセッサのエンディアンにより,いずれか片方のシンボルをマクロ定義する.
951
952(4-3-3) TOPPERS_SIL_REV_ENDIAN_UINT16(オプション)
953(4-3-4) TOPPERS_SIL_REV_ENDIAN_UINT32(オプション)
954
955それぞれ,16ビット,32ビットの符号無し整数のエンディアンを反転させるマ
956クロ.プロセッサがエンディアン反転のための命令を持つ場合には,その命令
957を用いて実現する.これらのシンボルをマクロ定義しない場合には,デフォル
958トの定義が使われる.
959
9604.4 メモリ空間アクセス関数
961
962(4-4-1) TOPPERS_OMIT_SIL_ACCESS
963
964標準のメモリ空間アクセス関数を使用せず,ターゲット依存部で用意する場合
965には,このシンボルをマクロ定義する.
966
967(4-4-2) TOPPERS_OMIT_SIL_REH_LEM
968(4-4-3) TOPPERS_OMIT_SIL_WRH_LEM
969(4-4-4) TOPPERS_OMIT_SIL_REH_BEM
970(4-4-5) TOPPERS_OMIT_SIL_WRH_BEM
971(4-4-6) TOPPERS_OMIT_SIL_REW_LEM
972(4-4-7) TOPPERS_OMIT_SIL_WRW_LEM
973(4-4-8) TOPPERS_OMIT_SIL_REW_BEM
974(4-4-9) TOPPERS_OMIT_SIL_WRW_BEM
975
976それぞれ,標準のsil_reh_lem,sil_wrh_lem,sil_reh_bem,sil_wrh_bem,
977sil_rew_lem,sil_wrw_lem,sil_rew_bem,sil_wrw_bemを使用せず,ターゲッ
978ト依存部で用意する場合には,これらのシンボルをマクロ定義する.
979
9804.5 I/O空間アクセス関数
981
982メモリ空間とは別にI/O空間を持つプロセッサでは,I/O空間にあるデバイスレ
983ジスタをアクセスするための関数として,sil_reb_iop,sil_wrb_iop,
984sil_reh_iop,sil_wrh_iop,sil_reh_lep,sil_wrh_lep,sil_reh_bep,
985sil_wrh_bep,sil_rew_iop,sil_wrw_iop,sil_rew_lep,sil_wrw_lep,
986sil_rew_bep,sil_wrw_bepの中で必要なものを,ターゲット依存部で用意する.
987
988
9895. カーネルAPIのターゲット依存部
990
991カーネルAPI(kernel.h)のターゲット依存部の定義は,target_kernel.hまた
992はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存
993部で用意されるヘッダファイルなど)に含める.
994
9955.1 ターゲット定義でサポートする機能
996
997(5-1-1) TOPPERS_TARGET_SUPPORT_DIS_INT dis_intをサポートする
998(5-1-2) TOPPERS_TARGET_SUPPORT_ENA_INT ena_intをサポートする
999
1000dis_int,ena_int,サポートする場合に,それぞれのシンボルをマク
1001ロ定義する.
1002
10035.2 割込み優先度の範囲
1004
1005(5-2-1) TMIN_INTPRI 割込み優先度の最小値(最高値)
1006(5-2-2) TMAX_INTPRI 割込み優先度の最大値(最低値)
1007
1008それぞれ,カーネル管理の割込み優先度の最小値(=優先度が最高),カーネ
1009ル管理の割込み優先度の最大値(優先度が最低)に定義する.TMAX_INTPRIは-1
1010に固定されているが,対称性のために,ターゲット依存部で定義することにし
1011ている.
1012
10135.3 タイムティックの定義
1014
1015(5-3-1) TIC_NUME タイムティックの周期の分子
1016(5-3-2) TIC_DENO タイムティックの周期の分母
1017
1018タイムティックの周期(signal_timeを呼び出す周期)を,ミリ秒単位で,
1019TIC_NUME/TIC_DENOに定義する.例えば,タイムティックの周期が1/30秒の場合
1020には,TIC_NUMEを100に,TIC_DENOを3に定義すればよい.
1021
1022タイムティックの周期は,1ミリ秒とする(つまり,TIC_NUME,TIC_DENOとも1
1023に定義する)ことを推奨するが,シミュレーション環境や性能の低いプロセッ
1024サでそれが適切でない場合には,それ以外の値としてもよい.その場合でも,
1025可能な限り,1ミリ秒の倍数である(つまり,TIC_DENOを1に定義する)ことが
1026望ましい.
1027
1028TIC_NUMEとTIC_DENOの定義を変更することで,タイムティックの周期を変更で
1029きるようにタイマドライバを実装する場合には,この2つの定数の定義はデフォ
1030ルト値を与えていることになる.そこで,これらの定義を「#ifndef TIC_NUME」
1031「#endif」で囲んで記述する.
1032
10335.4 メモリ領域確保のための型定義
1034
1035(5-4-1) TOPPERS_STK_T スタック領域を確保するための型(オプション)
1036
1037スタック領域は,標準では,intptr_t型の配列として確保するが,より大きい単位で
1038アラインさせたいなどの理由で,それ以外の型の配列として確保する場合には,
1039それぞれTOPPERS_STK_Tとを,配列のベースとなるデータ型にマクロ定義する.
1040
10415.5 メモリ領域確保のためのマクロ
1042
1043(5-5-1) TOPPERS_ROUND_SZ(オプション)
1044(5-5-2) TOPPERS_COUNT_SZ(オプション)
1045
1046TOPPERS_COUNT_SZ(sz, unit)は,sz/unitを切り上げた値を求めるマクロで,サ
1047イズがszのメモリ領域をサイズがunitのデータ型の配列で確保する場合の要素
1048数を求めるために用いる.TOPPERS_ROUND_SZ(sz, unit)は,sz/unitを切り上げ
1049たものにunitをかけた値を求めるマクロで,サイズがszのメモリ領域をサイズ
1050がunitのデータ型の配列で確保する場合のトータルサイズを求めるために用い
1051る.
1052
1053それぞれ,標準のTOPPERS_ROUND_SZ,TOPPERS_COUNT_SZが適切でなく,ターゲッ
1054ト依存部で用意する場合には,これらのシンボルを適切な値にマクロ定義する.
1055
10566. カーネル実装のターゲット依存部
1057
10586.1 カーネル実装のターゲット依存部の共通事項
1059
10606.1.1 カーネル実装のターゲット依存部の構成要素
1061
1062カーネル実装のターゲット依存部は,以下の要素で構成される.
1063
1064(a) カーネル実装のターゲット依存の定義
1065
1066カーネル実装のターゲット非依存部から参照されるターゲット依存の定義は,
1067target_config.hまたはそこからインクルードされるファイル(プロセッサ・チッ
1068プ・開発環境依存部で用意されるヘッダファイルなど)に含める.
1069
1070ターゲットのハードウェア資源(割込みハンドラ番号やCPU例外ハンドラ番号,
1071デバイスレジスタの番地など)の定義は,システムサービスやアプリケーショ
1072ンにも有用であるため,カーネル実装のみに有用な定義を含むファイルとは切
1073り分けて,独立したヘッダファイルに含める.このヘッダファイルの標準的な
1074名称を,システム略称.h(または,チップ略称.h,プロセッサ略称.h)とする.
1075
1076(b) カーネル実装のターゲット依存モジュール
1077
1078カーネル実装のターゲット依存の変数定義や関数を含むモジュール.C言語で記
1079述される部分をtarget_config.c,アセンブリ言語で記述される部分を
1080target_support.Sに含める.プロセッサ・チップ・開発環境依存部を切り分け
1081ることや,ファイルが大きくなる場合に複数のファイルに分割することも可能
1082である.
1083
1084(c) カーネル実装のターゲット依存部のためのリネーム記述
1085
1086カーネル実装のターゲット依存部の変数名や関数名を,先頭に_kernel_を付与
1087した名前にリネームするためのモジュール.target_rename.defを用意し,ツー
1088ル(utils/genrename)により,target_rename.hとtarget_unrename.hを生成す
1089る.プロセッサ・チップ・開発環境依存部を切り分ける場合には,リネーム記
1090述も切り分ける.
1091
1092
1093(d) タイマドライバ
1094
1095カーネルにタイムティックを通知する(signal_timeを周期的に呼び出す)ため
1096のタイマドライバのヘッダファイル,実装ファイル,システムコンフィギュレー
1097ションファイルを,それぞれ,target_timer.h,target_timer.c,
1098target_timer.cfgに含める.プロセッサ・チップ・開発環境依存部を切り分け
1099ることも可能である.
1100
1101(e) コンフィギュレータ設定ファイル
1102
1103コンフィギュレータの設定ファイルのターゲット依存部を,target_def.csv,
1104target.tf,target_check.tfに用意する.コンフィギュレータ設定ファイルの
1105記述方法については,7章で説明する.
1106
11076.1.2 ターゲット依存部の関数の命名規則
1108
1109カーネル実装のターゲット依存部を構成する関数の中で,t_で始まるものはタ
1110スクコンテキスト専用,i_で始まるものは非タスクコンテキスト専用,x_で始
1111まるものはいずれのコンテキストからでも呼び出すことができる関数である.
1112
11136.2 トレースログ機能への対応
1114
1115カーネルのトレースログ機能の中で,割込みハンドラ,CPU例外ハンドラの開始
1116・終了のトレースログ取得は,ターゲット依存部で実装する必要がある.ほとん
1117どのターゲットシステムにおいて,それらの処理はアセンブリ言語で記述されて
1118おり,ターゲット非依存部向けのトレースログマクロと同じ方法(トレースログ
1119マクロを,トレースログ取得処理のC言語記述にマクロ定義する方法)は,用い
1120ることができない.
1121
1122そこで,アセンブリ言語で記述されている処理中にトレースログ取得を埋め込
1123む場合には,トレースログマクロが定義されていれば,それが何に定義されて
1124いるかは無視して,標準的なトレースログ関数がC言語で記述されていると想定
1125して,それを呼び出すようにコーディングする.
1126
1127具体的には,下の表の左側に示したトレースログマクロが定義されていれば,
1128表の右側に示したC言語記述と同等の処理を行うようにコーディングする.
1129
1130 トレースログマクロ トレースログ取得処理
1131 -----------------------------------------------
1132 LOG_INH_ENTER log_inh_enter(inhno)
1133 LOG_INH_LEAVE log_inh_leave(inhno)
1134 LOG_EXC_ENTER log_exc_enter(excno)
1135 LOG_EXC_LEAVE log_exc_leave(excno)
1136
11376.3 システム状態の管理
1138
1139SSPカーネルを新たなターゲットシステムにポーティングする際に,最も重要な
1140作業は,カーネルが定義するシステム状態を,ハードウェア(プロセッサ)上
1141でどのように実現するかである.以下の説明は,TOPPERS新世代カーネルにおけ
1142るシステム状態の定義・意味を知っていることを前提に記述している.
1143
11446.3.1 全割込みロック状態の管理
1145
1146全割込みロック状態は,NMIを除くすべての割込みをマスクした状態である.全
1147割込みロック状態を管理する機能は,システムインタフェースレイヤ(SIL)に
1148よって提供され,カーネルは全割込みロック状態を管理しない.
1149
1150全割込みロック状態では,sns_kerとext_ker以外のカーネルのサービスコール
1151を呼ぶことはできないものとしており,呼んだ場合には何が起こるか保証して
1152いない.sns_kerとext_kerから呼び出す処理は,トレースログ取得処理とSILの
1153サービスコールを除くと,call_exit_kernelのみである.そのため,
1154call_exit_kernelから呼び出すものを除いて,カーネルのターゲット依存部の
1155関数が,全割込みロック状態で呼び出される状況は考える必要がない.
1156
11576.3.2 コンテキストの管理
1158
1159処理単位が実行されるコンテキストは,タスクコンテキストと非タスクコンテ
1160キストに分類される.
1161
1162ターゲット依存部は,実行中の処理単位が,タスクコンテキストで実行されて
1163いるか非タスクコンテキストで実行されているかを判別する機能を提供する.
1164また,CPU例外が発生したコンテキストについて判別する機能を提供する.
1165
1166ターゲット依存部では,割込みハンドラとCPU例外ハンドラの入口処理で非タス
1167クコンテキストに切り換え,それらの出口処理で元のコンテキストに戻す.ま
1168た,ディスパッチャの内部で一時的に非タスクコンテキストに切り換える.
1169
1170(6-3-2-1) bool_t sense_context(void)
1171
1172実行中の処理単位が,タスクコンテキストで実行されている場合にはfalse,非
1173タスクコンテキストで実行されている場合にはtrueを返す関数.この関数は,
1174CPUロック状態でもCPUロック解除状態でも呼び出せるように実装しなければな
1175らない.
1176
11776.3.3 CPUロック状態の管理
1178
1179ターゲット依存部は,CPUロック状態へ遷移する機能,CPUロック解除状態へ遷
1180移する機能,CPUロック状態であるかを判別する機能を提供する.
1181
1182(6-3-3-1) void t_lock_cpu(void)
1183(6-3-3-2) void i_lock_cpu(void)
1184(6-3-3-3) void x_lock_cpu(void)
1185
1186CPUロック解除状態から,CPUロック状態へ遷移させる関数.これらの関数は,
1187CPUロック状態で呼び出されることはなく,呼び出された場合の動作は保証する
1188必要がない.
1189
1190これらの関数を実現する際には,「1.6 クリティカルセクションの出入処理の
1191実現に関する制約」の節に記述されている制約に従わなければならない.
1192
1193(6-3-3-4) void t_unlock_cpu(void)
1194(6-3-3-5) void i_unlock_cpu(void)
1195(6-3-3-6) void x_unlock_cpu(void)
1196
1197CPUロック状態から,CPUロック解除状態へ遷移させる関数.これらの関数は,
1198CPUロック解除状態で呼び出されることはなく,呼び出された場合の動作は保証
1199する必要がない.
1200
1201タスクコンテキストでCPUロック状態に遷移した場合には,CPUロック解除状態
1202に戻るのはタスクコンテキストに限られ,非タスクコンテキストでCPUロック解
1203除状態に戻ることはない.言い換えると,t_unlock_cpuが呼び出されるのは,
1204t_lock_cpuによってCPUロック状態になっている時である.i_lock_cpuによって
1205CPUロック状態になっている時には,t_unlock_cpuが呼び出されることはない.
1206
1207同様に,非タスクコンテキストでCPUロック状態に遷移した場合には,CPUロッ
1208ク解除状態に戻るのは非タスクコンテキストに限られ,タスクコンテキストで
1209CPUロック解除状態に戻ることはない.言い換えると,i_unlock_cpuが呼び出さ
1210れるのは,i_lock_cpuによってCPUロック状態になっている時である.
1211t_lock_cpuによってCPUロック状態になっている時には,i_unlock_cpuが呼び出
1212されることはない.
1213
1214これらの関数を実現する際には,「1.6 クリティカルセクションの出入処理の
1215実現に関する制約」の節に記述されている制約に従わなければならない.
1216
1217(6-3-3-7) bool_t t_sense_lock(void)
1218(6-3-3-8) bool_t i_sense_lock(void)
1219(6-3-3-9) bool_t x_sense_lock(void)
1220
1221現在のシステム状態が,CPUロック状態の場合はtrue,CPUロック解除状態の場
1222合にはfalseを返す関数.
1223
1224これらの関数が全割込みロック状態で呼び出される状況は考える必要がないこ
1225とから,全割込みロック状態とCPUロック状態を区別できる必要はない.NMI以
1226外にカーネルの管理外の割込みを設けない場合には,全割込みロック状態と
1227CPUロック状態が全く同一の状態でもかまわない.
1228
12296.4 割込みに関連するシステム状態の管理
1230
12316.4.1 割込み優先度マスクの管理
1232
1233ターゲット依存部は,割込み優先度マスクを設定する機能と,割込み優先度マ
1234スクを参照する機能を提供する.
1235
1236(6-4-1-1) void x_set_ipm(PRI intpri)
1237(6-4-1-2) void t_set_ipm(PRI intpri)
1238(6-4-1-3) void i_set_ipm(PRI intpri)
1239
1240割込み優先度マスクの値をintpriに設定する関数.
1241
1242これらの関数は,CPUロック状態でもCPUロック解除状態でも呼び出せるように
1243実装するのが望ましい.ただし,x_set_ipmとt_set_ipmは,ターゲット非依存
1244部がCPUロック解除状態で呼び出すことはないため,CPUロック解除状態で呼び
1245出された場合の動作は保証する必要がない.i_set_ipmは,CPUロック状態でも
1246CPUロック解除状態でも呼び出せるように実装しなければならない.
1247
1248また,これらの関数は,VALID_INTPRI_CHGIPM(intpri)がtrueを返すintpriに対
1249してのみ呼ばれる.intpriにそうでない値が渡された場合の動作は保証する必
1250要がない.
1251
1252(6-4-1-4) PRI x_get_ipm(void)
1253(6-4-1-5) PRI t_get_ipm(void)
1254(6-4-1-6) PRI i_get_ipm(void)
1255
1256割込み優先度マスクの値を参照して返す関数.
1257
1258これらの関数は,CPUロック状態でもCPUロック解除状態でも呼び出せるように
1259実装するのが望ましい.ただし,x_get_ipmとt_get_ipmは,ターゲット非依存
1260部がCPUロック解除状態で呼び出すことはないため,CPUロック解除状態で呼び
1261出された場合の動作は保証する必要がない.i_get_ipmは,CPUロック状態でも
1262CPUロック解除状態でも呼び出せるように実装しなければならない.
1263
1264割込み優先度マスクを用いてカーネル管理の割込みをすべてマスクした状態は,
1265CPUロック状態と区別できることが必要である.具体的には,CPUロック解除状
1266態において,x_set_ipmを用いてカーネル管理の割込みをすべてマスクした場合
1267でも,x_sense_lockはfalseを返す.
1268
1269それに対して,割込み優先度マスクを用いてNMIを除くすべての割込みをマスク
1270できる場合,その状態と全割込みロック状態を区別できる必要はなく,全く同
1271一の状態でもかまわない.
1272
12736.4.2 割込み要求禁止フラグの管理
1274
1275ターゲット依存部は,割込み要求禁止フラグをセットする機能とクリアする機
1276能を提供する.
1277
1278(6-4-2-1) bool_t VALID_INTNO_DISINT(INTNO intno)
1279
1280intnoが,dis_int/ena_intに対する割込み番号として有効な値である場合に
1281true,そうでない場合にfalseを返すマクロ.割込み要求禁止フラグがセット/
1282クリアできないintnoに対しては,このマクロがfalseを返すようにする.
1283
1284(6-4-2-2) bool_t x_disable_int(INTNO intno)
1285(6-4-2-3) bool_t t_disable_int(INTNO intno)
1286(6-4-2-4) bool_t i_disable_int(INTNO intno)
1287
1288intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをセットし,
1289trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ
1290れていない場合には,falseを返す.
1291
1292これらの関数は,ターゲット非依存部がCPUロック解除状態で呼び出すことはな
1293いため,CPUロック解除状態で呼び出された場合の動作は保証する必要がない.
1294ただし,ターゲット依存部からCPUロック解除状態で呼び出す場合には,保証す
1295る必要がある.
1296
1297また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し
1298てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必要が
1299ない.
1300
1301dis_intサービスコールをサポートする場合(TOPPERS_SUPPORT_DIS_INTをマク
1302ロ定義する場合)には,t_disable_intが用意されていなければならない.
1303
1304(6-4-2-5) bool_t x_enable_int(INTNO intno)
1305(6-4-2-6) bool_t t_enable_int(INTNO intno)
1306(6-4-2-7) bool_t i_enable_int(INTNO intno)
1307
1308intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをクリアし,
1309trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ
1310れていない場合には,falseを返す.
1311
1312これらの関数は,ターゲット非依存部がCPUロック解除状態で呼び出すことはな
1313いため,CPUロック解除状態で呼び出された場合の動作は保証する必要がない.
1314ただし,ターゲット依存部からCPUロック解除状態で呼び出す場合には,保証す
1315る必要がある.
1316
1317また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し
1318てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必要が
1319ない.
1320
1321ena_intサービスコールをサポートする場合(TOPPERS_SUPPORT_ENA_INTをマク
1322ロ定義する場合)には,t_enable_intが用意されていなければならない.
1323
13246.4.3 割込み要求のクリア
1325
1326(6-4-3-1) void x_clear_int(INTNO intno)
1327(6-4-3-2) void t_clear_int(INTNO intno)
1328(6-4-3-3) void i_clear_int(INTNO intno)
1329
1330intnoで指定された割込み要求ラインがエッジトリガである場合に,トリガされ
1331た割込み要求をクリアする関数.intnoで指定された割込み要求ラインがレベル
1332トリガである場合には何もしない.
1333
1334SSPカーネルのターゲット非依存部では,これらの関数を呼び出していないが,
1335ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する
1336こととしている.そのため,これらの関数がどのようなシステム状態で呼び出
1337せるかは,ターゲット依存部内で一貫していればよい.
1338
13396.4.4 割込み要求のプローブ
1340
1341(6-4-4-1) bool_t x_probe_int(INTNO intno)
1342(6-4-4-2) bool_t t_probe_int(INTNO intno)
1343(6-4-4-3) bool_t i_probe_int(INTNO intno)
1344
1345intnoで指定された割込み要求ラインに対して,割込みが要求されている場合に
1346true,そうでない場合にfalseを返す関数.
1347
1348SSPカーネルのターゲット非依存部では,これらの関数を呼び出していないが,
1349ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する
1350こととしている.そのため,これらの関数がどのようなシステム状態で呼び出
1351せるかは,ターゲット依存部内で一貫していればよい.
1352
13536.4.5 割込みハンドラの先頭処理と末尾処理
1354
1355(6-4-5-1) void i_begin_int(INTNO intno)
1356
1357intnoで指定された割込み要求ラインに対する割込みハンドラの先頭で行うべき
1358処理を行う関数.ここで行うべき処理としては,割込み要求ラインがエッジト
1359リガである場合のトリガされた割込み要求のクリアが挙げられる.
1360
1361intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの
1362先頭で呼び出される.そのためこの関数は,割込みハンドラの先頭(通常は
1363CPUロック解除状態)で呼び出せるように実装しなければならない.
1364
1365(6-4-5-2) void i_end_int(INTNO intno)
1366
1367intnoで指定された割込み要求ラインに対する割込みハンドラの末尾で行うべき
1368処理を行う関数.ここで行うべき処理としては,割込みコントローラ(IRC)に
1369対する割込み処理の終了を通知が挙げられる.
1370
1371intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの
1372末尾で呼び出される.そのためこの関数は,割込みハンドラの末尾(通常は
1373CPUロック解除状態)で呼び出せるように実装しなければならない.
1374
13756.5 タスクディスパッチャ
1376
1377
13786.5.1 ディスパッチャの動作開始
1379
1380(6-5-1-1) void start_dispatch(void)
1381
1382ディスパッチャの動作開始(start_dispatch)は,カーネル起動時に,カーネ
1383ルの初期化処理から呼び出される.start_dispatchは,リターンすることのな
1384い関数である.
1385
1386start_dispatchは,非タスクコンテキストで,NMIを除くすべての割込みをマス
1387クした状態(全割込みロック状態と同等の状態)で呼び出される.start_dispatch
1388内で,タスクコンテキストに切り換え,CPUロック状態・割込み優先度マスク全
1389解除状態にしなければならない.
1390
1391コンテキストを切り替えた後はターゲット非依存部関数dispatcherを呼び出す.
1392
1393start_dispatchの処理内容は次の通り.dispatcherから処理が返ることは考量する必要は
1394ない.
1395
1396----------------------------------------
1397void
1398start_dispatch(void)
1399{
1400 タスクコンテキストに切り換える
1401 CPUロック状態・割込み優先度マスク全解除状態にする
1402 dispatcherに分岐する
1403}
1404----------------------------------------
1405
14066.6 割込みハンドラ
1407
14086.6.1 割込みハンドラの出入口処理
1409
1410カーネル管理の割込みの出入口処理の方法は,プロセッサによって大きく異な
1411るが,おおよその処理内容は次の通り.
1412
1413----------------------------------------
1414void
1415<割込みの出入口処理>(void)
1416{
1417 少なくともカーネル管理の割込みを禁止した状態にする … (*f)
1418 スクラッチレジスタをスタックに保存する
1419 if (タスクコンテキストで割込み発生) {
1420 非タスクコンテキストに切り換える
1421 }
1422
1423 この割込みよりも優先度の高い割込みのみを受け付けられるようにして,
1424 CPUロック解除状態にする
1425#ifdef LOG_INH_ENTER
1426 log_inh_enter(割込みハンドラ番号);
1427#endif /* LOG_INH_ENTER */
1428 割込みハンドラを呼び出す
1429#ifdef LOG_INH_LEAVE
1430 log_inh_leave(割込みハンドラ番号);
1431#endif /* LOG_INH_LEAVE */
1432
1433 ret_int:
1434 if (タスクコンテキストで割込み発生) {
1435 (少なくとも)カーネル管理の割込みを禁止した状態にする … (*d)
1436 if (reqflg) {
1437 reqflg = false;
1438 CPUロック状態にする … (*e)
1439 search_schedtskを呼び出し,最高優先順位タスクを求める
1440 最高優先順位のタスクIDを引数にしてrun_taskに分岐する
1441 }
1442 }
1443 割込み処理からのリターン後に,CPUロック解除状態に戻るように準備する
1444 スクラッチレジスタをスタックから復帰する
1445 割込み処理からのリターン
1446}
1447----------------------------------------
1448
1449割込みの受付けによりすべての割込みが禁止されないプロセッサでは,(*f)に
1450おいて,少なくともカーネル管理の割込みを禁止する.この理由は次の通りで
1451ある.
1452
1453割込みの入口処理において,スタックを非タスクコンテキスト用のスタックに
1454切り換える前に多重割込みが発生すると,タスクのスタック領域が使用される.
1455上記のようなプロセッサでは,スタックの切換え前に,最大で割込み優先度の
1456段数分の多重割込みが発生することを防ぐことはできず,各タスクのスタック
1457領域を確保する際に,その分を見込んで確保しなければならない.各タスクの
1458スタック領域をなるべく小さくするためには,スタックをなるべく使用しない
1459内に,多重割込みを禁止するのが望ましい.そのため,スクラッチレジスタを
1460スタックに保存する前に,割込みを禁止する.ただし,割込みの禁止処理に必
1461要な最低限のレジスタについては,割込みの禁止に先立ってスタックに保存す
1462る必要がある.
1463
1464同様のことは,カーネル管理外の割込みにも当てはまる.すなわち,カーネル
1465管理外の割込みについても,スタックをなるべく使用しない内に禁止するのが
1466望ましい.このことから,カーネル管理外の割込みを使用する場合には,(*f)
1467において,すべての割込みを禁止した状態にするのが望ましいことになる.ま
1468た,カーネル管理外の割込み処理においても,非タスクコンテキスト用のスタッ
1469クに切り換えることが望ましいが,これはカーネルの管轄外である.
1470
1471(*d)においては,カーネル管理の割込みを禁止するだけで,CPUロック状態にす
1472る必要はない.例えば,CPUロック状態であることを示す変数を用意している場
1473合には,(*d)の時点ではその変数をCPUロック状態を示す値に変更する必要はな
1474く,(*e)において変更すればよい.
1475
1476割込みの出入口処理をアセンブリ言語で記述する場合には,トレースログ取得
1477処理は,「6.2 トレースログ機能への対応」の節で記述した方法でコーディン
1478グすること.
1479
14806.6.2 割込みハンドラ毎の出入口処理の生成
1481
1482割込みベクトルをハードウェアで実現している場合など,割込みハンドラ毎に
1483出入口処理を用意した方が効率が良いターゲットのために,割込みハンドラ毎
1484に出入口処理を生成する機構を用意している.
1485
1486以下のマクロは,標準の割込み管理機能の初期化処理を用いた場合のみ,ター
1487ゲット非依存部で使われる.割込み管理機能の初期化処理をターゲット依存部
1488で用意し,その中でこれらのマクロを使わない場合には,これらのマクロを用
1489意する必要はない.
1490
1491(6-6-2-1) INT_ENTRY(inhno, inthdr)
1492
1493割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ
1494ンドラの出入口処理のラベルを作るマクロ.INTHDR_ENTRYを用いて割込みハン
1495ドラ毎に出入口処理を生成する場合には,次のように定義する.
1496
1497#define INT_ENTRY(inhno, inthdr) _kernel_##inthdr##_##inhno
1498
1499割込みハンドラ毎に出入口処理を作る必要がない場合には,次のように定義し
1500て,割込みハンドラの関数名をそのまま返す.
1501
1502#define INT_ENTRY(inhno, inthdr) inthdr
1503
1504(6-6-2-2) INTHDR_ENTRY(inhno, inhno_num, inthdr)
1505
1506割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ
1507ンドラの出入口処理を生成するマクロ.inhno_numには,アセンブリ言語記述用
1508に,割込みハンドラ番号が数値で渡される.割込みハンドラ毎に出入口処理を
1509作る必要がない場合には,空に定義する.
1510
15116.6.3 割込みハンドラの設定
1512
1513(6-6-3-1) bool_t VALID_INHNO_DEFINH(INHNO inhno)(オプション)
1514
1515inhnoが,DEF_INHに対する割込みハンドラ番号として有効な値である場合に
1516true,そうでない場合にfalseを返すマクロ.
1517
1518SSPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
1519ゲット依存部で使わないなら,用意する必要がない.
1520
1521(6-6-3-2) void x_define_inh(INHNO inhno, FP int_entry)
1522
1523inhnoで指定された割込みハンドラの出入口処理の番地をint_entryに設定する.
1524
1525この関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ
1526ト非依存部から呼び出される.割込み管理機能の初期化処理をターゲット依存
1527部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する
1528必要はない.
1529
1530この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
1531カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼
1532び出せるように実装すればよい.
1533
1534指定された割込みハンドラ番号がDEF_INHに対するものとして有効な値でない場
1535合の動作は保証する必要がない(assertでエラーとするのが望ましい).これ
1536は,コンフィギュレータが,パス2のテンプレートファイルのターゲット依存部
1537で定義するINHNO_DEFINH_VALIDを用いてエラーを検出するためである.
1538
15396.6.4 割込み要求ラインの属性の設定
1540
1541(6-6-4-1) bool_t VALID_INTNO_CFGINT(INTNO intno)(オプション)
1542
1543intnoが,CFG_INTに対する割込み番号として有効な値である場合にtrue,そう
1544でない場合にfalseを返すマクロ.割込み要求ラインの属性を設定できない
1545intnoに対しては,このマクロがfalseを返すようにする.
1546
1547SSPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
1548ゲット依存部で使わないなら,用意する必要がない.
1549
1550(6-6-4-2) void x_config_int(INTNO intno, ATR intatr, PRI intpri)
1551
1552intnoで指定された割込み要求ラインの割込み属性を,intatrで指定された通り
1553に設定する.また,割込み優先度を,intpriで指定された値に設定する.
1554
1555この関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ
1556ト非依存部から呼び出される.割込み管理機能の初期化処理をターゲット依存
1557部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する
1558必要はない.
1559
1560この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
1561カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼
1562び出せるように実装すればよい.
1563
1564intatrとして設定できる割込み属性は次の通り.
1565
1566 TA_ENAINT 0x01 割込み要求禁止フラグをクリア
1567 TA_EDGE 0x02 エッジトリガ
1568
1569この他に,ターゲット定義で割込み属性を追加してもよい.ターゲット定義で
1570追加するために,以下の属性名が予約されている.
1571
1572 TA_POSEDGE ポジティブエッジトリガ
1573 TA_NEGEDGE ネガティブエッジトリガ
1574 TA_BOTHEDGE 両エッジトリガ
1575 TA_LOWLEVEL ローレベルトリガ
1576 TA_HIGHLEVEL ハイレベルトリガ
1577
1578これらの属性名をターゲット定義で追加する場合には,その属性値を決定し,
1579定義をtarget_kernel.h(または,そこからインクルードされるファイル)に含
1580める.また,コンフィギュレータテンプレートファイルから参照できるように,
1581target_def.csv(または,そこからインクルードされるファイル)に含め,コ
1582ンフィギュレータテンプレートファイルのターゲット非依存部でエラーとなら
1583ないように,target.tf(または,そこからインクルードされるファイル)で
1584TARGET_INTATRに設定する.
1585
1586指定された割込み番号がCFG_INTに対するものとして有効な値でない場合や,そ
1587の割込み要求ラインに対して設定できない属性を指定した場合,設定できない
1588割込み優先度を指定した場合の動作は保証する必要がない(assertでエラーと
1589するのが望ましい).このようなケースは,コンフィギュレータでエラーを検
1590出すべきである.コンフィギュレータテンプレートファイルのターゲット非依
1591存部は,パス2のテンプレートファイルのターゲット依存部で定義する
1592INTNO_CFGINT_VALID,TARGET_INTATR,INTPRI_CFGINT_VALIDを用いてエラーを
1593検出するが,標準の割込み属性(TA_ENAINT,TA_EDGE)が設定できない場合や,
1594設定できない属性や割込み優先度が割込み要求ラインによって異なる場合には,
1595コンフィギュレータテンプレートファイルのターゲット依存部で検出しなけれ
1596ばならない.
1597
15986.6.5 割込み管理機能の初期化処理の変更
1599
1600(6-6-5-1) OMIT_INITIALIZE_INTERRUPT(オプション)
1601
1602割込み管理機能の初期化処理をターゲット依存部で用意し,ターゲット非依存
1603部に含まれる標準の割込み管理機能の初期化処理を用いない場合には,このシ
1604ンボルをマクロ定義する.
1605
1606このシンボルをマクロ定義すると,INHINIB,INTINIB,initialize_interrupt
1607の定義が,カーネルのターゲット非依存部から取り除かれる.また,
1608TNUM_INHNO,tnum_inhno,inhinib_table,TNUM_INTNO,tnum_intno,
1609intinib_tableの定義と,割込みハンドラ毎の出入口処理を生成するための記述
1610(INTHDR_ENTRYマクロのリスト)が,コンフィギュレータのパス2のテンプレー
1611トファイルのターゲット非依存部によってkernel_cfg.cに生成されなくなる.
1612ただし,コンフィギュレータのパス2のテンプレートファイルのターゲット依存
1613部で,USE_INHINIB_TABLEとUSE_INTINIB_TABLEを設定することで,その一部
1614分をkernel_cfg.cに生成することが可能である.
1615
1616(6-6-5-2) void initialize_interrupt(void)(オプション)
1617
1618OMIT_INITIALIZE_INTERRUPTをマクロ定義した場合には,この関数をターゲット
1619依存部で用意する.OMIT_INITIALIZE_INTERRUPTをマクロ定義することにより取
1620り除かれるその他のデータ型,変数,マクロは,この関数で使用する場合にの
1621み用意すればよい.
1622
16236.6.6 デフォルトの割込みハンドラ
1624
1625(6-6-6-1) default_int_handler(void)(オプション)
1626
1627コンフィギュレータにより割込みハンドラのテーブルを生成する場合などには,
1628割込みハンドラを登録しなかった割込みハンドラ番号に対して,デフォルトの
1629割込みハンドラとして,default_int_handlerを登録する.
1630
1631default_int_handlerは,標準のものをターゲット依存部で用意するが,ユーザ
1632が用意したもので置き換えられるように,OMIT_DEFAULT_INT_HANDLERをマクロ
1633定義した場合には,ターゲット依存部で定義しないようにする.なお,ユーザ
1634が用意する場合の名称は,_kernel_default_int_handlerとなる.
1635
16366.6.7 カーネル管理外の割込み
1637
1638カーネル管理外の割込みハンドラは,カーネル内の割込み出入口処理を経由せ
1639ずに実行するのが基本である.
1640
1641ただし,すべての割込みで同じアドレスに分岐するプロセッサでは,カーネル
1642内の割込み出入口処理を全く経由せずにカーネル管理外の割込みハンドラを実
1643行することができないため,割込み出入口処理のなるべく早いタイミングで,
1644カーネル管理外の割込みであるかを判別し,処理内容を分ける必要がある.具
1645体的には,カーネル管理外の割込みの出入口処理では,オーバランハンドラの
1646停止と動作開始を行ってはならない.また,reqflgをチェックし,タスク切換
1647えやタスク例外処理ルーチンの呼出しを行う必要がない.さらに,NMIの出入口
1648処理では,トレースログ取得処理(log_inh_enterおよびlog_inh_leave)を呼
1649び出してはならない.
1650
1651カーネル管理外の割込みハンドラを実行する際に,カーネル内の割込み出入口
1652処理の一部分を経由する場合には,CPU例外が起こる可能性を極力減らすととも
1653に,CPU例外を起こす可能性がある場合には,その可能性をターゲット依存部の
1654ユーザーズマニュアルに記載しなければならない.
1655
1656次に,カーネル管理外の割込みの設定方法に関して,「TOPPERS新世代カーネル
1657統合仕様書」の「6.6.8 カーネル管理外の割込みの設定方法」の節の3つの方法
1658のいずれを採用するかを決定する.
1659
1660(a-1)または(a-2)を採用し,カーネル管理外とした割込みに対して,カーネル
1661のAPIによる割込みハンドラの登録と割込み要求ラインの属性の設定をサポート
1662しない場合には,それに代わる方法をターゲット依存部のユーザーズマニュア
1663ルに記述する.
1664
1665(a-1)または(a-2)を採用してカーネルのAPIによる割込みハンドラの登録や割込
1666み要求ラインの属性の設定をサポートする場合や,(b)を採用した場合には,ター
1667ゲット依存部においてそれを実現する必要がある.
1668
1669カーネル管理外の割込みに対して,DEF_INHによる割込みハンドラの登録をサポー
1670トするには,次の設定が必要になる.
1671
1672・TARGET_INHATRに,TA_NONKERNELを設定する.
1673
1674・(a-1)または(a-2)を採用した場合には,INHNO_DEFINH_VALIDに,カーネル管
1675 理外とした割込みに対応する割込みハンドラ番号を含める.また,
1676 VALID_INHNO_DEFINHを,カーネル管理外とした割込みハンドラ番号を有効な
1677 値と判定するようにする.
1678
1679・(a-1)または(a-2)を採用した場合には,INHNO_FIX_KERNELにカーネル管理と
1680 した割込みハンドラ番号のリストを,INHNO_FIX_NONKERNELにカーネル管理外
1681 とした割込みハンドラ番号のリスト設定する.
1682
1683・DEF_INHがカーネル管理外の割込みに対応できるようにする.標準の割込み管
1684 理機能の初期化処理を用いる場合には,x_define_inhをカーネル管理外の割
1685 込みに対応させる.
1686
1687・必要な場合には,TA_NONKERNEL属性が設定された割込みハンドラをカーネル
1688 管理外と扱うように,カーネル内の割込み出入口処理を修正する.標準の割
1689 込み管理機能の初期化処理を用いる場合,カーネル管理外の割込みに対して
1690 は,カーネル内の割込み出入口処理を生成せず,アプリケーションが登録し
1691 た割込みハンドラを直接呼び出すように,ターゲット非依存部により設定さ
1692 れるため,ターゲット依存部では対応する必要がない.
1693
1694カーネル管理外の割込みに対して,CFG_INTによる割込み要求ラインの属性の設
1695定をサポートするには,次の設定が必要になる.
1696
1697・(a-1)または(a-2)を採用した場合には,INTNO_CFGINT_VALIDに,カーネル管
1698 理外とした割込みに対応する割込み番号を含める.また,VALID_INTNO_CFGINT
1699 を,カーネル管理外とした割込み番号を有効な値と判定するようにする.
1700
1701・(a-1)または(a-2)を採用した場合には,INTNO_FIX_KERNELにカーネル管理と
1702 した割込み番号のリストを,INTNO_FIX_NONKERNELにカーネル管理外とした割
1703 込み番号のリスト設定する.
1704
1705・INTPRI_CFGINT_VALIDに,カーネル管理外の割込みとなる優先度を含める.
1706
1707・CFG_INTがカーネル管理外の割込みに対応できるようにする.標準の割込み管
1708 理機能の初期化処理を用いる場合には,x_config_intをカーネル管理外の割
1709 込みに対応させる.
1710
1711chg_ipmにより,(NMI以外の)カーネル管理外の割込みをマスクできるように
1712する場合には,次の設定が必要になる.
1713
1714・VALID_INTPRI_CHGIPMを,カーネル管理外の割込みとなる優先度を有効な値と
1715 判定するようにする.
1716
1717・t_set_ipmを,カーネル管理外の割込みとなる優先度を扱えるようにする.
1718
17196.7 CPU例外ハンドラとCPU例外発生時のシステム状態の参照
1720
17216.7.1 CPU例外ハンドラの出入口処理
1722
1723CPU例外の出入口処理の方法はプロセッサによって大きく異なるが,おおよその
1724処理内容は次の通り.
1725
1726----------------------------------------
1727void
1728<CPU例外の出入口処理>(void)
1729{
1730 スクラッチレジスタをスタックに保存する
1731 if (カーネル管理外のCPU例外) {
1732 if (タスクコンテキストでCPU例外発生) {
1733 非タスクコンテキストに切り換える
1734 }
1735 システム状態(コンテキストは除く)を,CPU例外発生時の状態にする
1736 CPU例外ハンドラを,CPU例外の情報を記憶している領域の先頭番地を
1737 パラメータ(p_excinf)として呼び出す
1738 if (タスクコンテキストでCPU例外発生) {
1739 タスクコンテキストに切り換える
1740 }
1741 CPU例外処理からのリターン後に,CPU例外発生時のシステム状態に
1742 戻るように準備する
1743 }
1744 else {
1745 if (タスクコンテキストでCPU例外発生) {
1746 非タスクコンテキストに切り換える
1747 }
1748 システム状態(コンテキストは除く)を,CPU例外発生時の状態にする
1749  (CPU例外発生時の割込み優先度マスクよりも優先度の高い割込み
1750 のみを受け付けられるようにして,CPUロック解除状態にする)
1751
1752#ifdef LOG_EXC_ENTER
1753 log_exc_enter(CPU例外ハンドラ番号);
1754#endif /* LOG_EXC_ENTER */
1755 CPU例外ハンドラを,CPU例外の情報を記憶している領域の先頭番地を
1756 パラメータ(p_excinf)として呼び出す
1757#ifdef LOG_EXC_LEAVE
1758 log_exc_leave(CPU例外ハンドラ番号);
1759#endif /* LOG_EXC_LEAVE */
1760
1761 ret_exc:
1762 if (タスクコンテキストでCPU例外発生) {
1763 (少なくとも)カーネル管理の割込みを禁止した状態にする … (*d)
1764 タスクコンテキストに切り換える
1765 if (reqflg) {
1766 reqflg = false;
1767 CPUロック状態にする … (*e)
1768 search_schedtskを呼び出し,最高優先順位タスクを求める
1769 最高優先順位のタスクIDを引数にしてrun_taskに分岐する
1770 }
1771 }
1772 CPU例外処理からのリターン後に,CPUロック解除状態に戻るように準備する
1773 }
1774 スクラッチレジスタをスタックから復帰する
1775 CPU例外処理からのリターン
1776}
1777----------------------------------------
1778
1779CPU例外ハンドラは,非コンテキストに切り換えることを除いては,CPU例外発
1780生時と同じシステム状態で呼び出さなければならない.例えば,CPU例外がCPU
1781ロック状態で発生した場合にはCPUロック状態,CPUロック解除状態で発生した
1782場合にはCPUロック解除状態で,CPU例外ハンドラを呼び出さなければならない.
1783CPUロック状態で発生したCPU例外は,カーネル管理外のCPU例外となるため,カー
1784ネル管理のCPU例外ハンドラについては,CPUロック解除状態で呼び出すことに
1785なる.
1786
1787カーネル管理外のCPU例外であることは,exc_sense_unlockがfalseを返す条件
1788と,タスクコンテキストであることを調べないだけの違いであり,ほぼ同じコー
1789ドで判定することができる.
1790
1791上のコードでは,カーネル管理外のCPU例外に対して,トレースログ取得処理
1792(log_exc_enterおよびlog_exc_leave)を呼び出していないが,全割込みロッ
1793ク状態かNMIの処理中にCPU例外が発生した場合を除外すれば,呼び出してもか
1794まわない.全割込みロック状態かNMIの処理中に発生したCPU例外の場合には,
1795トレースログ取得処理を呼び出してはならない.
1796
1797CPU例外ハンドラを実行する際に経由する部分では,CPU例外が起こる可能性を
1798極力減らすとともに,CPU例外を起こす可能性がある場合(例えば,スクラッチ
1799レジスタをスタックに保存する時に,バスエラーなどのCPU例外が発生する可能
1800性が考えられる)には,その可能性をターゲット依存部のユーザーズマニュア
1801ルに記載しなければならない.
1802
1803ret_exc以降の処理は,割込みの出入口処理のret_int以降の処理と同じである
1804ため,ターゲットによっては,共通のルーチンを用いることができる可能性が
1805ある.
1806
1807CPU例外の出入口処理をアセンブリ言語で記述する場合には,トレースログ取得
1808処理は,「6.2 トレースログ機能への対応」の節で記述した方法でコーディン
1809グすること.
1810
18116.7.2 CPU例外ハンドラの出入口処理の生成
1812
1813CPU例外ベクトルをハードウェアで実現している場合など,CPU例外ハンドラ毎
1814に出入口処理を用意した方が効率が良いターゲットのために,CPU例外ハンドラ
1815毎に出入口処理を生成する機構を用意している.
1816
1817以下のマクロは,標準のCPU例外管理機能の初期化処理を用いた場合のみ,ター
1818ゲット非依存部で使われる.CPU例外管理機能の初期化処理をターゲット依存部
1819で用意し,その中でこれらのマクロを使わない場合には,これらのマクロを用
1820意する必要はない.
1821
1822(6-7-2-1) EXC_ENTRY(excno, exchdr)
1823
1824CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例
1825外ハンドラの出入口処理のラベルを作るマクロ.EXCHDR_ENTRYを用いてCPU例外
1826ハンドラ毎に出入口処理を生成する場合には,次のように定義する.
1827
1828#define EXC_ENTRY(excno, exchdr) _kernel_##exchdr##_##excno
1829
1830CPU例外ハンドラ毎に出入口処理を作る必要がない場合には,次のように定義し
1831て,CPU例外ハンドラの関数名をそのまま返す.
1832
1833#define EXC_ENTRY(excno, exchdr) exchdr
1834
1835(6-7-2-2) EXCHDR_ENTRY(excno, excno_num, exchdr)
1836
1837CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例
1838外ハンドラの出入口処理を生成するマクロ.excno_numには,アセンブリ言語記
1839述用に,CPU例外ハンドラ番号が数値で渡される.CPU例外ハンドラ毎に出入口
1840処理を作る必要がない場合には,空に定義する.
1841
18426.7.3 CPU例外ハンドラの設定
1843
1844(6-7-3-1) bool_t VALID_EXCNO_DEFEXC(EXCNO excno)(オプション)
1845
1846excnoが,DEF_EXCに対するCPU例外ハンドラ番号として有効な値である場合に
1847true,そうでない場合にfalseを返すマクロ.
1848
1849SSPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
1850ゲット依存部で使わないなら,用意する必要がない.
1851
1852(6-7-3-2) void x_define_exc(EXCNO excno, FP exc_entry)
1853
1854excnoで指定されたCPU例外ハンドラの出入口処理の番地をexc_entryに設定する.
1855
1856この関数は,標準のCPU例外管理機能の初期化処理を用いた場合のみ,ターゲッ
1857ト非依存部から呼び出される.CPU例外管理機能の初期化処理をターゲット依存
1858部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する
1859必要はない.
1860
1861この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
1862カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼
1863び出せるように実装すればよい.
1864
1865指定されたCPU例外ハンドラ番号がDEF_EXCに対するものとして有効な値でない
1866場合の動作は保証する必要がない(assertでエラーとするのが望ましい).こ
1867れは,コンフィギュレータが,パス2のテンプレートファイルのターゲット依存
1868部で定義するEXCNO_DEFEXC_VALIDを用いてエラーを検出するためである.
1869
18706.7.4 CPU例外管理機能の初期化処理の変更
1871
1872(6-7-4-1) OMIT_INITIALIZE_EXCEPTION(オプション)
1873
1874CPU例外管理機能の初期化処理をターゲット依存部で用意し,ターゲット非依存
1875部に含まれる標準の割込み管理機能の初期化処理を用いない場合には,このシ
1876ンボルをマクロ定義する.
1877
1878このシンボルをマクロ定義すると,EXCINIBとinitialize_exceptionの定義が,
1879カーネルのターゲット非依存部から取り除かれる.また,TNUM_EXCNO,
1880tnum_excno,excinib_tableの定義と,CPU例外ハンドラ毎の出入口処理を生成
1881するための記述(EXCHDR_ENTRYマクロのリスト)を,コンフィギュレータのパ
1882ス2のテンプレートファイルのターゲット非依存部によってkernel_cfg.cに生成
1883されなくなる.
1884
1885(6-7-4-2) void initialize_exception(void)(オプション)
1886
1887OMIT_INITIALIZE_EXCEPTIONをマクロ定義した場合には,この関数をターゲット
1888依存部で用意する.OMIT_INITIALIZE_EXCEPTIONをマクロ定義することにより取
1889り除かれるその他のデータ型,変数,マクロは,この関数で使用する場合にの
1890み用意すればよい.
1891
18926.7.5 デフォルトのCPU例外ハンドラ
1893
1894(6-7-5-1) default_exc_handler(void)(オプション)
1895
1896コンフィギュレータによりCPU例外ハンドラのテーブルを生成する場合などには,
1897CPU例外ハンドラを登録しなかったCPU例外ハンドラ番号に対して,デフォルト
1898のCPU例外ハンドラとして,default_exc_handlerを登録する.
1899
1900default_exc_handlerは,標準のものをターゲット依存部で用意するが,ユーザ
1901が用意したもので置き換えられるように,OMIT_DEFAULT_EXC_HANDLERをマクロ
1902定義した場合には,ターゲット依存部で定義しないようにする.なお,ユーザ
1903が用意する場合の名称は,_kernel_default_exc_handlerとなる.
1904
19056.8 カーネルの起動・終了とスタック領域など
1906
1907(6-8-1) スタートアップモジュール
1908
1909カーネルのスタートアップモジュールは,システムのリセット後に最初に実行
1910されるプログラムである.スタートアップモジュールは,標準的には,プロセッ
1911サ依存部またはチップ依存部で用意し以下の処理を行うが,それにこだわる必
1912要はない.具体的には,開発環境に用意されているスタートアップモジュール
1913を用いる方法(この場合,ターゲット依存部でmain関数を用意する必要がある)
1914や,アプリケーションで用意する場合が考えられる.
1915
1916(a) プロセッサ状態の初期化
1917
1918プロセッサモード,スタックポインタ,フレームポインタ等,プロセッサの状
1919態を初期化する.また,NMIを除くすべての割込みをマスクした状態(全割込み
1920ロック状態と同等の状態)とする.DRAMコントローラの初期化など,メモリを
1921アクセスするために必要な初期化処理をここで行ってもよい(次の
1922hardware_init_hookで行ってもよい).
1923
1924(b) hardware_init_hookを呼び出す
1925
1926システムのリセット後すぐに行う必要のあるターゲットシステム依存の初期化
1927処理を行うために,hardware_init_hookを呼び出す.hardware_init_hookが用
1928意されていない場合は,何もしない.GNU開発環境では,リンカスクリプト中の
1929weak definitionにより,hardware_init_hookが用意されていない場合の値を0
1930とすることで,これを実現できる.weak definitionの機能を持たない開発環境
1931では,hardware_init_hookを必ず呼び出すことにする.
1932
1933hardware_init_hookは,ターゲット依存部で用意するのが標準であるが,シス
1934テムのリセット後すぐに行う必要のある初期化処理を追加するために,アプリ
1935ケーションで用意したものを用いる場合もある.
1936
1937メモリアクセスに必要な初期化処理をhardware_init_hookで行う場合には,こ
1938れを呼び出す時点でメモリにアクセスすることができないため,関数(サブルー
1939チン)を呼び出すためにスタックを使用するプロセッサでは,戻り番地を汎用
1940レジスタに入れて呼び出すといった工夫が必要である.この場合,
1941hardware_init_hookをC言語で記述することはできなくなるが,やむをえない.
1942
1943(c) bssセクションとdataセクションの初期化
1944
1945bssセクションをクリアし,dataセクションに初期値を設定する.
1946
1947ただし,カーネル本体は,kerflgがfalse(=0)に初期化されること以外に,
1948これらのセクションが初期化されることに依存していないため,スタートアッ
1949プモジュールをアプリケーションで用意する場合で,システムサービスやアプ
1950リケーションがこれらのセクションが初期化されることに依存していない場合
1951には,システムの起動時間を短縮するために,kerflgをfalseに初期化するだけ
1952で十分である.
1953
1954(d) software_init_hookを呼び出す
1955
1956開発環境(特にライブラリ)に依存して必要な初期化処理を行うために,
1957software_init_hookを呼び出す.software_init_hookが用意されていない場合
1958は,何もしない.GNU開発環境では,リンカスクリプト中のweak definitionに
1959より,software_init_hookが用意されていない場合の値を0とすることで,これ
1960を実現できる.weak definitionの機能を持たない開発環境では,
1961software_init_hookを必ず呼び出すことにする.
1962
1963software_init_hookは,ターゲット依存部で用意するのが標準である.
1964
1965(e) sta_kerへ分岐
1966
1967sta_kerを呼び出す.sta_kerは,NMIを除くすべての割込みをマスクした状態
1968(全割込みロック状態と同等の状態)で呼び出さなければならない.sta_kerか
1969らはリターンすることがないため,スタートアップモジュールに戻ってくるこ
1970とは考える必要がない.
1971
1972(6-8-2) void target_initialize(void)
1973
1974ターゲット依存部の初期化を行う関数.sta_kerの最初で呼び出される.プロセッ
1975サ・チップ・開発環境依存の初期化処理を,それらの依存部に切り分けること
1976も可能である.
1977
1978この関数は,あくまでもカーネルのターゲット依存部の初期化処理を行うため
1979のものである.アプリケーションに必要な初期化処理は,初期化ルーチンで行
1980うのが基本であるが,システムのリセット後すぐに行う必要がある場合には,
1981hardware_init_hookを用いる.
1982
1983(6-8-3) void call_exit_kernel(void)
1984
1985非タスクコンテキストに切り換えて,exit_kernelへ分岐する関数.ext_kerか
1986ら呼び出される.exit_kernelからはリターンすることがないため,この関数に
1987戻ってくることは考える必要がない.
1988
1989非タスクコンテキストに切り換えるのは,終了処理ルーチンを,非タスクコン
1990テキスト用のスタックで実行するためである.終了処理ルーチンをタスク用の
1991スタックで実行すると,各タスクのスタック領域のサイズを決定する際に,終
1992了処理ルーチンが使用するスタック領域を考慮しなければならない.これには,
1993終了処理ルーチンが使用するスタック領域が大きい場合に各タスクのスタック
1994領域を無駄に大きくしなければならないことに加えて,意図しないスタックオー
1995バーフローが発生する可能性を高めるという問題がある.
1996
1997この関数は,全割込みロック状態で呼ばれるため,全割込みロック状態から呼
1998び出すことができない関数を呼ばないように実装しなければならない.
1999
2000(6-8-4) void target_exit(void)
2001
2002ターゲット依存部の終了処理を行う関数.この関数は,カーネル終了処理の最
2003後に呼び出され,リターンしてはならない.プロセッサ・チップ・開発環境依
2004存の終了処理を,それらの依存部に切り分けることも可能である.
2005
2006この関数では,最初に,atexitによって登録された関数とデストラクタを呼び
2007出すことを意図しており,標準的には,software_term_hookを呼び出す.
2008software_term_hookが用意されていない場合は,何もしない.GNU開発環境では,
2009リンカスクリプト中のweak definitionにより,software_term_hookが用意され
2010ていない場合の値を0とすることで,これを実現できる.weak definitionの機
2011能を持たない開発環境では,software_term_hookを必ず呼び出すことにする.
2012
2013この関数は,全割込みロック状態で呼ばれるため,全割込みロック状態から呼
2014び出すことができない関数を呼ばないように実装しなければならない.
2015
2016本関数を無限ループで実装する際は,以下の形式とすること(TECSのパーサの
2017制限に合わせるため).
2018
2019void
2020target_exit( void )
2021{
2022
2023 /*
2024 * ターゲット依存の処理
2025 */
2026
2027
2028 while (true)
2029 {
2030 }
2031}
2032
2033
20346.9 カーネル内部のチューニング
2035
20366.9.1 ビットマップサーチ
2037
2038(6-9-1-1) OMIT_BITMAP_SEARCH(オプション)
2039(6-9-1-2) uint_t bitmap_search(uint16_t bitmap)(オプション)
2040
2041ターゲット非依存部で,uint16_t型の整数値(bitmap)中の1のビットの内,最
2042も下位(右)のものをサーチし,そのビット番号を返す関数bitmap_searchを用
2043意している.ここで,ビット番号は最下位ビットを0とし,bitmapに0を指定し
2044てはならないものとしている.
2045
2046ビットサーチ命令を持つプロセッサでは,bitmap_searchを,ビットサーチ命令
2047を使うように書き直した方が効率が良い場合がある.このような場合には,ター
2048ゲット依存部でビットサーチ命令を使ったbitmap_searchを定義し,
2049OMIT_BITMAP_SEARCHをマクロ定義する.
2050
2051標準ライブラリにビットサーチ命令を用いたffsがある場合,bitmap_searchを
2052(ffs(bitmap) - 1)に定義するとよい.
2053
2054(6-9-1-3) uint16_t PRIMAP_BIT(PRI pri)(オプション)
2055
2056ビットサーチ命令のサーチ方向が逆などの理由で,優先度とビットとの対応を
2057変更したい場合には,PRIMAP_BITをマクロ定義する.
2058
20596.10 カーネル実装に関するその他の定義
2060
20616.10.1 非タスクコンテキスト用のスタック領域
2062
2063(6-10-1-1) DEFAULT_ISTKSZ
2064
2065DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の,
2066デフォルトのスタック領域のサイズ.
2067
2068
2069(6-10-1-2) DEFAULT_ISTK(オプション)
2070
2071DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の,
2072デフォルトのスタック領域の先頭番地.このマクロが定義されない場合には,
2073サイズがDEFAULT_ISTKSZのスタック領域が,配列により確保される.
2074
2075(6-10-1-3) STK_T *TOPPERS_ISTKPT(STK_T *istk, SIZE istksz)(オプション)
2076
2077非タスクコンテキスト用のスタックポインタの初期値を保持する変数(istkpt)
2078を用いる場合に,このシンボルに,スタック領域の先頭番地(istk)とスタッ
2079ク領域のサイズ(istksz)から,スタックポインタの初期値を求めるマクロを
2080定義する.
2081
20826.10.2 空ラベルの定義
2083
2084(6-10-2-1) TOPPERS_EMPTY_LABEL(type, symbol)(オプション)
2085
2086リンクエラーを防ぐために,データ型typeの配列である変数symbolに定義を与
2087えるためのマクロ.与えた定義が参照されることはないため,どのような定義
2088を与えてもよい.
2089
2090デフォルトでは,symbolを,要素型がtypeでサイズが0の配列に定義している.
2091サイズが0の配列がエラーとならないコンパイラ(GCCはこれに該当)を用いる
2092場合には,ターゲット依存部で定義する必要はない.
2093
20946.11 トレースログ機能に関する設定
2095
2096SSPカーネルのソースコードには,カーネルの実行トレースログを取得するため
2097のマクロ等が埋め込んである.デフォルトでは,これらのマクロは空に定義さ
2098れてトレースログの取得は行わないが,これらのマクロを適切に定義すること
2099でトレースログの取得を行うことができる.
2100
21016.11.1 取得できるトレースログの種類とマクロ
2102
2103取得できるトレースログの種類と,それを取得するために定義するマクロは次
2104の通りである.
2105
2106(a) カーネルの動作開始と終了
2107
2108次のマクロを定義することで,カーネルの動作開始時と終了時のトレースログ
2109を取得することができる.
2110
2111 LOG_KER_ENTER カーネルが動作を開始する直前(初期化の完了後)
2112 LOG_KER_LEAVE カーネルの終了(ext_ker)が呼ばれた直後(終了処
2113 理の実行前)
2114
2115(b) 処理単位の実行開始と終了
2116
2117次のマクロを定義することで,割込みハンドラ(INH),割込みサービスルーチ
2118ン(ISR),周期ハンドラ(CYC),アラームハンドラ(ALM),CPU例外ハンド
2119ラ(EXC),タスク例外処理ルーチン(TEX)の実行開始前と終了後のトレース
2120ログを取得することができる.
2121
2122 LOG_<処理単位略号>_ENTER 処理単位の実行開始直前
2123 LOG_<処理単位略号>_LEAVE 処理単位の終了直後
2124
2125割込みハンドラは,アプリケーションが登録したもののみを対象とし,割込み
2126サービスルーチンを呼び出すためにカーネル内に生成されるものは対象としな
2127い.タスクの実行開始と終了は,他の方法で取得できるため,この方法は用意
2128していない.
2129
2130なお,割込みハンドラとCPU例外ハンドラの実行開始と終了のトレースログ取得
2131は,ターゲット依存部で実装する必要がある.詳しくは,「6.2 トレースログ
2132機能への対応」「6.6.1 割込みハンドラの出入口処理」「6.7.2 CPU例外ハンド
2133ラの出入口処理」の節を参照すること.
2134
2135(c) タスク状態の変化
2136
2137次のマクロを定義することで,タスク状態が変化した時のトレースログを取得
2138することができる.ただし,実行状態と実行可能状態の間の遷移は,他の方法
2139で取得できるため,このマクロでは取得できない.
2140
2141 LOG_TSKSTAT タスク状態の変化
2142
2143(d) ディスパッチャの実行開始と終了
2144
2145次のマクロを定義することで,ディスパッチャが実行開始する時と,終了する
2146時のトレースログを取得することができる.
2147
2148 LOG_DSP_ENTER ディスパッチャの実行開始
2149 LOG_DSP_LEAVE ディスパッチャの終了
2150
2151ディスパッチャの実行開始は,タスクが実行状態から実行可能状態に遷移する
2152タイミングであるため,実行可能状態へ遷移するタスクのTCBへのポインタをパ
2153ラメータとする.逆に,ディスパッチャの終了は,タスクが実行可能状態から
2154実行状態に遷移するタイミングであるため,実行状態へ遷移するタスクのTCBへ
2155のポインタをパラメータとする.
2156
2157SSPカーネルでは,実行できるタスクがなく,カーネルがアイドル状態になる場
2158合には,ディスパッチャの中に留まる.そのため,アイドル状態への遷移とア
2159イドル状態から他の状態への遷移は,このマクロでは取得できない.
2160
2161なお,ディスパッチャの実行開始と終了のトレースログ取得は,ターゲット依
2162存部で実装する必要がある.詳しくは,と「6.5.2 ディスパッチャ本体」の節を
2163参照すること.
2164
2165(e) サービスコールの入口と出口
2166
2167次のマクロを定義することで,各サービスコールの入口と出口のトレースログ
2168を取得することができる.
2169
2170 LOG_<サービスコールの大文字表記>_ENTER サービスコール名の入口
2171 LOG_<サービスコールの大文字表記>_LEAVE サービスコール名の出口
2172
2173それぞれのマクロの名称やパラメータの詳細については,カーネルのソースコー
2174ドを参照すること.
2175
21766.12 カーネル実装のターゲット依存部のためのリネーム記述
2177
2178カーネル内部に閉じて使われる関数や変数などの名称で,オブジェクトファイ
2179ルのシンボル表に登録されて外部から参照できる名称は,C言語レベルで,先頭
2180が"_kernel_"または"_KERNEL_"である名称としなければならないが,SSPカーネ
2181ルでは,ソースコードをコンパクトに保ちつつこれを実現するために,リネー
2182ム記述ファイルを導入している.
2183
2184具体的には,リネームすべき名称をリストアップしたxxx_rename.defを用意し,
2185このファイルからツール(utils/genrename)により,名称をリネームするため
2186のマクロ定義を含むxxx_rename.hと,それらのマクロ定義を解除するための
2187xxx_unrename.hを生成する.ツールの起動方法は次の通りである.
2188
2189 % genrename xxx
2190
2191xxx_rename.defには,リネームすべき名称を1行に1つ記述する.xxxxという名
2192称が記述されている場合,xxx_rename.hには次のような記述が生成される.
2193
2194#define xxxx _kernel_xxxx
2195#ifdef TOPPERS_LABEL_ASM
2196#define _xxxx __kernel_xxxx
2197#endif /* TOPPERS_LABEL_ASM */
2198
2199また,xxx_unrename.hには次のような記述が生成される.
2200
2201#undef xxxx
2202#ifdef TOPPERS_LABEL_ASM
2203#undef _xxxx
2204#endif /* TOPPERS_LABEL_ASM */
2205
2206xxx_rename.defの中には,他のリネーム記述を取り込むために,「INCLUDE
2207"yyy"」または「INCLUDE <yyy>」という記述を含めることができる.この記述
2208がされている場合,xxx_rename.hには「#include "yyy_rename.h"」または
2209「#include <yyy_rename.h>」という記述が,xxx_unrename.hには「#include
2210"yyy_unrename.h"」または「#include <yyy_unrename.h>」という記述が生成さ
2211れる.
2212
2213xxx_rename.defの中の"#"で始まる行はコメントとして読み飛ばされる.また,
2214空行も無視される.
2215
2216カーネルのターゲット非依存部で使われる名称をリネームするために,kernel
2217ディレクトリに,kernel_rename.defと,そこから生成したkernel_rename.hお
2218よびkernel_unrename.hが用意されている.kernel_rename.defには,
2219「INCLUDE "target"」という記述が含まれており,ターゲット依存部のリネー
2220ム記述を取り込むようになっている.ターゲット依存部で定義し,ターゲット
2221非依存部で参照される名称は,ターゲット依存部のリネーム記述に含める.
2222
2223ターゲット依存部では,ターゲット依存部で使われる名称をリネームするため
2224に,target_rename.defと,そこから生成したtarget_rename.hおよび
2225target_unrename.hを用意する.ターゲット依存部からプロセッサ・チップ・開
2226発環境依存部を切り分ける場合には,target_rename.defにINCLUDE記述を入れ,
2227プロセッサ・チップ・開発環境依存部のリネーム記述を取り込むようにする.
2228
22296.13 タイマドライバ
2230
2231タイマドライバは,カーネルにタイムティックを通知するためのタイマドライ
2232バである.
2233
22346.13.1 タイマドライバのファイル構成
2235
2236タイマドライバを組み込むための静的APIを記述したシステムコンフィギュレー
2237ションファイルを,target_timer.cfgに用意する.このファイルには,タイマ
2238ドライバを初期化するための初期化ルーチンの追加,タイマドライバを終了さ
2239せるための終了処理ルーチンの追加,タイマ割込みのための割込みハンドラの
2240定義(または,割込みサービスルーチンの追加),タイマ割込みのための割込
2241み要求ラインの属性の設定の静的APIなどを含むことになる.
2242
2243タイマドライバを呼び出すために必要な定義を含むヘッダファイルを,
2244target_timer.hに用意する.また,タイマドライバの実装ファイルを
2245target_timer.cに用意する.
2246
2247タイムティックの通知により行う処理の多くは,タスクの起動や待ち解除を行
2248うものであるため,タイマ割込みの割込み優先度は,割込みの中で最低の優先
2249度で十分である.ただし,周期ハンドラやアラームハンドラの実行開始遅れが
2250問題になる場合には,タイマ割込みの割込み優先度をより高い値に設定したい.
2251そこで,タイマ割込みの割込み優先度を変更する方法を,ターゲット依存部の
2252ユーザーズマニュアルに記載すべきである.
2253
22546.13.2 タイマの初期化・終了処理・割込み処理
2255
2256(6-13-2-1) void target_timer_initialize(intptr_t exinf)
2257
2258タイマを初期化し,タイマ割込みを周期的に発生させる関数.タイマ割込みの
2259周期は,TIC_NUMEとTIC_DENOで指定された時間と一致させる(「5.3 タイム
2260ティックの定義」の節を参照).
2261
2262この関数は,target_timer.cfg中に記述する静的APIにより,初期化ルーチンと
2263してカーネルに登録することを想定している.
2264
2265(6-13-2-2) void target_timer_terminate(intptr_t exinf)
2266
2267タイマの動作を停止させ,タイマ割込みを発生しないようにする関数.
2268
2269この関数は,target_timer.cfg中に記述する静的APIにより,終了処理ルーチン
2270としてカーネルに登録することを想定している.
2271
2272(6-13-2-3) void target_timer_handler(void)
2273 または void target_timer_isr(intptr_t exinf)
2274
2275タイマ割込みにより起動される割込み処理プログラム.割込みハンドラとして
2276実現する場合にはtarget_timer_handler,割込みサービスルーチンとして実現
2277する場合にはtarget_timer_isrの名称とする.ターゲット非依存部の
2278signal_timeを呼び出す.
2279
2280target_timer_handlerは,標準的には次のように定義する.
2281
2282----------------------------------------
2283void
2284target_timer_handler(void)
2285{
2286 i_begin_int(<タイマ割込みの割込み番号>);
2287 signal_time();
2288 i_end_int(<タイマ割込みの割込み番号>);
2289}
2290----------------------------------------
2291
2292この関数は,target_timer.cfg中に記述する静的APIにより,割込みハンドラま
2293たは割込みサービスルーチンとしてカーネルに登録することを想定している.
2294
22956.13.3 性能評価用システム時刻の参照のための機能
2296
2297性能評価用システム時刻の参照機能(get_utm)をサポートする場合には,タイ
2298マドライバで,以下のデータ型や関数などを用意する.
2299
2300(6-13-3-1) CLOCK
2301
2302タイマ値の内部表現のためのデータ型.
2303
2304(6-13-3-2) CLOCK target_timer_get_current(void)
2305
2306タイマの現在値を読み出し,内部表現で返す関数.タイマ値は,時間の経過と
2307ともに増加することを想定している.ハードウェアのタイマが,タイマ値が減
2308少するものである場合には,この関数内で増加する値となるように変換する.
2309
2310(6-13-3-3) bool_t target_timer_probe_int(void)
2311
2312タイマ割込み要求をチェックする関数.タイマ割込みが要求されている場合に
2313true,要求されていない場合にfalseを返す.
2314
2315(6-13-3-4) TO_USEC(clock)
2316
2317タイマ値の内部表現を,1μ秒単位に変換するためのマクロ(または関数).
2318targettimer_get_currentで読み出した値を,タイマ割込み発生からの経過時間
2319(単位: 1μ秒)に変換するために用いる.
2320
23217. コンフィギュレータ設定ファイルのターゲット依存部
2322
23237.1 設定ファイルとターゲット依存部の位置付け
2324
2325SSPカーネルのコンフィギュレータは,設定ファイルの記述に従ってファイルの
2326生成およびエラーチェックを行う.コンフィギュレータの設定ファイルには,
2327以下の4つがある.
2328
2329(a) 静的APIテーブル
2330
2331静的APIの一覧と,各静的APIのパラメータについて記述したファイル.静的
2332APIを拡張する場合以外は変更する必要がないため,ターゲット非依存部で用意
2333している(kernel/kernel_api.csv).
2334
2335(b) 値取得シンボルテーブル
2336
2337コンフィギュレータのパス1において,パラメータ計算用C言語ファイルに出力
2338し,値を求めたいシンボル(一般には式)を記述するためのファイル.ターゲッ
2339ト非依存部では,ターゲットに依存せずに必要となるシンボルを記述したファ
2340イルを用意している(kernel/kernel_def.csv).
2341
2342ターゲットに依存して必要となるシンボルがある場合には,targetディレクト
2343リに置かれたtarget_def.csv中に記述する.target_def.csv中に記述して値を
2344求めることができるシンボルは,kernel/kernel_int.hおよびそこからインクルー
2345ドされるファイルで定義されていなければならない.kernel_int.hからは,
2346target_stddef.h,target_kernel.h,target_config.hを(間接的に)インクルー
2347ドしているため,これらのファイルおよびそこからインクルードされるファイ
2348ルで定義されるターゲット依存のシンボルは,target_def.csv中に記述するこ
2349とができる.
2350
2351ここで値を求めたシンボルの値は,コンフィギュレータのパス2およびパス3の
2352テンプレートファイル中で参照することができる.
2353
2354(c) パス2のテンプレートファイル
2355
2356コンフィギュレータのパス2は,テンプレートファイルに従って,カーネルの構
2357成・初期化ファイル(kernel_cfg.c),構成・初期化ヘッダファイル
2358(kernel_cfg.h)などを生成する.このテンプレートファイルは,ターゲット
2359非依存部とターゲット依存部に切り分けてあるが,他のファイルのターゲット
2360依存部とは逆に,ターゲット依存部からターゲット非依存部をインクルードす
2361る形になっている.
2362
2363具体的には,targetディレクトリに置かれたtarget.tfで,必要な変数を定義し
2364た後,テンプレートファイルのターゲット非依存部(kernel/kernel.tf)をイ
2365ンクルードする.kernel.tfでは,カーネルのターゲット非依存部で使用する変
2366数定義等を生成する.kernel.tfをインクルードした後,target.tfでは,カー
2367ネルのターゲット依存部で使用する変数定義等を生成する.target.tfから,プ
2368ロセッサ依存部,チップ依存部を,開発環境依存部を切り分けてもよい.
2369
2370(d) パス3のテンプレートファイル
2371
2372コンフィギュレータのパス3は,テンプレートファイルに従って,静的APIの一
2373般定数式パラメータのチェックを行う.このテンプレートファイルも,ターゲッ
2374ト非依存部とターゲット依存部に切り分けてあり,ターゲット依存部からター
2375ゲット非依存部をインクルードする形になっている.
2376
2377具体的には,targetディレクトリに置かれたtarget_check.tfで,必要な変数を
2378定義した後,テンプレートファイルのターゲット非依存部
2379(kernel/kernel_check.tf)をインクルードする.kernel_check.tfでは,カー
2380ネルのターゲット非依存部で初期化ブロックに出力した一般定数式パラメータ
2381のチェックを行う.kernel_check.tfをインクルードした後,target_check.tf
2382では,ターゲットに依存するチェックを行う.target_check.tfから,プロセッ
2383サ依存部,チップ依存部を,開発環境依存部を切り分けてもよい.
2384
2385なお,コンフィギュレータの詳細仕様と設定ファイルの記述方法については,
2386別途PDFファイルの形で配布している「TOPPERS新世代カーネル用コンフィギュ
2387レータ仕様」および「TOPPERS新世代カーネル用コンフィギュレータ内蔵マクロ
2388プロセッサ仕様」を参照すること.
2389
23907.2 パス2のテンプレートファイルのターゲット依存部
2391
2392以下では,パス2のテンプレートファイルのターゲット依存部を記述する上で必
2393要な事項について説明する.
2394
23957.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
2396
2397target.tfからkernel.tfをインクルードする前に,次の変数を定義しておかな
2398ければならない.
2399
2400(7-2-1) INTNO_ATTISR_VALID ATT_ISRで使用できる割込み番号
2401(7-2-2) INHNO_ATTISR_VALID INTNO_ATTISR_VALIDに対応する割込ハンドラ番号
2402(7-2-3) INHNO_DEFINH_VALID DEF_INTで使用できる割込みハンドラ番号
2403(7-2-4) EXCNO_DEFEXC_VALID DEF_EXCで使用できるCPU例外ハンドラ番号
2404(7-2-5) INTNO_CFGINT_VALID CFG_INTで使用できる割込み番号
2405(7-2-6) INTPRI_CFGINT_VALID CFG_INTで使用できる割込み優先度
2406
2407APIで使用できる割込み番号/割込みハンドラ番号/CPU例外ハンドラ番号/割
2408込み優先度のリストを,各変数に定義する.INHNO_ATTISR_VALIDには,
2409INTNO_ATTISR_VALIDにリストアップした割込み番号に対応する割込みハンドラ
2410番号のリストを定義する.
2411
2412(7-2-7) TARGET_TSKATR(オプション) ターゲット定義のタスク属性
2413(7-2-8) TARGET_ISRATR(オプション) ターゲット定義のISR属性
2414(7-2-9) TARGET_INHATR(オプション) ターゲット定義の割込みハンドラ属性
2415(7-2-10) TARGET_INTATR(オプション) ターゲット定義の割込み属性
2416(7-2-11) TARGET_EXCATR(オプション) ターゲット定義のCPU例外ハンドラ属性
2417
2418各オブジェクトの属性を,ターゲット定義に拡張する場合に,該当するオブジェ
2419クト属性を示す変数に,拡張に使用するビットの論理和を定義する.これによ
2420り,拡張に使用するビットが設定されている場合に,エラーになるのを防ぐ.
2421
2422(7-2-12) INTNO_FIX_KERNEL(オプション) カーネル管理に固定されている
2423 割込み番号
2424(7-2-13) INHNO_FIX_KERNEL(オプション) カーネル管理に固定されている
2425 割込みハンドラ番号
2426(7-2-14) INHNO_FIX_NONKERNEL(オプション) カーネル管理外に固定されている
2427 割込み番号
2428(7-2-15) INHNO_FIX_NONKERNEL(オプション) カーネル管理外に固定されている
2429 割込みハンドラ番号
2430
2431カーネル管理またはカーネル管理外に固定されている割込みがある場合には,
2432それらの割込み番号と割込みハンドラ番号のリストを,各変数に定義する.
2433
2434(7-2-16) USE_INHINIB_TABLE(オプション)
2435
2436OMIT_INITIALIZE_INTERRUPTを定義したが,割込みハンドラの初期化に必要な情
2437報をkernel_cfg.cに生成したい場合には,この変数を1に設定する.具体的には,
2438TNUM_INHNO,tnum_inhno,inhinib_tableの定義と,割込みハンドラ毎の出入口
2439処理を生成するための記述(INTHDR_ENTRYマクロのリスト)が,ターゲット非
2440依存部によって生成される.
2441
2442(7-2-17) USE_INTINIB_TABLE(オプション)
2443
2444OMIT_INITIALIZE_INTERRUPTを定義したが,割込み要求ラインの初期化に必要な
2445情報をkernel_cfg.cに生成したい場合には,この変数を1に設定する.具体的に
2446は,TNUM_INTNO,tnum_intno,intinib_tableの定義が,ターゲット非依存部に
2447よって生成される.
2448
2449(7-2-18) TARGET_MIN_STKSZ(オプション)
2450
2451ターゲット定義で,タスクのスタックサイズの最小値を設定する場合には,こ
2452の変数をスタックサイズの最小値に定義する.
2453
2454(7-2-19) CHECK_STKSZ_ALIGN(オプション)
2455
2456スタック領域のサイズがある値の倍数でなければならない場合に,この変数を
2457その値に定義する.この変数を定義することで,kernel.tfにおいて,スタック
2458領域のサイズが正しくない(この変数に定義した値の倍数でない)場合のエラー
2459をチェックするようになる.チェックが必要ない場合には,この変数を定義し
2460ない.
2461
24627.2.2 ターゲット非依存部で定義される変数
2463
2464kernel.tfの中では次の変数が定義されるため,kernel.tfをインクルードした
2465後,target.tfの中でこれらを参照することができる.
2466
2467(7-2-1) INTNO[inhno] inhnoを対応するintnoに変換するための連想配列
2468(7-2-2) INHNO[intno] intnoを対応するinhnoに変換するための連想配列
2469
24707.3 パス3のテンプレートファイルのターゲット依存部
2471
2472以下では,パス3のテンプレートファイルのターゲット依存部を記述する上で必
2473要な事項について説明する.
2474
2475target_check.tfからkernel_check.tfをインクルードする前に,必要に応じて,
2476次の変数を定義しておかなければならない.
2477
2478(7-3-1) CHECK_FUNC_ALIGN(オプション) 関数のアライン単位
2479(7-3-2) CHECK_FUNC_NONNULL(オプション)関数の非NULLチェック
2480(7-3-3) CHECK_STACK_ALIGN(オプション) スタック領域のアライン単位
2481(7-3-4) CHECK_STACK_NONNULL(オプション)スタック領域の非NULLチェック
2482(7-3-5) CHECK_MPF_ALIGN(オプション) 固定長メモリプール領域のアライン単位
2483(7-3-6) CHECK_MPF_NONNULL(オプション) 固定長メモリプール領域の非NULLチェック
2484
2485関数/スタック領域/固定長メモリプール領域の先頭番地のアラインメントの
2486チェックを行う場合には,それぞれ,CHECK_FUNC_ALIGN/CHECK_STACK_ALIGN/
2487CHECK_MPF_ALIGNをアライン単位に定義する.関数/スタック領域/固定長メモ
2488リプール領域の先頭番地がNULLでないかのチェックを行う場合には,それぞれ
2489CHECK_FUNC_NONNULL/CHECK_STACK_NONNULL/CHECK_MPF_NONNULLを1に定義する.
2490チェックが必要ない場合には,該当する変数を定義しない.
2491
24927.4 cfg1_out.cのリンクに必要なスタブの定義ファイル
2493
2494コンフィギュレータに関してターゲット依存に用意する必要があるファイルと
2495して,設定ファイル以外に,cfg1_out.cをリンクするために必要なスタブの定
2496義ファイルがある.
2497
2498コンフィギュレータのパス1では,静的APIの整数定数式パラメータの値をCコン
2499パイラを用いて求めるために,cfg1_out.cを生成する.これをコンパイル,リ
2500ンクしてオブジェクトファイルを生成する際に,スタートアップモジュールか
2501ら参照されるシンボルの定義を与える必要がある.
2502
2503この定義を与えるために,cfg1_out.cから,ターゲット依存部の
2504target_cfg1_out.hをインクルードしている.target_cfg1_out.h(または,そ
2505こからインクルードされるファイル)には,スタートアップモジュールから参
2506照されるシンボルのスタブの定義を含める.典型的には,以下のような定義を
2507含める必要がある.
2508
2509----------------------------------------
2510void sta_ker(void)
2511{
2512}
2513
2514void hardware_init_hook(void)
2515{
2516}
2517
2518void software_init_hook(void)
2519{
2520}
2521
2522const SIZE _kernel_istksz = 0;
2523
2524STK_T *const _kernel_istk = NULL;
2525----------------------------------------
2526
2527
25288. システムサービス等のターゲット依存部
2529
25308.1 システムサービスのターゲット依存部
2531
2532シリアルポート数やシステムログタスク関連の定数など,システムサービスの
2533構成を決定するための定義をtarget_syssvc.hまたはそこからインクルードされ
2534るファイル(プロセッサ・チップ・開発環境依存部で用意されるヘッダファイ
2535ルなど)に含める.
2536
2537なお,TOPPERS組込みコンポーネントシステムが導入されると,このファイルの
2538内容はコンポーネント記述ファイルに記述されることになり,このファイルは
2539無くなる(または,大幅に縮小される)見込みである.
2540
25418.2 システムログ機能のターゲット依存定義
2542
2543システムログ機能を使用する場合で,スタートアップモジュールでbssセクショ
2544ンのクリアを省略している場合には,syslog_logmaskとsyslog_lowmask_notを
25450に初期化するコードを追加する.これは,システムログ機能が初期化される前
2546に出力されたログ情報を,低レベル出力機能を用いて出力するためである.
2547
2548ターゲット依存部で提供すべきシステムログ機能のための定義は次の通りであ
2549る.
2550
2551(8-2-1) TCNT_SYSLOG_BUFFER
2552
2553システムログ機能のログバッファのサイズを定義するマクロ.定義しない場合
2554のデフォルト値は32.
2555
2556(8-2-2) void target_fput_log(char c)
2557
2558システムログの低レベル出力のための文字出力関数.ターゲット依存の方法で,
2559文字cを表示/出力/保存する.
2560
2561この関数は,リエントラントに実装しなければならない.この関数内で排他制
2562御が必要な場合には,SILを用いて全割込みロック状態にすること.また,全割
2563込みロック状態で呼ばれる場合があるため,全割込みロック状態から呼び出す
2564ことができない関数を呼ばないように実装しなければならない.
2565
2566低レベル出力をシリアルポート経由で行う場合で,シリアルインタフェースド
2567ライバとポートを共用しないことが望ましいが,ポート数が足りないためにや
2568むをえず共用する場合には,両者が競合しないように注意が必要である.具体
2569的には,両者が同じ設定でシリアルI/Oデバイスを使うようにし,シリアルイン
2570タフェースドライバの動作中に低レベル出力が行われても差し支えないように
2571設計する.また,低レベル出力が動作開始後にシリアルインタフェースドライ
2572バがシリアルI/Oデバイスを初期化すると,文字化けが起こる可能性があるため,
2573共用するポートは,低レベル出力機能側で初期化し,シリアルインタフェース
2574ドライバでは初期化しないようにするとよい.
2575
2576なお,この関数の本体を,どのファイルに記述するかが問題になる.システム
2577サービスのターゲット依存部には,標準では,関数定義を記述するためのファ
2578イルを用意していない.ターゲット依存で用意してもよいが,例外的に,カー
2579ネル実装のターゲット依存モジュール(target_config.c)に記述してもよい.
2580この場合,target_fput_logを,リネーム記述(target_rename.defなど)に含
2581めてはならない.
2582
25838.3 ログタスクのターゲット依存定義
2584
2585ターゲット依存部で提供すべきログタスクのための定義は次の通りである.こ
2586れらの定義は,target_syssvc.hまたはそこからインクルードされるファイルに
2587含める.
2588
2589(8-3-1) LOGTASK_PRIORITY(オプション)
2590
2591ログタスクの優先度を定義するマクロ.定義しない場合のデフォルト値は3.
2592
2593(8-3-2) LOGTASK_STACK_SIZE(オプション)
2594
2595ログタスクのスタックサイズを定義するマクロ.定義しない場合のデフォルト
2596値は1024.
2597
2598(8-3-3) LOGTASK_PORTID(オプション)
2599
2600ログタスクの出力先のシリアルポート番号.定義しない場合のデフォルト値は1.
2601
2602(8-3-4) LOGTASK_INTERVAL(オプション)
2603
2604ログタスクの動作間隔(単位はミリ秒).定義しない場合のデフォルト値は10.
2605
2606(8-3-5) LOGTASK_FLUSH_WAIT(オプション)
2607
2608ログ出力を待ち合わせる処理において,タスクを待たせる単位となる時間(単
2609位はミリ秒).定義しない場合のデフォルト値は1.
2610
26118.4 シリアルインタフェースドライバのターゲット依存部
2612
2613ターゲット依存部で提供すべきシリアルインタフェースドライバのための定義
2614は次の通りである.これらの定義は,別に指定がない限り,target_serial.hま
2615たはそこからインクルードされるファイルに含め,必要なコンフィギュレーショ
2616ン情報をtarget_serial.cfgに記述する.関数の実体が必要な場合には,
2617target_serial.c等のファイルを用意する.
2618
2619シリアルインタフェースドライバの中で,ターゲットのシリアルI/Oデバイスに
2620依存する部分を,シリアルI/Oデバイスドライバと呼ぶ.シリアルI/Oデバイス
2621ドライバは,おおよそ,ITRONデバイスドライバ設計ガイドラインのPDICに相当
2622する.PDICに相当するファイルで,他のシステムにも共通に使える可能性があ
2623る場合には,pdicディレクトリに置く.
2624
26258.4.1 変数,データ型,管理関数
2626
2627(8-4-1) TNUM_PORT
2628
2629シリアルインタフェースドライバがサポートするシリアルポート数を定義する
2630マクロ.このマクロの定義は,target_syssvc.hまたはそこからインクルードさ
2631れるファイルに含める.
2632
2633(8-4-2) void sio_initialize(intptr_t exinf)(オプション)
2634
2635シリアルI/Oデバイスドライバの初期化処理.target_serial.cfgに,この関数
2636を初期化ルーチンとして登録する静的APIを含める.
2637
2638(8-4-3) void sio_terminate(intptr_t exinf)(オプション)
2639
2640シリアルI/Oデバイスドライバの終了処理.target_serial.cfgに,この関数を
2641終了処理ルーチンとして登録する静的APIを含める.
2642
2643(8-4-4) void sio_isr(intptr_t exinf)
2644
2645シリアルI/Oデバイスの割込みサービスルーチン.target_serial.cfgに,この
2646関数を割込みサービスルーチンとして登録する静的APIを含める.また,その静
2647的APIに必要なシリアルI/Oデバイスの割込み番号などは,target_serial.hでマ
2648クロ定義する.割込みサービスルーチンではなく,割込みハンドラとすること
2649もできる.
2650
2651(8-4-5) SIOPCB
2652
2653シリアルI/Oポート管理ブロックのデータ型(target_serial.hには,データ型
2654の宣言だけ含まれていればよい).
2655
2656(8-4-6) SIO_RDY_SNDとSIO_RDY_RCV
2657
2658送信可能コールバックの識別番号をSIO_RDY_SNDに,受信通知コールバックの識
2659別番号をSIO_RDY_RCVにマクロ定義する.コールバックの禁止/許可を行なうサー
2660ビスコール(sio_ena_cbrとsio_dis_cbr)で用いる.
2661
26628.4.2 デバイスサービスルーチン
2663
2664以下のデバイスサービルルーチンは,(少なくとも)シリアルI/Oポートからの
2665割込みがマスクされた状態で呼び出される.また,タスクコンテキスト,非タ
2666スクコンテキストのいずれで呼び出される場合もある(いずれで呼び出されて
2667も動作するようにしなければならない).
2668
2669(8-4-2-1) SIOPCB *sio_opn_por(ID siopid, intptr_t exinf)
2670
2671siopidで指定されるシリアルI/Oポートをオープンする関数.exinfはシリアル
2672I/Oポートに対する拡張情報で,コールバックを呼ぶ時にポートを区別するた
2673めに渡す.
2674
2675(8-4-2-2) void sio_cls_por(SIOPCB *siopcb)
2676
2677siopcbで指定されるシリアルI/Oポートをクローズする関数.
2678
2679(8-4-2-3) bool_t sio_snd_chr(SIOPCB *siopcb, char c)
2680
2681siopcbで指定されるシリアルI/Oポートに,cで示される文字を送信する関数.
2682文字を送信レジスタに入れた場合にはtrueを,前に送信した文字の送信が終わっ
2683ていないために,文字を送信レジスタに入れられなかった場合にはfalseを返す.
2684
2685(8-4-2-4) int_t sio_rcv_chr(SIOPCB *siopcb)
2686
2687siopcbで指定されるシリアルI/Oポートから文字を読む関数.文字を受信してい
2688た場合,読んだ文字のコードは正の値として返し,文字を受信していない場合
2689には-1を返す.
2690
2691(8-4-2-5) void sio_ena_cbr(SIOPCB *siopcb, uint_t cbrtn)
2692
2693siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ
2694クを許可する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる.
2695
2696(8-4-2-6) void sio_dis_cbr(SIOPCB *siopcb, uint_t cbrtn)
2697
2698siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ
2699クを禁止する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる.
2700
27018.4.3 コールバックルーチン
2702
2703ターゲット依存部は,必要なタイミングで,シリアルインタフェースドライバ
2704のターゲット非依存部に含まれる以下のコールバックルーチンを呼び出びださ
2705なければならない.ただし,それぞれのコールバックが禁止されている時は,
2706コールバックルーチンを呼び出してはならない.
2707
2708コールバックルーチンは,(少なくとも)シリアルI/Oポートからの割込みが禁
2709止された状態で,非タスクコンテキストで呼び出す.exinfには,シリアルI/O
2710ポートのオープン時に指定された拡張情報を渡す.
2711
2712(8-4-3-1) void sio_irdy_snd(intptr_t exinf)
2713
2714送信可能コールバックルーチン.シリアルI/Oポートに対して文字が送信できる
2715状態になった場合に呼び出す.シリアルインタフェースドライバは,このコー
2716ルバックルーチンの中で,sio_snd_chrを呼び出して次の文字を送信するか,送
2717信すべき文字がない場合には送信可能コールバックを禁止する.
2718
2719(8-4-3-2) void sio_irdy_rcv(intptr_t exinf)
2720
2721受信通知コールバックルーチン.シリアルI/Oポートから文字を受信した場合に
2722呼び出す.シリアルインタフェースドライバは,このコールバックルーチンの
2723中で,必ずsio_rcv_chrを呼び出して受信した文字を取り出す.
2724
27258.5 カーネル起動メッセージの出力のターゲット依存定義
2726
2727ターゲット依存部で提供すべきカーネル起動メッセージの出力のための定義は
2728次の通りである.
2729
2730(8-5-1) TARGET_NAME
2731
2732ターゲットの名称に定義する.
2733
2734(8-5-2) TARGET_COPYRIGHT(オプション)
2735
2736カーネル起動メッセージに,ターゲット依存部の著作権表示を追加するための
2737マクロ.デフォルトでは,ターゲット依存部の著作権表示を追加しない.
2738
27398.6 サンプルプログラムとテストプログラムのターゲット依存定義
2740
2741ターゲット依存部で提供すべきサンプルプログラムおよびテストプログラムの
2742ための定義は次の通りである.これらの定義は,target_test.h(またはそれら
2743からインクルードされるファイル)に含める.
2744
2745(8-6-1) STACK_SIZE(オプション)
2746
2747サンプルプログラムおよびテストプログラムのタスクのスタックサイズを定義
2748するマクロ.定義しない場合のデフォルト値は4096.デフォルト設定ではメモ
2749リが不足する場合や,シミュレーション環境などで大きいスタック領域が必要
2750な場合には,ターゲット依存部でこのマクロを設定するスタックサイズに定義
2751する.
2752
2753(8-6-2) CPUEXC1(オプション)
2754
2755サンプルプログラムおよびテストプログラムで用いるCPU例外のCPU例外ハンド
2756ラ番号を定義するマクロ.このマクロを定義しない場合,CPU例外ハンドラを使
2757う部分がサンプルプログラムから除外される.CPU例外ハンドラのテストをする
2758テストプログラムはコンパイルできない.
2759
2760(8-6-3) RAISE_CPU_EXCEPTION(オプション)
2761
2762CPUEXC1に定義したCPU例外を発生させるC言語のプログラムを定義するマクロ.
2763CPUEXC1を定義した場合には必ず定義しなければならない.
2764
2765(8-6-4) CANNOT_RETURN_CPUEXC(オプション)
2766
2767ターゲットシステムの制約により,CPU例外ハンドラからリターンした後に,タ
2768スクの実行を継続できない場合に定義するマクロ.このマクロを定義すると,
2769CPU例外ハンドラのテストをするテストプログラムから,CPU例外ハンドラから
2770リターンした後の処理が除外される.サンプルプログラムの該当部分は正しく
2771動作しない.
2772
2773(8-6-5) TASK_PORTID(オプション)
2774
2775サンプルプログラムにおいて,コマンド文字を読み込むシリアルポート番号を
2776定義するマクロ.定義しない場合のデフォルト値は1.
2777
2778(8-6-6) LOOP_REF(オプション)
2779
2780サンプルプログラムにおいて,プロセッサの速度を計測するためのループ回数
2781を定義するマクロ.定義しない場合のデフォルト値は1000000.デフォルト設定
2782では,値が大き過ぎて計測に時間がかかりすぎる場合や,値が小さ過ぎて計測
2783結果が安定しない場合に,ターゲット依存部でこのマクロを設定するループ回
2784数に定義する.
2785
2786(8-6-7) MEASURE_TWICE(オプション)
2787
2788サンプルプログラムにおいて,プロセッサの速度を2度計測する場合に定義する
2789マクロ.シミュレーション環境などプロセッサの速度が変動する環境で,1度の
2790計測では計測結果が安定しない場合に定義する.
2791
2792(8-6-8) TASK_LOOP(オプション)
2793
2794サンプルプログラムにおいて,プロセッサの速度を計測せずに,タスク内での
2795ループ回数を固定する場合に,ループ回数を定義するマクロ.ループ全体の実
2796行時間が0.4秒程度になるようなループ回数を,このマクロに定義する.
2797
27989. その他
2799
28009.1 ドキュメント
2801
2802ターゲット依存部のユーザーズマニュアルを,target_user.txtに用意する.プ
2803ロセッサ・チップ・開発環境依存部のユーザーズマニュアルを切り分けてもよ
2804いし,ファイルが大きくなる場合には複数のファイルに分割してよいが,その
2805場合には,target_user.txt中にそれらのファイル名を記述すること.
2806
2807ターゲット依存部のユーザーズマニュアルには,少なくとも次のような内容を
2808記述することが望ましい.
2809
2810(1) 対応しているターゲットシステムの種類・構成,バージョン番号
2811 ・ターゲットハードウェア(ボード等)の名称と対応している構成
2812 ・ターゲット略称
2813 ・ターゲット非依存部のバージョン番号
2814 ・プロセッサ,チップ,開発環境依存部の構成とバージョン番号
2815 ・使用するPDICとバージョン番号
2816
2817(2) 使用する開発環境と動作検証した条件(バージョン,オプション等)
2818 ・言語処理系(コンパイラ,アセンブラ,リンカ等)
2819 ・デバッグ環境
2820
2821(3) ターゲット定義事項の規定
2822
2823(3-1) データ型に関する規定
2824 ・int_t型,long_t型のサイズ
2825 ・char型,int_least8_t型,void *型,intptr_t型のサイズ
2826 ・int8_t型,uint8_t型,int64_t型,uint64_t型,int128_t型,
2827  uint128_t型,float32_t型,double64_t型のサポートの有無
2828
2829(3-2) 割込み処理に関する規定
2830 ・割込みハンドラ番号と割込み番号の割当て,両者の対応
2831 ・割込み優先度の段階数(TMIN_INTPRIの値)
2832 ・dis_intとena_intのサポートの有無,その制限事項
2833 ・CFG_INTの制限事項と拡張(ターゲット定義で使用できる割込み属性)
2834 ・TOPPERS標準割込み処理モデルからのその他の逸脱
2835
2836(3-3) カーネル管理外の割込みに関する規定
2837 ・TMIN_INTPRIは固定か設定できるか,その設定方法
2838 ・NMI以外にカーネル管理外の割込みを設けるか(設けられるようにするか)
2839 ・カーネル管理外の割込みの設定方法
2840 ・カーネル管理外の割込みに対してDEF_INH,CFG_INTをサポートするか
2841 ・カーネル管理外の割込みハンドラが実行開始される時のシステム状態と
2842  コンテキスト
2843 ・割込みハンドラの終了時に行われる処理
2844 ・カーネル管理外の割込みハンドラの記述方法
2845 ・カーネル内の割込み出入口処理で起こる可能性のあるCPU例外
2846
2847(3-4) CPU例外処理に関する規定
2848 ・CPU例外ハンドラ番号の割当て
2849 ・割込み優先度マスクをTMIN_INTPRIと同じかそれよりも高い値に設定して
2850  いる状態で発生したCPU例外を,カーネル管理外のCPU例外と扱うか
2851 ・カーネル内のCPU例外出入口処理で起こる可能性のあるCPU例外
2852
2853(3-5) 性能評価用システム時刻の参照に関する規定
2854 ・get_utmのサポートの有無,その制限事項
2855
2856(3-6) その他
2857 ・その他の制限事項
2858 ・その他の拡張機能
2859
2860(4) カーネルの起動/終了処理に関する情報
2861 ・用意しているスタートアップモジュールの処理内容
2862 ・スタートアップモジュールからhardware_init_hookを呼び出している場
2863  合には,hardware_init_hookをアプリケーションで用意する場合の作成
2864  方法や制限事項など
2865 ・カーネルを終了した後の振舞い
2866
2867(5) メモリマップ
2868 ・デフォルトのメモリマップ,その変更方法
2869
2870(6) タイマドライバ関連の情報
2871 ・タイムティックの周期,その変更方法
2872 ・使用するリソース(タイマ)
2873 ・タイマ割込みの割込み優先度の変更方法
2874 ・オーバランタイマ割込みの割込み優先度の変更方法
2875
2876(7) シリアルインタフェースドライバの情報
2877 ・使用するリソース(SIOコントローラ)
2878 ・通信パラメータ(ボーレート,ビット数,パリティの有無,ストップビット)
2879
2880(8) システム構築手順
2881
2882(9) ターゲットシステム固有の注意事項
2883 ・タスクコンテキストに含まれるレジスタ,含まれないレジスタ
2884
2885(10) 類似のターゲットにポーティングする開発者向けの参考情報
2886
2887(11) ディレクトリ構成・ファイル構成
2888
2889(12) バージョン履歴
2890
2891また,必要に応じて,ターゲット依存部の設計メモを,target_design.txtに用
2892意する.プロセッサ・チップ・開発環境依存部に関する設計メモを切り分けて
2893もよいし,ファイルが大きくなる場合には複数のファイルに分割してもよいが,
2894その場合には,target_design.txt中にそれらのファイル名を記述すること.
2895
28969.2 パッケージ記述ファイル
2897
2898リリースパッケージ(個別パッケージおよび簡易パッケージ)を作成するため
2899に,パッケージに含めるファイルを記述したパッケージ記述ファイルを用意す
2900る.パッケージ記述ファイルの名称は,個別パッケージ用をMANIFEST,簡易パッ
2901ケージ用をE_PACKAGEとする.
2902
2903例えば,arch/arm_gccディレクトリに置かれたMANIFESTファイルを用いて個別
2904パッケージを作成する場合には,次のコマンドを実行する.
2905
2906 % utils/makerelease arch/arm_gcc/MANIFEST
2907
2908このコマンドにより,RELEASE/ssp_arch_arm_gcc-<バージョン番号>.tar.gzが
2909作成される.また,target/at91skyeye_gccディレクトリに置かれたE_PACKAGE
2910ファイルを用いて簡易パッケージを作成する場合には,次のコマンドを実行す
2911る.
2912
2913 % utils/makerelease target/cq_starm_gcc/E_PACKAGE
2914
2915このコマンドにより,RELEASE/ssp_cq_starm_gcc_gcc-<バージョン番号>.tar.gz
2916が作成される(RELEASEディレクトリがない場合には,ディレクトリが作られ
2917る).
2918
2919なお,makereleaseユーティリティは,SSPカーネルのソースファイルが置かれ
2920たディレクトリが,sspという名称であることを仮定している(異なる名称の場
2921合でもパッケージは作成できるが,パッケージを展開した時に展開されるディ
2922レクトリがsspでなくなる).また,標準のtarコマンドがGNU tarであること
2923(正確には,zオプションに対応していること)を想定している.
2924
2925パッケージ記述ファイルには,パッケージに含めるファイル名を,パッケージ
2926記述ファイルが置かれたディレクトリからの相対パス名で,1行に1つずつ記述
2927する.また,必要に応じて,以下のディレクティブを含める.
2928
2929(a) E_PACKAGE <簡易パッケージ名>
2930
2931簡易パッケージ名を指定する.簡易パッケージ記述ファイル(E_PACKAGE)の先
2932頭に記述する.簡易パッケージ名は,ssp_<ターゲット略称>とする.例えば,
2933ターゲット略称がcq_starm_gccの場合には,ssp_cq_starm_gccとなる.個
2934別パッケージと区別するために,簡易パッケージのファイル名には"target"を
2935含めない.
2936
2937(b) PACKAGE <個別パッケージ名>
2938
2939個別パッケージ名を指定する.個別パッケージ記述ファイル(MANIFEST)の先
2940頭に記述する.また,そこからインクルードされる各ファイルの先頭にも記述
2941し,それをインクルードしている個別パッケージ名を指定する.ターゲット依
2942存部の個別パッケージ名は,個別パッケージ記述ファイルが置かれたディレク
2943トリの相対パス中の"/"を"_"に置き換えた文字列を,"ssp_"の後につなげたも
2944のとする.例えば,個別パッケージ記述ファイルがarch/arm_gcc/MANIFESTの場
2945合には,ssp_arch_arm_gccとなる.
2946
2947(c) VERSION <バージョン番号>
2948
2949パッケージのバージョン番号を指定する.簡易パッケージ記述ファイルおよび
2950個別パッケージ記述ファイルの中に記述する.簡易パッケージにおいて,バー
2951ジョン番号をパッケージ化した日付とする場合には,パッケージ番号の代わり
2952に%dateと記述する.
2953
2954バージョン番号の付与方法については,「TOPPERS/SSPカーネル ユーザーズマ
2955ニュアル」の「2.2 簡易パッケージ」および「2.3 個別パッケージ」の節を参
2956照すること.
2957
2958(d) INCLUDE <ファイル名>
2959
2960別のパッケージ記述ファイルをインクルードする.簡易パッケージ記述ファイ
2961ルからは,個別パッケージ記述ファイルのみをインクルードするのを原則とす
2962る.個別パッケージ記述ファイルからインクルードされるファイル中で指定さ
2963れる個別パッケージ名は,すべて一致していなければならない.
2964
2965
296610. リファレンス
2967
296810.1 ターゲット依存部のファイル一覧
2969
2970標準的なターゲット依存部のファイル構成は次の通りである.
2971
2972Makefile.target Makefileのターゲット依存部(2章).
2973
2974target_stddef.h TOPPERS共通定義(t_stddef.h)のターゲット依存部(3
2975 章).アプリケーションとカーネルの両方からインクルー
2976 ドされる.
2977target_sil.h システムインタフェースレイヤ(sil.h)のターゲット依
2978 存部(4章).アプリケーションとカーネルの両方から
2979 インクルードされる.
2980target_kernel.h カーネルAPI(kernel.h)のターゲット依存部(5章).
2981 アプリケーションとカーネルの両方からインクルードさ
2982 れる.
2983
2984target_config.h カーネル実装のターゲット依存部のヘッダファイル(6
2985 章).カーネルのみからインクルードされる.
2986target_config.c カーネル実装のターゲット依存部のC言語で記述される
2987 部分(6章,オプション).
2988target_support.S カーネル実装のターゲット依存部のアセンブリ言語で記
2989 述される部分(6章,オプション).
2990target_rename.def カーネル実装のターゲット依存部のためのリネーム記述
2991 (6.12節).
2992target_rename.h target_rename.defから生成されるファイル(6.12節).
2993target_unrename.h target_rename.defから生成されるファイル(6.12節).
2994target_timer.cfg タイマドライバのシステムコンフィギュレーションファ
2995 イル(6.13節).
2996target_timer.h タイマドライバのヘッダファイル(6.13節).カーネル
2997 のみからインクルードされる.
2998target_timer.c タイマドライバの実装ファイル(6.13節,オプション).
2999システム略称.h ターゲットのハードウェア資源(割込みハンドラ番号や
3000 CPU例外ハンドラ番号,デバイスレジスタの番地など)の
3001 定義を含むヘッダファイル.アプリケーションとカーネ
3002 ルの両方からインクルードされる(6章,オプション).
3003
3004target_def.csv コンフィギュレータの値取得シンボルテーブルのターゲッ
3005 ト依存部(7章,オプション).
3006target.tf コンフィギュレータのパス2のテンプレートファイルの
3007 ターゲット依存部(7.2節).
3008target_check.tf コンフィギュレータのパス3のテンプレートファイル(7.3
3009 節).
3010target_cfg1_out.h cfg1_out.cのリンクに必要なスタブの定義ファイル(7.4
3011 節).
3012
3013target_syssvc.h システムサービスのターゲット依存定義(8.0節).
3014target_serial.cfg シリアルドライバのシステムコンフィギュレーションファ
3015 イル(8.3節).
3016target_serial.h シリアルドライバのヘッダファイル(8.3節).シリアル
3017 ドライバのみからインクルードされる.
3018target_serial.c シリアルドライバの実装ファイル(8.3節,オプション).
3019target_test.h テストプログラムのターゲット依存定義(8.4節).
3020
3021target_user.txt ユーザーズマニュアル(9.1節)
3022target_design.txt 設計メモ(9.1節,オプション)
3023MANIFEST 個別パッケージに含めるファイルのリスト(9.2節,オプ
3024 ション)
3025E_PACKAGE 簡易パッケージに含めるファイルのリスト(9.2節,オプ
3026 ション)
3027
3028以上
Note: See TracBrowser for help on using the repository browser.