source: rubycfg_asp/trunk/asp_dcre/doc/porting.txt@ 315

Last change on this file since 315 was 315, checked in by coas-nagasima, 7 years ago

SVNプロパティを設定

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