source: rtos_arduino/trunk/asp_1.9.2/doc/porting.txt@ 136

Last change on this file since 136 was 136, checked in by ertl-honda, 8 years ago

ライブラリとOS及びベーシックなサンプルの追加.

File size: 219.8 KB
Line 
1
2 TOPPERS/ASPカーネル
3 ターゲット依存部 ポーティングガイド
4
5 対応バージョン: Release 1.9.2
6 最終更新: 2014年11月17日
7
8このドキュメントは,TOPPERS/ASPカーネルを,未サポートのターゲットシステ
9ムにポーティングするために必
10要となるターゲット依存部の実装
11方法を説明す
12るものである.
13
14----------------------------------------------------------------------
15 TOPPERS/ASP Kernel
16 Toyohashi Open Platform for Embedded Real-Time Systems/
17 Advanced Standard Profile Kernel
18
19 Copyright (C) 2005-2013 by Embedded and Real-Time Systems Laboratory
20 Graduate School of Information Science, Nagoya Univ., JAPAN
21
22 上記著作権者
23は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
24 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
25 変・再é…
26å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
27 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
28 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
29 スコード中に含まれていること.
30 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
31 用できる形で再é…
32å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
33å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
34 者
35マニュアルなど)に,上記の著作権表示,この利用条件および下記
36 の無保証規定を掲載すること.
37 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
38 用できない形で再é…
39å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
40 と.
41 (a) 再é…
42å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
43マニュアルなど)に,上記の著
44 作権表示,この利用条件および下記の無保証規定を掲載すること.
45 (b) 再é…
46å¸ƒã®å½¢æ…
47‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
48 報告すること.
49 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
50 害からも,上記著作権者
51およびTOPPERSプロジェクトをå…
52è²¬ã™ã‚‹ã“と.
53 また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
54 由に基づく請求からも,上記著作権者
55およびTOPPERSプロジェクトを
56 å…
57è²¬ã™ã‚‹ã“と.
58
59 本ソフトウェアは,無保証で提供されているものである.上記著作権者
60お
61 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
62 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
63 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
64 の責任を負わない.
65
66 $Id: porting.txt 2676 2015-05-26 15:16:46Z ertl-hiro $
67----------------------------------------------------------------------
68
69○目次
70
711.å…
72±é€šäº‹é …
73
74 1.1 ターゲット依存部の構成
75 1.2 名前の衝突の防止
76 1.3 多重インクルードの防止
77 1.4 アセンブリ言語とのヘッダファイルのå…
78±ç”¨
79 1.5 インクルード記述の方法
80 1.6 クリティカルセクションの出å…
81¥å‡¦ç†ã®å®Ÿç¾ã«é–¢ã™ã‚‹åˆ¶ç´„
822.システム構築環境のターゲット依存部
83 2.1 ターゲット略称とターゲット依存部のディレクトリ
84 2.2 Makefileのターゲット依存部
85 2.3 開発環境名とコマンド名の設定
86 2.4 コンパイルオプションとオブジェクトファイルの設定
87 2.5 オフセットファイルの生成方法
88 2.5.1 コンフィギュレータを用いる方法
89 2.5.2 makeoffset.cとgenoffsetを用いる方法
90 2.6 リンク方法の設定
91 2.7 依存関係の定義
92 2.8 その他の設定
933.TOPPERSå…
94±é€šå®šç¾©ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨
95 3.1 ターゲット識別マクロ
96 3.2 整数型の最大値・最小値・ビット数
97 3.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
98 3.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
99 3.5 コンパイラの拡張機能のためのマクロ定義
100 3.6 標準的な定義の上書き
101 3.7 アサーションのための定義
1024.システムインタフェースレイヤ(SIL)のターゲット依存部
103 4.1 å…
104¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
105‹ã®ç®¡ç†
106 4.2 微少時間待
107ち
108 4.3 プロセッサのエンディアン
109 4.4 メモリ空間アクセス関数
110 4.5 I/O空間アクセス関数
1115.カーネルAPIのターゲット依存部
112 5.1 ターゲット定義でサポートする機能
113 5.2 割込み優å…
114ˆåº¦ã®ç¯„囲
115 5.3 タイムティックの定義
116 5.4 メモリ領域確保のための型定義
117 5.5 ビットパターンのビット数
118 5.6 メモリ領域確保のためのマクロ
119 5.7 オーバランハンドラ機能拡張のための定義(オプション)
1206.カーネル実装
121のターゲット依存部
122 6.1 カーネル実装
123のターゲット依存部のå…
124±é€šäº‹é …
125
126 6.1.1 カーネル実装
127のターゲット依存部の構成要素
128 6.1.2 ターゲット依存部の関数の命名規則
129 6.2 トレースログ機能への対応
130 6.3 システム状æ…
131‹ã®ç®¡ç†
132 6.3.1 å…
133¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
134‹ã®ç®¡ç†
135 6.3.2 コンテキストの管理
136 6.3.3 CPUロック状æ…
137‹ã®ç®¡ç†
138 6.4 割込みに関連するシステム状æ…
139‹ã®ç®¡ç†
140 6.4.1 割込み優å…
141ˆåº¦ãƒžã‚¹ã‚¯ã®ç®¡ç†
142 6.4.2 割込み要求禁止フラグの管理
143 6.4.3 割込み要求のクリア
144 6.4.4 割込み要求のプローブ
145 6.4.5 割込みハンドラのå…
146ˆé ­å‡¦ç†ã¨æœ«å°¾å‡¦ç†
147 6.5 タスクディスパッチャ
148 6.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
149 6.5.2 ディスパッチャ本体
150 6.5.3 タスクコンテキストからのディスパッチ
151 6.5.4 ディスパッチャの動作開始
152 6.5.5 現在のコンテキストを捨ててディスパッチ
153 6.5.6 タスクの起動処理
154 6.6 割込みハンドラ
155 6.6.1 割込みハンドラの出å…
156¥å£å‡¦ç†
157 6.6.2 割込みハンドラ毎の出å…
158¥å£å‡¦ç†ã®ç”Ÿæˆ
159 6.6.3 割込みハンドラの設定
160 6.6.4 割込み要求ラインの属性の設定
161 6.6.5 割込み管理機能の初期化処理の変更
162 6.6.6 デフォルトの割込みハンドラ
163 6.6.7 カーネル管理外の割込み
164 6.6.8 割込みサービスルーチンの生成
165 6.7 CPU例外ハンドラとCPU例外発生時のシステム状æ…
166‹ã®å‚ç…
167§
168 6.7.1 CPU例外ハンドラの出å…
169¥å£å‡¦ç†
170 6.7.2 CPU例外ハンドラの出å…
171¥å£å‡¦ç†ã®ç”Ÿæˆ
172 6.7.3 CPU例外ハンドラの設定
173 6.7.4 CPU例外管理機能の初期化処理の変更
174 6.7.5 デフォルトのCPU例外ハンドラ
175 6.7.6 CPU例外発生時のシステム状æ…
176‹ã®å‚ç…
177§
178 6.8 カーネルの起動・終了とスタック領域など
179 6.9 カーネル内
180部のチューニング
181 6.9.1 ビットマップサーチ
182 6.9.2 ビットフィールド
183 6.10 カーネル実装
184に関するその他の定義
185 6.10.1 オブジェクト属性の拡張
186 6.10.2 エラーチェック方法の指定
187 6.10.3 非タスクコンテキスト用のスタック領域
188 6.10.4 空ラベルの定義
189 6.11 トレースログ機能に関する設定
190 6.11.1 取得できるトレースログの種類とマクロ
191 6.11.2 トレースログ記録のサンプルコード
192 6.12 カーネル実装
193のターゲット依存部のためのリネーム記述
194 6.13 タイマドライバ
195 6.13.1 タイマドライバのファイル構成
196 6.13.2 タイマの初期化・終了処理・割込み処理
197 6.13.3 性能評価用システム時刻の参ç…
198§ã®ãŸã‚ã®æ©Ÿèƒ½
199 6.14 オーバランタイマドライバ(オプション)
200 6.14.1 オーバランタイマドライバのファイル構成
201 6.14.2 オーバランタイマの操作と割込み処理
202 6.15 動的メモリ管理(オプション)
203 6.15.1 TLSFを用いたメモリ管理モジュールの例
2047.コンフィギュレータ設定ファイルのターゲット依存部
205 7.1 設定ファイルとターゲット依存部の位置付け
206 7.2 パス2のテンプレートファイルのターゲット依存部
207 7.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
208 7.2.2 ターゲット非依存部で定義される変数
209 7.3 パス3のテンプレートファイルのターゲット依存部
210 7.3.1 ターゲット非依存部をインクルードする前に定義すべき変数
211 7.3.2 ターゲット依存部で行うべきエラーチェック
212 7.4 cfg1_out.cのリンクに必
213要なスタブの定義ファイル
2148.システムサービス等のターゲット依存部
215 8.0 システムサービスのターゲット依存部
216 8.1 システムログ機能のターゲット依存定義
217 8.2 ログタスクのターゲット依存定義
218 8.3 シリアルインタフェースドライバのターゲット依存部
219 8.3.1 変数,データ型,管理関数
220 8.3.2 デバイスサービスルーチン
221 8.3.3 コールバックルーチン
222 8.4 カーネル起動メッセージの出力のターゲット依存定義
223 8.5 サンプルプログラムとテストプログラムのターゲット依存定義
224 8.6 実行時間分布集計モジュールのターゲット依存定義
2259.その他
226 9.1 ドキュメント
227 9.2 パッケージ記述ファイル
22810.リファレンス
229 10.1 ターゲット依存部のファイル一覧
230
231
2321.å…
233±é€šäº‹é …
234
235
2361.1 ターゲット依存部の構成
237
238ターゲット依存部は,targetディレクトリの下に,ターゲットハードウェアと
239開発環境の組み合わせ毎に用意する.ただし,ターゲット依存部の再利用性を
240考æ…
241®ã—,プロセッサ,チップ,開発環境のみに依存する部分を,プロセッサ依
242存部,チップ依存部,開発環境依存部という形で切り分けてもよい.切り分け
243方は,ターゲット依存部の実装
244に任されている.プロセッサ依存部,チップ依
245存部,開発環境依存部は,archディレクトリの下に置く.
246
247ASPカーネルのターゲット依存部は,システム構築環境(Makefile等)のターゲッ
248ト依存部,TOPPERSå…
249±é€šå®šç¾©ï¼ˆt_stddef.h)のターゲット依存部,システムイン
250タフェースレイヤ(SIL,sil.h)のターゲット依存部,カーネルAPI(kernel.h)
251のターゲット依存部,カーネル実装
252のターゲット依存部(コンフィギュレータ
253設定ファイルのターゲット依存部を含む),システムサービスのターゲット依
254存部,ターゲット依存部に関するドキュメント等で構成される.
255
2561.2 名前の衝突の防止
257
258TOPPERSプロジェクトが提供するソフトウェアのために,TOPPERS_で始まるシン
259ボルを予約している.ヘッダファイル中に記述され,アプリケーションから参
260ç…
261§ã§ãã‚‹å†…
262部シンボルは,TOPPERS_で始まる名前とする.
263
264また,_kernel_で始まるシンボルは,カーネル内
265部の変数や関数のために予約
266している.カーネル内
267部の変数や関数の名前で,リンク時にアプリケーション
268の名前と衝突する可能性があるものは,リネーム記述にリストアップすること
269で,コンパイル時に_kernel_で始まる名前に置き換えることとしている.
270
2711.3 多重インクルードの防止
272
273すべてのヘッダファイルは,多重にインクルードされるのを防止するための条
274件コンパイル記述をå…
275¥ã‚Œã‚‹ã“ととする.例えば,target_config.hであれば,ファ
276イルのå…
277ˆé ­ã«
278
279#ifndef TOPPERS_TARGET_CONFIG_H
280#define TOPPERS_TARGET_CONFIG_H
281
282を,ファイルの末尾に
283
284#endif /* TOPPERS_TARGET_CONFIG_H */
285
286を記述する.
287
2881.4 アセンブリ言語とのヘッダファイルのå…
289±ç”¨
290
291ASPカーネルのヘッダファイルの多くは,アセンブリ言語のソースファイルから
292もインクルードできるようにするために,次のルールに従って記述するものと
293する.
294
295・TOPPERS_MACRO_ONLYがマクロ定義されている場合には,アセンブリ言語では
296 解釈できない記述(マクロ定義以外の記述)を除くように記述する.
297
298・符号無し整数型の定数値は,UINT_CやULONG_Cなどの整数定数を作るためのマ
299 クロを用いて記述する.ただし,アセンブリ言語のソースファイルからもイ
300 ンクルードできるファイル中であっても,C言語のみで用いる定数をこれらの
301 マクロを使って記述する必
302要はない.
303
304また,カーネル実装
305においては,次のルールに従うものとする.
306
307・アセンブリ言語からも用いる定数の定義中に型キャストを用いる場合には,
308 CASTマクロを用いて記述する.
309
310アセンブリ言語からヘッダファイルをインクルードする際には,必
311要に応じて,
312TOPPERS_MACRO_ONLY,UINC_C,ULONG_C,CASTをマクロ定義してから,インクルー
313ドしなければならない.
314
3151.5 インクルード記述の方法
316
317開発環境で用意されている標準ヘッダファイルおよびincludeディレクトリ下の
318標準ヘッダファイルは,「#include <...>」によりインクルードする.
319
320その他のヘッダファイルは,「#include "..."」によりインクルードする.ヘッ
321ダファイルが,カレントディレクトリやインクルードするファイルと同じディ
322レクトリ以外のディレクトリに置かれている場合には,次のようにパス指定を
323行う.
324
325・ターゲット依存部(target/<ターゲット名>)のディレクトリに置かれている
326 場合は,パス指定を行わず,ファイル名のみを記述する.
327 例)#include "target_config.h"
328
329・archディレクトリ下のディレクトリに置かれている場合には,archディレク
330 トリからの相対パスで記述する.
331 例)#include "m68k_gcc/prc_config.h"
332
333・その他の場合には,ソースプログラムのルートディレクトリ(configureが置
334 かれているディレクトリ)からの相対パスで記述する.
335 例)#include "pdic/upd72001/upd72001.h"
336
337・カーネルを構成するファイルから,kernelディレクトリ下のヘッダファイル
338 をインクルードする場合は,パス指定を行わず,ファイル名のみを記述する.
339 例)#include "kernel_impl.h"
340
3411.6 クリティカルセクションの出å…
342¥å‡¦ç†ã®å®Ÿç¾ã«é–¢ã™ã‚‹åˆ¶ç´„
343
344カーネル内
345で用いるクリティカルセクションの出å…
346¥å‡¦ç†ã‚’実現する場合には,
347次の2つの条件を満たすように実装
348しなければならない.
349
350(1-6-1) 出å…
351¥å‡¦ç†ã‹ã‚‰æŠœã‘た時点では,割込みの禁止/許可が完了していなけ
352ればならない.例えば,割込み禁止/許可命令を実行してから実際に割込みが
353禁止/許可されるまで何命令か遅
354延するプロセッサの場合には,出å…
355¥å‡¦ç†ã®ä¸­
356にNOP命令をå…
357¥ã‚Œã‚‹ãªã©ã®æ–¹æ³•ã§ï¼Œå‡ºå…
358¥å‡¦ç†ã‚’抜けた時点では,割込みが禁止/
359許可された状æ…
360‹ã«ãªã£ã¦ã„ることを保証しなければならない.
361
362(1-6-2) メモリ上のデータ構造が書き変わる可能性があることを,何らかの方
363法でコンパイラに知らせなければならない.GNU開発環境では,次のいずれかの
364方法でこの制約を満たすことができる.
365
366(a) クリティカルセクションの出å…
367¥å‡¦ç†ã®å…
368¨ä½“または出å…
369¥å‡¦ç†ã®æœ¬è³ªçš„な部分
370 (å…
371·ä½“的には,割込み禁止/許可する処理)を(インラインでない)通常
372 の関数により実現する.
373
374(b) クリティカルセクションの出å…
375¥å‡¦ç†ã®æœ¬è³ªçš„な部分をインラインアセンブ
376 ラによって実現している場合には,そのインラインアセンブラのclobber変
377 数リストに"memory"を追加する.
378
379(c) クリティカルセクションの出å…
380¥å‡¦ç†ã®æœ¬è³ªçš„な部分が,マクロやインライ
381 ン関数呼出しで実現している場合には,クリティカルセクションにå…
382¥ã‚‹å‡¦
383 理の最後と出る処理のå…
384ˆé ­ã«ï¼ŒAsm("":::"memory")という記述をå…
385¥ã‚Œã‚‹ï¼Ž
386
387このような制約を設ける理由については,「TOPPERS/ASPカーネル 設計メモ」
388の「カーネルのデータ構造に対するvolatile宣言について」の節を参ç…
389§ã™ã‚‹ã“
390と.
391
392
3932.システム構築環境のターゲット依存部
394
395この章の説明は,GNU開発環境(GCC,GAS,BINUTILS,GNU Make)を用いること
396を想定して記述してある.それ以外の開発環境を用いる場合には,開発環境に
397あわせて修正する必
398要がある.
399
4002.1 ターゲット略称とターゲット依存部のディレクトリ
401
402新しいターゲット依存部を作成する時は,まず,ターゲット略称を定める.ター
403ゲット略称は,システム略称と開発環境略称を"_"で連結したものとする.シス
404テム略称に用いる文字は英小文字と数字と"_"に,開発環境略称に用いる文字は
405英小文字と数字に限定する.GNU開発環境の開発環境略称は,"gcc"とする.例
406えば,システム略称が"dve68k"で,GNU開発環境を用いる場合には,ターゲット
407略称は"dve68k_gcc"となる.
408
409ターゲット依存部のファイルを置くために,targetディレクトリの下に,ター
410ゲット略称を名称とするディレクトリを作成する.これをターゲット依存部ディ
411レクトリと呼ぶ.
412
413ターゲット依存部からプロセッサ依存部やチップ依存部を切り分ける場合には,
414依存部略称を定める.依存部略称は,プロセッサやチップの略称と開発環境略
415称を"_"で連結したものとする.プロセッサやチップの略称に用いる文字は,英
416小文字と数字と"_"に限定する.例えば,プロセッサ略称が"m68k"で,GNU開発
417環境を用いる場合には,依存部略称は"m68k_gcc"となる.
418
419また,ターゲット依存部から開発環境依存部を切り分ける場合には,開発環境
420略称を依存部略称とする.例えば,GNU開発環境依存部の依存部略称は,"gcc"
421となる.
422
423これらの依存部のファイルを置くために,archディレクトリの下に,依存部略
424称を名称とするディレクトリを作成する.
425
426なお,GNU開発環境以外の開発環境を用いる場合には,コンフィギュレーション
427スクリプト(configure),サンプルのMakefile(sample/Makefile),一部の
428ユーティリティプログラム(utils/makedep)を,その開発環境用に用意する必
429
430要がある場合がある.その場合には,これらのファイルを,ターゲット依存部
431ディレクトリか開発環境依存部ディレクトリに置くものとする.また,開発環
432境用のプロジェクトファイルが必
433要な場合には,ターゲット依存部ディレクト
434リに置くものとする.
435
4362.2 Makefileのターゲット依存部
437
438Makefileのターゲット依存部は,ターゲット依存部ディレクトリに置いた
439Makefile.targetまたはそこからインクルードされるファイル(プロセッサ・チッ
440プ・開発環境依存部で用意されるファイルなど)に含める.
441
4422.3 開発環境名とコマンド名の設定
443
444開発環境名とコマンド名を設定するために,Makefileのターゲット依存部で次
445の変数を定義する.
446
447(2-3-1) TOOL 開発環境名
448
449開発環境名に定義する.GNU開発環境を用いる場合には,gccに定義する.
450
451(2-3-2) GCC_TARGET GNU開発環境のターゲット名
452
453GNU開発環境を用いる場合に,GNU開発環境をconfigureする場合に指定するター
454ゲット名に定義する.ここで指定したターゲット名は,開発環境のコマンド名
455のå…
456ˆé ­ã«ä»˜ä¸Žã•ã‚Œã‚‹æ–‡å­—列となる.例えば,GCC_TARGETをm68k-unknown-elfに
457定義した場合には,コンパイラとしてm68k-unknown-elf-gccが使われる.この
458変数が定義されない場合には,単なるgccが使われる.
459
460(2-3-3) CC Cコンパイラドライバの名称
461(2-3-4) CXX C++コンパイラドライバの名称
462(2-3-5) AS アセンブラの名称
463(2-3-6) LD リンカの名称
464(2-3-7) AR アーカイバの名称
465(2-3-8) NM nmプログラムの名称
466(2-3-9) RANLIB ranlibプログラムの名称
467(2-3-10) OBJCOPY objcopyプログラムの名称
468(2-3-11) OBJDUMP objdumpプログラムの名称
469
470GNU開発環境以外の開発環境を用いる場合に,それぞれのコマンドの名称に定義
471する.対応するコマンドがない場合や,コマンドパラメータが異なる場合には,
472Makefile中でそのコマンドを呼び出している部分を変更する必
473要がある.
474
475GNU開発環境では,これらはGCC_TARGETを用いて定義されるので,定義する必
476要
477はない.
478
4792.4 コンパイルオプションとオブジェクトファイルの設定
480
481Makefileのターゲット依存部で以下で説明する変数を定義する時には,":="を
482用いて,それまでの定義に追加する形で行う.例えば,コンパイラに対するそ
483の他のオプションとして「-Wall -g -O2」を追加したい場合には,「COPTS :=
484$(COPTS) -Wall -g -O2」という記述をMakefileのターゲット依存部に含める.
485
486(2-4-1) COPTS コンパイラに対するその他のオプション
487(2-4-2) CDEFS マクロ定義オプション(-Dオプション)
488(2-4-3) INCLUDES ヘッダファイルの置かれたディレクトリ指定オ
489 プション(-Iオプション)
490(2-4-4) LDFLAGS リンカに対するその他のオプション
491(2-4-5) LIBS ライブラリリンク指定のためのオプション
492
493ターゲットに依存して,すべてのソースファイルにå…
494±é€šã™ã‚‹ã‚³ãƒ³ãƒ‘イルオプショ
495ンの追加が必
496要な場合には,オプションの種類毎に上に示した変数に定義する.
497
498ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
499下の記述を含める必
500要がある.
501
502----------------------------------------
503INCLUDES := $(INCLUDES) -I$(TARGETDIR)
504----------------------------------------
505
506ここでTARGETDIRは,ターゲット依存部ディレクトリに定義されている.また
507SRCDIRは,Makefileにおいて,ソースプログラムのルートディレクトリ
508(configureが置かれているディレクトリ)に定義されている.
509
510コンパイラの問題等で,警告メッセージが出ることを防げない状況以外では,
511COPTSに-Werrorを追加することを推奨する.
512
513----------------------------------------
514COPTS := $(COPTS) -Werror
515----------------------------------------
516
517カーネルのコンパイル時に,dereferencing type-punned pointer will break
518strict-aliasing rulesという警告が出る場合には,以下を追加するとよい.こ
519の警告メッセージに関する詳細は,「TOPPERS/ASPカーネル 設計メモ」の「型
520キャストに伴う警告メッセージ」の節を参ç…
521§ã™ã‚‹ã“と.
522
523----------------------------------------
524KERNEL_CFLAGS := $(KERNEL_CFLAGS) -fno-strict-aliasing
525----------------------------------------
526
527また,アセンブリ言語レベルの識別名が,C言語レベルの識別名のå…
528ˆé ­ã«"_"が
529付いたものになる場合には,CDEFSに-DTOPPERS_LABEL_ASMを追加する.
530
531(2-4-6) SYSSVC_DIR システムサービスのソースが置かれたディレクトリ
532(2-4-7) SYSSVC_ASMOBJS アセンブリ言語で記述されたシステムサービスの
533 オブジェクト
534(2-4-8) SYSSVC_COBJS C言語で記述されたシステムサービスのオブジェクト
535(2-4-9) SYSSVC_CFLAGS システムサービスに対するコンパイルオプション
536(2-4-10) SYSSVC_LIBS システムサービスに対するライブラリリンク指定
537
538ターゲットに依存して,システムサービス(システムログタスクやデバイスド
539ライバなど)のソースが置かれたディレクトリ,システムサービスを構成する
540オブジェクトファイルのリスト,それらをコンパイルする際に適用するコンパ
541イルオプション,その構成に必
542要なライブラリリンク指定を追加する場合には,
543上に示した変数に定義する.
544
545(2-4-11) KERNEL_DIR カーネルのソースが置かれたディレクトリ
546(2-4-12) KERNEL_ASMOBJS アセンブリ言語で記述されたカーネルのオブジェクト
547(2-4-13) KERNEL_COBJS C言語で記述されたカーネルのオブジェクト
548(2-4-14) KERNEL_CFLAGS カーネルに対するコンパイルオプション
549
550ターゲットに依存して,カーネルのソースが置かれたディレクトリ,カーネル
551を構成するオブジェクトファイルのリスト,それらをコンパイルする際に適用
552するコンパイルオプションを追加する場合には,上に示した変数に定義する.
553
554ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
555下の記述を含める必
556要がある.
557
558----------------------------------------
559KERNEL_DIR := $(KERNEL_DIR) $(TARGETDIR)
560KERNEL_ASMOBJS := $(KERNEL_ASMOBJS) target_support.o
561KERNEL_COBJS := $(KERNEL_COBJS) target_config.o target_timer.o
562----------------------------------------
563
564(2-4-15) CFG_TABS コンフィギュレータに対するオプション
565
566ターゲットに依存して,コンフィギュレータに対するオプションを追加する場
567合には,上に示した変数に定義する.å…
568·ä½“的には,コンフィギュレータの値取
569得シンボルテーブルのターゲット依存部(target_def.csv)がある場合には,
570それを指定するオプションを追加する必
571要がある.
572
573ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
574下の記述を含める必
575要がある.
576
577----------------------------------------
578CFG_TABS := $(CFG_TABS) --cfg1-def-table $(TARGETDIR)/target_def.csv
579----------------------------------------
580
581(2-4-16) CFG1_OUT_LDFLAGS cfg1_out.cに対するリンクオプション
582
583ターゲットに依存して,cfg1_out.cをリンクする際に適用するオプションを追
584加する場合には,上に示した変数に定義する.
585
586なお,LDFLAGSは,cfg1_out.cをリンクする際には適用されないため,LDFLAGS
587に定義したオプションで,cfg1_out.cをリンクする際にも必
588要なものは,
589CFG1_OUT_LDFLAGSにも定義する必
590要がある.
591
592(2-4-17) CFG_ASMOBJS アセンブリ言語で記述されたシステムコンフィ
593 ギュレーションのためのオブジェクト
594(2-4-18) CFG_COBJS C言語で記述されたシステムコンフィギュレー
595 ションのためのオブジェクト
596
597ターゲットに依存して,システムコンフィギュレーションのためのオブジェク
598トファイルを(kernel_cfg.o以外に)追加する場合には,上に示した変数に定
599義する.この場合,追加したオブジェクトファイルの作成ルール(コンパイル/
600アセンブルルールと依存関係作成ルール)を,Makefileのターゲット依存部に
601記述する必
602要がある.
603
604(2-4-19) CFG2_OUT_SRCS
605
606ターゲットに依存して,コンフィギュレータのパス2でkernel_cfg.cと
607kernel_cfg.h以外のファイルを生成する場合には,上に示した変数に定義する.
608
609(2-4-20) OMIT_WARNING_ALL
610(2-4-21) OMIT_OPTIMIZATION
611
612サンプルのMakefileでは,コンパイラに対するオプションに「-Wall -g -O2」
613を追加する.-Wallを追加したくない場合には,Makefileのターゲット依存部で
614OMIT_WARNING_ALLを"true"に定義する.-O2を追加したくない場合には,
615Makefileのターゲット依存部でOMIT_OPTIMIZATIONを"true"に定義する.
616
6172.5 オフセットファイルの生成方法
618
619アセンブリ言語で記述されるプログラムから,C言語の構造体にアクセスする場
620合には,構造体の各フィールドのオフセット値を参ç…
621§ã™ã‚‹ã“とが必
622要である.
623ASPカーネルでは,必
624要なオフセット値を求めてファイル(標準ではoffset.h)
625に生成するための仕組みを用意している.
626
627この仕組みを用いることで,例えば,TCB中のtexptnフィールドのオフセット値
628をTCB_texptnにマクロ定義することや,TCB中のタスクコンテキストブロック
629(tskctxb)に含まれるpcフィールドのオフセット値をTCB_pcにマクロ定義する
630ことができる.また,TCB中のenatexフィールドのオフセット値,ビット位置,
631ビットマスクを,それぞれTCB_enatex,TCB_enatex_bit,TCB_enatex_maskにマ
632クロ定義することができる.
633
634offset.hを生成するための仕組みとして,現時点では,コンフィギュレータを
635用いる方法と,makeoffset.cとgenoffsetを用いる方法を用意している.後者
636の
637方法は,GNU開発環境にしか対応していないことから,将来のバージョンでは,
638後者
639の方法のサポートをやめる計画である.新たにポーティングする場合には,
640前者
641の方法を用いることを推奨する.
642
643これらの仕組みでオフセットファイルを生成できない時には,offset.hをター
644ゲット依存部で用意し,Makefileのターゲット依存部でOMIT_MAKEOFFSETを
645"true"に定義する.
646
647拡張パッケージの中には,TCBにフィールドを追加するものがあるため,TCB中
648のフィールドのオフセット値は変化する.offset.hを生成する場合でも,ター
649ゲット依存部で用意する場合でも,拡張パッケージに対応するためには,この
650ことを考æ…
651®ã™ã‚‹å¿…
652要がある.
653
6542.5.1 コンフィギュレータを用いる方法
655
656コンフィギュレータのパス1で生成するcfg1_out.cをコンパイルして生成したオ
657ブジェクトファイルから,コンフィギュレータによってoffset.hを生成する方
658法である.この方法を用いるためには,ターゲット依存部でオフセットファイ
659ル生成用テンプレートファイルを用意し,target_cfg1_out.h(または,そこか
660らインクルードされるファイル)とtarget_def.csv(または,同等の役割を持
661つファイル)に記述を追加する必
662要がある.なお,これらのファイルを新たに
663用意した際や修正した際には,offset.hに妥当な定義が生成されていることを
664確認すべきである.
665
666オフセットファイル生成用テンプレートファイルは,ターゲット依存部で,
667target_offset.tf(または,プロセッサ依存部やチップ依存部で用意するそれ
668に代わるファイル)に用意する.また,Makefileのターゲット依存部で,次の
669例のように,OFFSET_TFにオフセットファイル生成用テンプレートファイルのファ
670イル名を定義する.
671
672----------------------------------------
673# オフセットファイル生成のための定義
674OFFSET_TF = $(TARGETDIR)/target_offset.tf
675----------------------------------------
676
677オフセットファイル生成用テンプレートファイルには,以下の内
678容を記述する.
679
680(1) 標準テンプレートファイルのインクルード
681
682オフセットファイル生成用の標準テンプレートファイル(kernel/genoffset.tf)
683をインクルードする.標準テンプレートファイルには,以下で用いるDEFINE関
684数やDEFINE_BIT関数の定義などが含まれている.
685
686----------------------------------------
687$ 標準テンプレートファイルのインクルード
688$INCLUDE "kernel/genoffset.tf"$
689----------------------------------------
690
691(2) オフセット値のマクロ定義の生成
692
693DEFINE関数を用いて,オフセット値のマクロ定義を生成する.例えば,TCB中の
694タスクコンテキストブロック(tskctxb)に含まれるpcフィールドのオフセット
695値を,TCB_pcにマクロ定義する場合には,次のように記述する.
696
697----------------------------------------
698$ オフセット値のマクロ定義の生成
699$DEFINE("TCB_pc", offsetof_TCB_pc)$
700----------------------------------------
701
702ここで,DEFINE関数の第1パラメータはマクロ定義するシンボル,第2パラメー
703タは,オフセット値を保持するコンフィギュレータの変数である.
704
705また,コンフィギュレータが,オフセット値を保持する変数(上の例では
706offsetof_TCB_pc)に値を設定するために,target_def.csv(または,同等の役
707割を持つファイル)に次の例のような行を追加する.
708
709----------------------------------------
710offsetof_TCB_pc,"offsetof(TCB,tskctxb.pc)"
711----------------------------------------
712
713ただし,各オブジェクトの初期化ブロックのターゲット非依存のフィールドの
714オフセット値を取得するための記述は,kernel/kernel_def.csvに含まれている.
715kernel/kernel_def.csvに含まれている記述は,target_def.csv(または,同等
716の役割を持つファイル)に追加する必
717要はない.
718
719(3) ビットオフセット値等のマクロ定義の生成
720
721DEFINE_BIT関数を用いて,ビットのオフセット値,ビット位置,ビットマスク
722のマクロ定義を生成する.例えば,TCB中のenatexフィールドのオフセット値,
723ビット位置,ビットマスクを,それぞれTCB_enatex,TCB_enatex_bit,
724TCB_enatex_maskにマクロ定義する場合には,次のように記述する.
725
726----------------------------------------
727$DEFINE_BIT("TCB_enatex", sizeof_TCB, "B")$
728----------------------------------------
729
730ここで,DEFINE_BIT関数の第1パラメータはマクロ定義するシンボル(のå…
731ˆé ­éƒ¨
732分),第2パラメータは構造体のサイズである.第3パラメータには,ビットの
733オフセット,ビット位置,ビットマスクを,8ビット単位(バイト単位)で求め
734る場合には"B"を,16ビット単位で求める場合には"H"を,32ビット単位で求め
735る場合には"W"を指定する.なお,ビット位置は,LSBを0とした値(ビットリト
736ルエンディアンを想定)を求める.
737
738また,target_cfg1_out.h(または,そこからインクルードされるファイル)に,
739ビットオフセット値等を求めるための構造体の変数定義を追加する.この構造
740体の変数は,名称をマクロ定義するシンボル(DEFINE_BIT関数の第1パラメータ)
741とし,対象のビットのみが1で,他のすべてのビットが0になるように初期化す
742る.また,const修飾子を付加する.例えば,TCB中のenatexフィールドのビッ
743トオフセット値等を求める場合には,次のような定義を追加する(tskctxbの初
744期値は,ターゲット依存なので注意すること).
745
746----------------------------------------
747const TCB TCB_enatex = {
748 { NULL, NULL }, /* task_queue */
749 NULL, /* p_tinib */
750 0U, /* tstat */
751#ifdef TOPPERS_SUPPORT_MUTEX
752 0U, /* bpriority */
753#endif /* TOPPERS_SUPPORT_MUTEX */
754 0U, /* priority */
755 false, /* acqeue */
756 false, /* wupque */
757 true, /* enatex */
758 0U, /* texptn */
759 NULL, /* p_winifo */
760#ifdef TOPPERS_SUPPORT_MUTEX
761 { NULL, NULL }, /* mutex_queue */
762#endif /* TOPPERS_SUPPORT_MUTEX */
763#ifdef TOPPERS_SUPPORT_OVRHDR
764 0U, /* leftotm */
765#endif /* TOPPERS_SUPPORT_OVRHDR */
766 { NULL, NULL } /* tskctxb */
767};
768----------------------------------------
769
770さらに,コンフィギュレータが,構造体のサイズ(上の例ではsizeof_TCB)に
771値を設定するために,target_def.csv(または,同等の役割を持つファイル)
772に次の例のような行を追加する.
773
774----------------------------------------
775sizeof_TCB,sizeof(TCB)
776----------------------------------------
777
778ただし,前述した通り,kernel/kernel_def.csvに含まれている記述は,
779target_def.csv(または,同等の役割を持つファイル)に追加する必
780要はない.
781
782最後に,target_cfg1_out.h(または,そこからインクルードされるファイル)
783に,offset.hを生成する仕組みが正しく動作していることを確認するための次
784の記述を追加する.
785
786----------------------------------------
787const uint8_t MAGIC_1 = 0x12;
788const uint16_t MAGIC_2 = 0x1234;
789const uint32_t MAGIC_4 = 0x12345678;
790----------------------------------------
791
7922.5.2 makeoffset.cとgenoffsetを用いる方法
793
794makeoffset.cは,どのオフセット値をoffset.hに生成するかを指定するファイ
795ルで,ターゲット依存部で用意する.genoffsetは,makeoffset.cをコンパイル
796して得られるアセンブリソースファイルから,offset.hを生成するスクリプト
797である.genoffsetは,GNU開発環境にのみ対応している.
798
799makeoffset.cを記述する場合には,既存のターゲット依存部に含まれる
800makeoffset.cを修正するのが近道である.標準的なmakeoffset.cは,以下の6つ
801の部分で構成されている.なお,makeoffset.cを新たに記述した際には,
802offset.hに妥当な定義が生成されていることを確認すべきである.
803
804(1) 必
805要なファイルのインクルード
806
807オフセット値を求めたいフィールドを含む構造体を定義するヘッダファイルを
808インクルードする.TCB中のフィールドのオフセット値を求めたい場合には,以
809下の3行を含めればよい.
810
811#include "kernel_impl.h"
812#include "task.h"
813#include "sil.h"
814
815(2) オフセット値出力用マクロの定義
816
817構造体中のフィールドのオフセット値の定義を生成するために用いるマクロ
818(OFFSET_DEFとOFFSET_DEF2)の定義.これらのマクロの定義は,修正する必
819要
820がない.
821
822(3) オフセット値出力用関数の定義
823
824構造体中のフィールドのオフセット値の定義を生成するための関数
825(makeoffset)の定義.オフセット値のマクロ定義を生成したいフィールド毎
826に,次のいずれかのマクロを記述する.
827
828(2-5-2-1) OFFSET_DEF(TYPE, FIELD)
829
830TYPEに構造体のデータ型名,FIELDにその構造体中のフィールドを指定すると,
831TYPE_FIELDという名前のシンボルに,そのフィールドのオフセット値をマクロ
832定義する記述を生成する.
833
834(2-5-2-2) OFFSET_DEF2(TYPE, FIELD, FIELDNAME)
835
836TYPEに構造体のデータ型名,FIELDにその構造体中のフィールドを指定すると,
837TYPE_FIELDNAMEという名前のシンボルに,そのフィールドのオフセット値をマ
838クロ定義する記述を生成する.構造体に含まれる構造体中のフィールドのオフ
839セット値を求めたい場合には,こちらのマクロを使用する.
840
841(4) エンディアンを参ç…
842§ã™ã‚‹ãŸã‚ã®é–¢æ•°ã®å®šç¾©
843
844SILで定義されたエンディアンを参ç…
845§ã™ã‚‹ãŸã‚ã®é–¢æ•°ï¼ˆsil_endian)の定義.こ
846の関数の定義は,修正する必
847要がない.
848
849(5) ビットオフセット値出力のための参ç…
850§å®šç¾©
851
852初期値を持った変数定義に対して,コンパイラが生成するアセンブリ命令を参
853ç…
854§ã™ã‚‹ãŸã‚ã®å¤‰æ•°ï¼ˆBIT_REF_4,BIT_REF_2,BIT_REF_1)の定義.これらの定義
855は,ほとんどの場合に修正する必
856要がない.ただし,uint8_t型のサポートされ
857ていないターゲットでは,BIT_REF_1の定義は削除する必
858要がある.また,ポイ
859ンタが64ビットのターゲット等では,BIT_REF_8の定義を追加しなければならな
860いと思われる.
861
862(6) ビットオフセット値出力用変数の定義
863
864ビットのオフセット値,ビット位置,ビットマスクの定義を生成するためのデー
865タ型の定義.これらの定義を生成したいビットフィールド毎に,以下の説明す
866る変数を定義する.
867
868構造体のデータ型名がTYPE,その構造体中のビットフィールド名がFIELDの場合
869に,データ型がTYPEで,変数名がBIT_xy_TYPE_FIELDの変数を定義する.また,
870その変数を,対象のビットのみが1で,他のすべてのビットが0になるように初
871期化する.ここで,xはエンディアンを指定する文字で,B(ビッグエンディア
872ン)またはL(リトルエンディアン)を指定する.またyには,ビットのオフセッ
873ト,ビット位置,ビットマスクを,8ビット単位(バイト単位)で求める場合に
874はBを,16ビット単位で求める場合にはHを,32ビット単位で求める場合にはWを
875指定する.
876
877これにより,TYPE_FIELDという名前のシンボルにそのビットのオフセット,
878TYPE_FIELD_bitという名前のシンボルにビット位置,TYPE_FIELD_maskという名
879前のシンボルにビットマスクをマクロ定義する記述を生成する.なお,ビット
880位置は,LSBを0とした値(ビットリトルエンディアンを想定)を求める.
881
8822.6 リンク方法の設定
883
884(2-6-1) LDSCRIPT リンカスクリプトのファイル名
885
886開発環境に標準のリンカスクリプトが使用できない場合には,ターゲット依存
887部でリンカスクリプトを用意し,そのファイル名をこの変数に定義する.
888
889(2-6-2) TEXT_START_ADDRESS テキストセクションのå…
890ˆé ­ç•ªåœ°
891(2-6-3) DATA_START_ADDRESS データセクションのå…
892ˆé ­ç•ªåœ°
893
894各セクションのå…
895ˆé ­ç•ªåœ°ã®æŒ‡å®šãŒå¿…
896要な場合には,これらの変数にå…
897ˆé ­ç•ªåœ°ã‚’
898定義する.
899
900(2-6-4) START_OBJS å…
901ˆé ­ã«ãƒªãƒ³ã‚¯ã™ã¹ããƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«å
902(2-6-5) END_OBJS 最後にリンクすべきモジュール名
903
904ターゲットによっては,ロードモジュールのå…
905ˆé ­ã¨æœ€å¾Œã«ãƒªãƒ³ã‚¯ã™ã¹ããƒ¢ã‚¸ãƒ¥ãƒ¼
906ルを,ターゲット依存部で用意する必
907要がある.多くの場合,スタートアップ
908モジュールをロードモジュールのå…
909ˆé ­ã«ãƒªãƒ³ã‚¯ã™ã‚‹å¿…
910要がある.
911
912ロードモジュールのå…
913ˆé ­ã«ãƒªãƒ³ã‚¯ã™ã¹ããƒ—ログラムがある場合には,Makefile
914のターゲット依存部において,そのオブジェクトファイル名をSTART_OBJSに定
915義し,それに対するコンパイルルールと依存関係作成ルールを定義する.ロー
916ドモジュールの最後にリンクすべきモジュールがある場合には,そのオブジェ
917クトファイル名をEND_OBJSに定義し,それに対するコンパイルルールと依存関
918係作成ルールを定義する.また,標準のスタートアップモジュール(crt0.o)
919をリンクしないように,LDFLAGSとCFG1_OUT_LDFLAGSに-nostdlibを追加する必
920
921要がある.さらに,-nostdlibをつけることで標準ライブラリがリンクされなく
922なるため,LIBSに-lgccを追加しなければならない.
923
924例えば,スタートアップモジュールのソースファイルがstart.Sの場合には,
925Makefileのターゲット依存部に次のような記述をå…
926¥ã‚Œã‚‹ã¨ã‚ˆã„.
927
928----------------------------------------
929# スタートアップモジュールのオブジェクトファイル名
930START_OBJS = start.o
931
932# スタートアップモジュールのコンパイルルール
933$(START_OBJS): %.o: %.S
934 $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
935
936# スタートアップモジュールの依存関係作成ルール
937$(START_OBJS:.o=.d): %.d: %.S
938 @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
939 -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
940
941# リンカに対するオプション
942LDFLAGS := -nostdlib $(LDFLAGS)
943CFG1_OUT_LDFLAGS := -nostdlib $(CFG1_OUT_LDFLAGS)
944LIBS := $(LIBS) -lgcc
945----------------------------------------
946
947また,GNU開発環境で,コンパイラに標準のcrtbegin.oとcrtend.oを用いる場合
948には,Makefile のターゲット依存部に次のような記述をå…
949¥ã‚Œã‚‹ã¨ã‚ˆã„.
950
951----------------------------------------
952# オブジェクトファイル名
953START_OBJS = $(shell $(CC) -print-file-name=crtbegin.o)
954END_OBJS = $(shell $(CC) -print-file-name=crtend.o)
955
956# 依存関係作成ルール
957$(START_OBJS:.o=.d): %.d:
958$(END_OBJS:.o=.d): %.d:
959
960# リンカに対するオプション
961LDFLAGS := -nostdlib $(LDFLAGS)
962CFG1_OUT_LDFLAGS := -nostdlib $(CFG1_OUT_LDFLAGS)
963LIBS := $(LIBS) -lgcc
964----------------------------------------
965
966この場合,これらのファイルをコンパイルすることはないため,コンパイルルー
967ルは不要である.また,依存関係作成ルールはダミーでよい(依存関係作成ルー
968ルがないとエラーになる).
969
970(2-6-6) HIDDEN_OBJS 指定しなくてもリンクされるモジュール名
971
972ロードモジュールにリンクすべきモジュールを,リンカに対するパラメータで
973はなく,リンカスクリプト中に(例えば,GNU開発環境のリンカスクリプトの
974STARTUPを使って)記述する場合には,そのオブジェクトファイル名を,
975(START_OBJSまたはEND_OBJSではなく)HIDDEN_OBJSに定義し,それに対するコ
976ンパイルルールと依存関係作成ルールを定義する.HIDDEN_OBJSに定義したモ
977ジュールは,リンカに対するパラメータからは除外される.LDFLAGSと
978CFG1_OUT_LDFLAGS,LIBSについては,START_OBJSまたはEND_OBJSを用いる場合
979と同様である.
980
981例えば,スタートアップモジュールのソースファイルがstart.Sで,start.oを
982リンクすることをリンカスクリプト中に記述する場合には,Makefileのターゲッ
983ト依存部に次のような記述をå…
984¥ã‚Œã‚‹ã¨ã‚ˆã„.
985
986----------------------------------------
987# スタートアップモジュールのオブジェクトファイル名
988HIDDEN_OBJS = start.o
989
990# スタートアップモジュールのコンパイルルール
991$(HIDDEN_OBJS): %.o: %.S
992 $(CC) -c $(CFLAGS) $(KERNEL_CFLAGS) $<
993
994# スタートアップモジュールの依存関係作成ルール
995$(HIDDEN_OBJS:.o=.d): %.d: %.S
996 @$(PERL) $(SRCDIR)/utils/makedep -C $(CC) $(MAKEDEP_OPTS) \
997 -O "$(CFLAGS) $(KERNEL_CFLAGS)" $< >> Makefile.depend
998
999# リンカに対するオプション
1000LDFLAGS := -nostdlib $(LDFLAGS)
1001CFG1_OUT_LDFLAGS := -nostdlib $(CFG1_OUT_LDFLAGS)
1002LIBS := $(LIBS) -lgcc
1003----------------------------------------
1004
10052.7 依存関係の定義
1006
1007コンフィギュレータの各パスに対して,ターゲット依存のファイルへの依存関
1008係を定義する.å…
1009·ä½“的には,パス1,パス2,パス3が依存するファイルを,それ
1010ぞれcfg1_out.c,kernel_cfg.timestamp,$(OBJFILE)に対する依存関係の形で
1011記述する.
1012
1013ほとんどの場合に,ターゲット依存部ディレクトリのMakefile.targetには,以
1014下の記述を含める必
1015要がある.
1016
1017----------------------------------------
1018cfg1_out.c: $(TARGETDIR)/target_def.csv
1019kernel_cfg.timestamp: $(TARGETDIR)/target.tf
1020$(OBJFILE): $(TARGETDIR)/target_check.tf
1021----------------------------------------
1022
10232.8 その他の設定
1024
1025(2-8-1) CLEAN_FILES cleanにより削除するファイル名
1026
1027cleanにより削除するファイルをターゲット依存部で追加したい場合には,ファ
1028イル名をこの変数に追加定義する.
1029
1030(2-8-2) REALCLEAN_FILES realcleanにより削除するファイル名
1031
1032realcleanにより削除するファイルをターゲット依存部で追加したい場合には,
1033ファイル名をこの変数に追加定義する.
1034
1035
10363.TOPPERSå…
1037±é€šå®šç¾©ã®ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨
1038
1039TOPPERSå…
1040±é€šå®šç¾©ï¼ˆt_stddef.h)のターゲット依存部は,target_stddef.hまた
1041はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存
1042部で用意されるヘッダファイルなど)に含める.
1043
10443.1 ターゲット識別マクロ
1045
1046アプリケーションやシステムサービスでターゲットを識別するために,
1047"TOPPERS_"にシステム略称を大文字にした文字列を連結したもの(例えば,
1048"TOPPERS_DVE68K")をマクロ定義する.
1049
1050また,ターゲット依存部からプロセッサ依存部やチップ依存部を切り分けた場
1051合には,"TOPPERS_"に依存部略称を大文字にした文字列を連結したもの(例え
1052ば,"TOPPERS_M68K")をマクロ定義する.
1053
10543.2 整数型の最大値・最小値・ビット数
1055
1056(3-2-1) INT_MAX intに格納できる最大値(C90準拠)
1057(3-2-2) INT_MIN intに格納できる最小値(C90準拠)
1058(3-2-3) UINT_MAX unsigned intに格納できる最大値(C90準拠)
1059(3-2-4) LONG_MAX longに格納できる最大値(C90準拠)
1060(3-2-5) LONG_MIN longに格納できる最小値(C90準拠)
1061(3-2-6) ULONG_MAX unsigned longに格納できる最大値(C90準拠)
1062(3-2-7) CHAR_BIT char型のビット数(C90準拠)
1063
1064整数型の最大値・最小値・ビット数を,これらのシンボルにマクロに定義する.
1065
1066これらのマクロは,C90に準拠したものである.開発環境にC90に準拠した
1067limits.hが用意されている場合には,これらのマクロを定義することに代えて,
1068limits.hをインクルードすればよい.
1069
10703.3 サイズの指定された整数型,その最大値・最小値,整数定数を作るマクロ
1071
1072(3-3-1) int8_t 符号付き8ビット整数(オプション,C99準拠)
1073(3-3-2) uint8_t 符号無し8ビット整数(オプション,C99準拠)
1074(3-3-3) int16_t 符号付き16ビット整数(C99準拠)
1075(3-3-4) uint16_t 符号無し16ビット整数(C99準拠)
1076(3-3-5) int32_t 符号付き32ビット整数(C99準拠)
1077(3-3-6) uint32_t 符号無し32ビット整数(C99準拠)
1078(3-3-7) int64_t 符号付き64ビット整数(オプション,C99準拠)
1079(3-3-8) uint64_t 符号無し64ビット整数(オプション,C99準拠)
1080(3-3-9) int128_t 符号付き128ビット整数(オプション,C99準拠)
1081(3-3-10) uint128_t 符号無し128ビット整数(オプション,C99準拠)
1082(3-3-11) int_least8_t 8ビット以上の符号付き整数(C99準拠)
1083(3-3-12) uint_least8_t 8ビット以上の符号無し整数(C99準拠)
1084(3-3-13) intptr_t ポインタを格納できるサイズの符号付き整数(C99準拠)
1085(3-3-14) uintptr_t ポインタを格納できるサイズの符号無し整数(C99準拠)
1086(3-3-15) INT8_MAX int8_tに格納できる最大値(オプション,C99準拠)
1087(3-3-16) INT8_MIN int8_tに格納できる最小値(オプション,C99準拠)
1088(3-3-17) UINT8_MAX uint8_tに格納できる最大値(オプション,C99準拠)
1089(3-3-18) INT16_MAX int16_tに格納できる最大値(C99準拠)
1090(3-3-19) INT16_MIN int16_tに格納できる最小値(C99準拠)
1091(3-3-20) UINT16_MAX uint16_tに格納できる最大値(C99準拠)
1092(3-3-21) INT32_MAX int32_tに格納できる最大値(C99準拠)
1093(3-3-22) INT32_MIN int32_tに格納できる最小値(C99準拠)
1094(3-3-23) UINT32_MAX uint32_tに格納できる最大値(C99準拠)
1095(3-3-24) INT64_MAX int64_tに格納できる最大値(オプション,C99準拠)
1096(3-3-25) INT64_MIN int64_tに格納できる最小値(オプション,C99準拠)
1097(3-3-26) UINT64_MAX uint64_tに格納できる最大値(オプション,C99準拠)
1098(3-3-27) INT128_MAX int128_tに格納できる最大値(オプション,C99準拠)
1099(3-3-28) INT128_MIN int128_tに格納できる最小値(オプション,C99準拠)
1100(3-3-29) UINT128_MAX uint128_tに格納できる最大値(オプション,C99準拠)
1101(3-3-30) INT_LEAST8_MAX int_least8_tに格納できる最大値(C99準拠)
1102(3-3-31) INT_LEAST8_MIN int_least8_tに格納できる最小値(C99準拠)
1103(3-3-32) UINT_LEAST8_MAX uint_least8_tに格納できる最大値(C99準拠)
1104(3-3-33) INT8_C(val) int_least8_t型の定数を作るマクロ(C99準拠)
1105(3-3-34) UINT8_C(val) uint_least8_t型の定数を作るマクロ(C99準拠)
1106(3-3-35) INT16_C(val) int16_t型の定数を作るマクロ(C99準拠)
1107(3-3-36) UINT16_C(val) uint16_t型の定数を作るマクロ(C99準拠)
1108(3-3-37) INT32_C(val) int32_t型の定数を作るマクロ(C99準拠)
1109(3-3-38) UINT32_C(val) uint32_t型の定数を作るマクロ(C99準拠)
1110(3-3-39) INT64_C(val) int64_t型の定数を作るマクロ(オプション,C99準拠)
1111(3-3-40) UINT64_C(val) uint64_t型の定数を作るマクロ(オプション,C99準拠)
1112(3-3-41) INT128_C(val) int128_t型の定数を作るマクロ(オプション,C99準拠)
1113(3-3-42) UINT128_C(val) uint128_t型の定数を作るマクロ(オプション,C99準拠)
1114
1115指定されたサイズの整数型を,これらのシンボルに型定義する.また,データ
1116型に格納できる最大値・最小値と,整数定数を作るマクロを,これらのシンボ
1117ルにマクロ定義する.
1118
1119これらのデータ型およびマクロは,C99に準拠したものである.開発環境にC99
1120に準拠したstdint.hが用意されている場合には,これらのデータ型およびマク
1121ロを定義することに代えて,stdint.hをインクルードすればよい.
1122
1123上でオプションと記述したものは,該当するデータ型がコンパイラでサポート
1124されている場合にのみ定義することを示す.
1125
11263.4 サイズの指定された浮動小数点型,その最大値・最小値のマクロ
1127
1128(3-4-1) float32_t IEEE754準拠の32ビット単精度浮動小数点数(オプ
1129 ション)
1130(3-4-2) double64_t IEEE754準拠の64ビット倍精度浮動小数点数(オプ
1131 ション)
1132(3-4-3) FLOAT32_MIN float32_tに格納できる最小の正規化された正の浮
1133 動小数点数(オプション)
1134(3-4-4) FLOAT32_MAX float32_tに格納できる表現可能な最大の有限浮動
1135 小数点数(オプション)
1136(3-4-5) DOUBLE64_MIN double64_tに格納できる最小の正規化された正の浮
1137 動小数点数(オプション)
1138(3-4-6) DOUBLE64_MAX double64_tに格納できる表現可能な最大の有限浮動
1139 小数点数(オプション)
1140
1141指定されたサイズ・表現形式の浮動小数点型を,これらのシンボルに型定義す
1142る.また,データ型に格納できる最大値・最小値を,これらのシンボルにマク
1143ロ定義する.
1144
1145いずれも,該当するデータ型がコンパイラでサポートされている場合にのみ定
1146義する.
1147
11483.5 コンパイラの拡張機能のためのマクロ定義
1149
1150コンパイラの拡張機能を用いるためのマクロとして,必
1151要に応じて,以下のマ
1152クロの定義を含める.
1153
1154(3-5-1) inline(オプション,デフォルトは未定義)
1155(3-5-2) Inline(オプション,デフォルトはstatic inline)
1156
1157インライン関数であることを示す指定.Inlineは,コンパイル単位にローカル
1158なインライン関数であることを示す.
1159
1160(3-5-3) asm(オプション,デフォルトは未定義)
1161(3-5-4) Asm(オプション,デフォルトは未定義)
1162
1163インラインアセンブラを記述するための指定.Asmは,最適化により削除しては
1164ならないことを示す.これらは,ターゲット依存部でのみ使うマクロであるた
1165め,ターゲット依存部で使わないなら定義する必
1166要はない.
1167
1168(3-5-5) offsetof(structure, field)(オプション,デフォルトの定義あり)
1169
1170構造体structureの中での,フィールドfieldのオフセットを求めるマクロ.
1171
1172(3-5-6) alignof(type)(オプション,デフォルトの定義あり)
1173
1174データ型typeのアラインメント単位を求めるマクロ.
1175
1176(3-5-7) NoReturn(オプション,デフォルトは未定義)
1177
1178リターンすることのない関数であることを示す指定.これは,ターゲット依存
1179部のみ使うマクロであるため,ターゲット依存部で使わないなら定義する必
1180要
1181はない.
1182
11833.6 標準的な定義の上書き
1184
1185t_stddef.hに含まれるTOPPERSå…
1186±é€šå®šç¾©ã®æ¨™æº–的な定義を上書きする場合には,
1187以下のマクロを定義する.
1188
1189(3-6-1) TOPPERS_bool(オプション,デフォルトはint)
1190(3-6-2) TOPPERS_size(オプション,デフォルトはuintptr_t)
1191(3-6-3) TOPPERS_fp(オプション,デフォルトは他と互換性のない関数ポインタ)
1192
1193それぞれ,bool_t,SIZE,FPに型定義すべきデータ型.
1194
1195(3-6-4) UINT_C(val)(オプション,デフォルトはUを付加)
1196(3-6-5) ULONG_C(val)(オプション,デフォルトはULを付加)
1197
1198それぞれ,unsigned uint型,unsigned long型の定数を作るためのマクロ.
1199
1200(3-6-6) NULL(オプション,デフォルトは0)
1201
1202C90準拠のC言語環境では,NULLの定義はstddef.hに含まれているため,これを
1203インクルードしてもよい.
1204
1205(3-6-7) ERCD(mercd, sercd)(オプション)
1206(3-6-8) MERCD(ercd)(オプション)
1207(3-6-9) SERCD(ercd)(オプション)
1208
1209ERCD,MERCD,SERCDの標準の定義は,符号付き整数が2の補数で表現されており,
1210右シフト演算子(>>)が算術シフトされることを仮定している.多くのコンパ
1211イラでこの仮定が成り立つが,そうでない場合には,ターゲット依存部でこれ
1212らの定義を上書きする必
1213要がある.
1214
1215(3-6-10) ALIGN_TYPE(addr, type)(オプション)
1216
1217アドレスaddrが,データ型typeのアラインメント単位にアラインしているか
1218チェックするマクロ.
1219
12203.7 アサーションのための定義
1221
1222t_stddef.hには,assertの定義が含まれる.assertが失敗した場合(assertの
1223パラメータがfalseになった場合)の処理を,ターゲット依存に用意する必
1224要が
1225ある.これらの定義は,assertマクロを使用する前であれば,t_stddef.h以降
1226にインクルードされるファイルに含まれていてもよい.なお,assertを無効に
1227する(NDEBUGをマクロ定義してコンパイルする)場合には,これらを用意する
1228必
1229要はない.
1230
1231(3-7-1) TOPPERS_assert_abort(void)
1232
1233assertが失敗した場合に,プログラムを停止させる関数.システム開発中はデ
1234バッガに落とすのが理想的である.システム稼働時には例外処理を行わせるこ
1235とになる.
1236
1237(3-7-2) TOPPERS_assert_fail(exp, file, line)
1238
1239assertが失敗した時の情
1240報を表示/記録するためのマクロ.システムログ機能を
1241用いる場合には,t_syslog.hにシステムログ機能に記録するための定義が含ま
1242れているので,ターゲット依存部で用意する必
1243要はない.
1244
1245
12464.システムインタフェースレイヤ(SIL)のターゲット依存部
1247
1248システムインタフェースレイヤ(SIL,sil.h)のターゲット依存部の定義は,
1249target_sil.hまたはそこからインクルードされるファイル(プロセッサ・チッ
1250プ・開発環境依存部で用意されるヘッダファイルなど)に含める.
1251
1252SILのサービスコールは,任意のシステム状æ…
1253‹ã§å‘¼ã³å‡ºã™ã“とができる.そのた
1254め,SILのターゲット依存部の関数は,任意のシステム状æ…
1255‹ã§å‘¼ã³å‡ºã›ã‚‹ã‚ˆã†ã«
1256実装
1257しなければならない.
1258
12594.1 å…
1260¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
1261‹ã®ç®¡ç†
1262
1263SILのターゲット依存部では,å…
1264¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
1265‹ã¸é·ç§»ã™ã‚‹æ©Ÿèƒ½ã¨ï¼Œå…
1266ƒã®çŠ¶æ…
1267‹
1268へ戻す機能(å…
1269ƒã®çŠ¶æ…
1270‹ã‚’記憶するために変数を使う)を提供する.å…
1271¨å‰²è¾¼ã¿ãƒ­ãƒƒ
1272ク状æ…
1273‹ã§ã‚るかを判別する機能は提供する必
1274要がない.
1275
1276SILの機能は,カーネルを使用しない場合にも使用できる必
1277要がある.そのため,
1278å…
1279¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
1280‹ã¸ã®é·ç§»ã¨å…
1281ƒã®çŠ¶æ…
1282‹ã¸ã®å¾©å¸°ã¯ï¼Œã‚«ãƒ¼ãƒãƒ«ã‚’用いず,プロ
1283セッサのリソースを直接操作することによって実現する.また,å…
1284¨å‰²è¾¼ã¿ãƒ­ãƒƒ
1285ク状æ…
1286‹ã¸ã®é·ç§»ã¨å…
1287ƒã®çŠ¶æ…
1288‹ã¸ã®å¾©å¸°ã¯ï¼Œå…
1289¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
1290‹ã‚„CPUロック状æ…
1291‹ã§
1292も行える必
1293要がある.
1294
1295保護機能を持ったカーネルでは,ユーザタスクからプロセッサのリソースを直
1296接操作することができないため,ユーザタスクからはこれらの機能を用いるこ
1297とができない.用いた場合の振舞いはターゲットプロセッサに依存するが,å…
1298¸
1299型的には,特権命令違反などのCPU例外が発生することになる.
1300
1301(4-1-1) SIL_PRE_LOC
1302
1303å…
1304¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ãƒ•ãƒ©ã‚°ã®çŠ¶æ…
1305‹ã‚’保存するための変数を定義するマクロ.型名の
1306後に,変数名を続けたものに定義する.変数名は,他の名前と衝突しないよう
1307に,"TOPPERS_"で始まる名前にする.
1308
1309(4-1-2) SIL_LOC_INT()
1310
1311現在のå…
1312¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ãƒ•ãƒ©ã‚°ã®çŠ¶æ…
1313‹ã‚’SIL_PRE_LOCで定義した変数に保存し,å…
1314¨
1315割込みロック状æ…
1316‹ã«é·ç§»ã•ã›ã‚‹ãƒžã‚¯ãƒ­ï¼Žã“のマクロを実現する際には,「1.6
1317クリティカルセクションの出å…
1318¥å‡¦ç†ã®å®Ÿç¾ã«é–¢ã™ã‚‹åˆ¶ç´„」の節に記述されてい
1319る制約に従わなければならない.
1320
1321(4-1-3) SIL_UNL_INT()
1322
1323SIL_LOC_INT()によって変数に保存した状æ…
1324‹ã«æˆ»ã™ãƒžã‚¯ãƒ­ï¼Žã“のマクロを実現す
1325る際には,「1.6 クリティカルセクションの出å…
1326¥å‡¦ç†ã®å®Ÿç¾ã«é–¢ã™ã‚‹åˆ¶ç´„」の
1327節に記述されている制約に従わなければならない.
1328
13294.2 微少時間待
1330ち
1331
1332(4-2-1) void sil_dly_nse(ulong_t dlytim)
1333
1334dlytimで指定された以上の時間(単位はナノ秒),ループなどによって待
1335つ関
1336数.
1337
1338以下の関数と等価な処理を,アセンブリ言語で記述する方法を,標準的な実装
1339
1340方法とする.アセンブリ言語で記述するのは,コンパイラの最適化に依存しな
1341いようにするためである.またこの関数は,キャッシュ等の影響を受けないよ
1342うに,できる限りメモリアクセスを行わないように実装
1343すべきである.
1344
1345 void sil_dly_nse(ulong_t dlytim)
1346 {
1347 dlytim -= SIL_DLY_TIM1;
1348 if (結果が0より大きい) {
1349 do {
1350 dlytim -= SIL_DLY_TIM2;
1351 } while (結果が0より大きい);
1352 }
1353 }
1354
1355この関数の動作は次の通りである.dlytimがSIL_DLY_TIM1以下の場合には,最
1356初のif文の条件が成立せず,すぐに関数から抜ける.dlytimがSIL_DLY_TIM1よ
1357り大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2)以下の場合には,最初のif文の条件は
1358成立するが,doループは1回も回らずに関数から抜ける.dlytimが
1359(SIL_DLY_TIM1+SIL_DLY_TIM2)より大きく,(SIL_DLY_TIM1+SIL_DLY_TIM2*2)以
1360下の場合には,doループを1回だけ回って関数から抜ける.その後,dlytimが
1361SIL_DLY_TIM2大きくなる度に,whileループを回る回数が1回ずつ増える.
1362
1363なお,この関数をアセンブリ言語(または,C言語)で記述する場合,どのファ
1364イルに記述するかが問題になる.SILのターゲット依存部には,標準では,アセ
1365ンブリ言語(または,C言語)の関数定義を記述するためのファイルを用意して
1366いない.ターゲット依存で用意してもよいが,例外的に,カーネル実装
1367のター
1368ゲット依存モジュール(target_support.Sまたはtarget_config.c)に記述して
1369もよいことにする.
1370
1371(4-2-2) SIL_DLY_TIM1(オプション)
1372(4-2-3) SIL_DLY_TIM2(オプション)
1373
1374sil_dly_nseを上記の標準的な方法で実現した場合,この2つの定数をターゲッ
1375ト依存部でマクロ定義する.
1376
1377SIL_DLY_TIM2は,上記の関数において,doループ1回の実行時間(単位はナノ秒)
1378に設定する.ターゲットプロセッサの命令セットにもよるが,おおよそ,減算
1379命令と条件分岐命令各1回の実行時間になる.SIL_DLY_TIM2が決まれば,関数呼
1380出しも含めたå…
1381¨ä½“の時間がdlytimで指定された以上の時間になるように,
1382SIL_DLY_TIM1を決める.
1383
1384この2つの定数値の決定を支援するプログラムとして,testディレクトリに,
1385test_dlynseを用意している.test_dlynseを実行すると,次のような出力が得
1386られる.
1387
1388-- for fitting parameters --
1389sil_dly_nse(0): 430 OK
1390sil_dly_nse(420): 430 OK
1391sil_dly_nse(510): 520 OK
1392sil_dly_nse(600): 610 OK
1393<中略>
1394-- for checking boundary conditions --
1395sil_dly_nse(421): 520 OK
1396sil_dly_nse(511): 610 OK
1397sil_dly_nse(601): 700 OK
1398
1399"for fitting parameters"に続く出力は,sil_dly_nse(dlytim)を呼び出した場
1400合の待
1401ち時間を測定した結果である.このプログラムを用いて,":"の右側の数
1402値が,dlytimよりも大きい範囲でなるべく近い値になるように,2つの定数値を
1403調整する."for checking boundary conditions"に続く出力は,プログラムの
1404妥当性をチェックするためのもので,":"の右側の数値が,dlytimよりも大きい
1405ことを確認する(近い値になる必
1406要はない).
1407
14084.3 プロセッサのエンディアン
1409
1410(4-3-1) SIL_ENDIAN_BIG
1411(4-3-2) SIL_ENDIAN_LITTLE
1412
1413プロセッサのエンディアンにより,いずれか片方のシンボルをマクロ定義する.
1414
1415(4-3-3) TOPPERS_SIL_REV_ENDIAN_UINT16(オプション)
1416(4-3-4) TOPPERS_SIL_REV_ENDIAN_UINT32(オプション)
1417
1418それぞれ,16ビット,32ビットの符号無し整数のエンディアンを反転させるマ
1419クロ.プロセッサがエンディアン反転のための命令を持つ場合には,その命令
1420を用いて実現する.これらのシンボルをマクロ定義しない場合には,デフォル
1421トの定義が使われる.
1422
14234.4 メモリ空間アクセス関数
1424
1425(4-4-1) TOPPERS_OMIT_SIL_ACCESS
1426
1427標準のメモリ空間アクセス関数を使用せず,ターゲット依存部で用意する場合
1428には,このシンボルをマクロ定義する.
1429
1430(4-4-2) TOPPERS_OMIT_SIL_REH_LEM
1431(4-4-3) TOPPERS_OMIT_SIL_WRH_LEM
1432(4-4-4) TOPPERS_OMIT_SIL_REH_BEM
1433(4-4-5) TOPPERS_OMIT_SIL_WRH_BEM
1434(4-4-6) TOPPERS_OMIT_SIL_REW_LEM
1435(4-4-7) TOPPERS_OMIT_SIL_WRW_LEM
1436(4-4-8) TOPPERS_OMIT_SIL_REW_BEM
1437(4-4-9) TOPPERS_OMIT_SIL_WRW_BEM
1438
1439それぞれ,標準のsil_reh_lem,sil_wrh_lem,sil_reh_bem,sil_wrh_bem,
1440sil_rew_lem,sil_wrw_lem,sil_rew_bem,sil_wrw_bemを使用せず,ターゲッ
1441ト依存部で用意する場合には,これらのシンボルをマクロ定義する.
1442
14434.5 I/O空間アクセス関数
1444
1445メモリ空間とは別にI/O空間を持つプロセッサでは,I/O空間にあるデバイスレ
1446ジスタをアクセスするための関数として,sil_reb_iop,sil_wrb_iop,
1447sil_reh_iop,sil_wrh_iop,sil_reh_lep,sil_wrh_lep,sil_reh_bep,
1448sil_wrh_bep,sil_rew_iop,sil_wrw_iop,sil_rew_lep,sil_wrw_lep,
1449sil_rew_bep,sil_wrw_bepの中で必
1450要なものを,ターゲット依存部で用意する.
1451
1452
14535.カーネルAPIのターゲット依存部
1454
1455カーネルAPI(kernel.h)のターゲット依存部の定義は,target_kernel.hまた
1456はそこからインクルードされるファイル(プロセッサ・チップ・開発環境依存
1457部で用意されるヘッダファイルなど)に含める.
1458
14595.1 ターゲット定義でサポートする機能
1460
1461(5-1-1) TOPPERS_TARGET_SUPPORT_DIS_INT dis_intをサポートする
1462(5-1-2) TOPPERS_TARGET_SUPPORT_ENA_INT ena_intをサポートする
1463(5-1-3) TOPPERS_TARGET_SUPPORT_GET_UTM get_utmをサポートする
1464
1465dis_int,ena_int,get_utmをサポートする場合に,それぞれのシンボルをマク
1466ロ定義する.
1467
14685.2 割込み優å…
1469ˆåº¦ã®ç¯„囲
1470
1471(5-2-1) TMIN_INTPRI 割込み優å…
1472ˆåº¦ã®æœ€å°å€¤ï¼ˆæœ€é«˜å€¤ï¼‰
1473(5-2-2) TMAX_INTPRI 割込み優å…
1474ˆåº¦ã®æœ€å¤§å€¤ï¼ˆæœ€ä½Žå€¤ï¼‰
1475
1476それぞれ,カーネル管理の割込み優å…
1477ˆåº¦ã®æœ€å°å€¤ï¼ˆï¼å„ªå…
1478ˆåº¦ãŒæœ€é«˜ï¼‰ï¼Œã‚«ãƒ¼ãƒ
1479ル管理の割込み優å…
1480ˆåº¦ã®æœ€å¤§å€¤ï¼ˆå„ªå…
1481ˆåº¦ãŒæœ€ä½Žï¼‰ã«å®šç¾©ã™ã‚‹ï¼ŽTMAX_INTPRIは-1
1482に固定されているが,対称性のために,ターゲット依存部で定義することにし
1483ている.
1484
14855.3 タイムティックの定義
1486
1487(5-3-1) TIC_NUME タイムティックの周期の分子
1488(5-3-2) TIC_DENO タイムティックの周期の分母
1489
1490タイムティックの周期(signal_timeを呼び出す周期)を,ミリ秒単位で,
1491TIC_NUME/TIC_DENOに定義する.例えば,タイムティックの周期が1/30秒の場合
1492には,TIC_NUMEを100に,TIC_DENOを3に定義すればよい.
1493
1494タイムティックの周期は,1ミリ秒とする(つまり,TIC_NUME,TIC_DENOとも1
1495に定義する)ことを推奨するが,シミュレーション環境や性能の低いプロセッ
1496サでそれが適切でない場合には,それ以外の値としてもよい.その場合でも,
1497可能な限り,1ミリ秒の倍数である(つまり,TIC_DENOを1に定義する)ことが
1498望ましい.
1499
1500TIC_NUMEとTIC_DENOの定義を変更することで,タイムティックの周期を変更で
1501きるようにタイマドライバを実装
1502する場合には,この2つの定数の定義はデフォ
1503ルト値を与えていることになる.そこで,これらの定義を「#ifndef TIC_NUME」
1504「#endif」で囲んで記述する.
1505
15065.4 メモリ領域確保のための型定義
1507
1508(5-4-1) TOPPERS_STK_T スタック領域を確保するための型(オプション)
1509(5-4-2) TOPPERS_MPF_T 固定長メモリプール領域を確保するための型(オプション)
1510
1511スタック領域と固定長メモリプール領域は,標準では,intptr_t型のé…
1512åˆ—とし
1513て確保するが,より大きい単位でアラインさせたいなどの理由で,それ以外の
1514型のé…
1515åˆ—として確保する場合には,それぞれTOPPERS_STK_TとTOPPERS_MPF_Tを,
1516é…
1517åˆ—のベースとなるデータ型にマクロ定義する.
1518
15195.5 ビットパターンのビット数
1520
1521(5-5-1) TBIT_TEXPTN タスク例外要因のビット数(オプション)
1522(5-5-2) TBIT_FLGPTN イベントフラグのビット数(オプション)
1523
1524TBIT_TEXPTN,TBIT_FLGPTNの標準の定義では,整数型の有効ビット数が,その
1525型のsizeofにCHAR_BITを乗じたものと一致していることを仮定している.多く
1526のコンパイラでこの仮定が成り立つが,そうでない場合には,ターゲット依存
1527部でこれらの定義を上書きする必
1528要がある.ただし,これらの値は16以上でな
1529ければならない.
1530
15315.6 メモリ領域確保のためのマクロ
1532
1533(5-6-1) TOPPERS_ROUND_SZ(オプション)
1534(5-6-2) TOPPERS_COUNT_SZ(オプション)
1535
1536TOPPERS_COUNT_SZ(sz, unit)は,sz/unitを切り上げた値を求めるマクロで,サ
1537イズがszのメモリ領域をサイズがunitのデータ型のé…
1538åˆ—で確保する場合の要素
1539数を求めるために用いる.TOPPERS_ROUND_SZ(sz, unit)は,sz/unitを切り上げ
1540たものにunitをかけた値を求めるマクロで,サイズがszのメモリ領域をサイズ
1541がunitのデータ型のé…
1542åˆ—で確保する場合のトータルサイズを求めるために用い
1543る.
1544
1545それぞれ,標準のTOPPERS_ROUND_SZ,TOPPERS_COUNT_SZが適切でなく,ターゲッ
1546ト依存部で用意する場合には,これらのシンボルを適切な値にマクロ定義する.
1547
15485.7 オーバランハンドラ機能拡張のための定義(オプション)
1549
1550オーバランハンドラ機能拡張パッケージをサポートする(使用できるようにす
1551る)場合には,次の3つを実施することが必
1552要である.
1553
1554・この節で説明する定義を行う.
1555・6章に示すコード中で,TOPPERS_SUPPORT_OVRHDRがマクロ定義されている場
1556 合にのみ有効となるコードを実装
1557する.
1558・オーバランタイマドライバを用意する.オーバランタイマドライバについて
1559 は,「6.14 オーバランタイマドライバ」の節を参ç…
1560§ã™ã‚‹ã“と.
1561
1562(5-7-1) TOPPERS_TARGET_SUPPORT_OVRHDR
1563
1564オーバランハンドラ機能拡張パッケージをサポートする場合には,このシンボ
1565ルをマクロ定義する.
1566
1567(5-7-2) TMAX_OVRTIM(オプション,デフォルトはULONG_MAX)
1568
1569プロセッサ時間としてオーバランタイマに設定できる最大値(単位はマイクロ
1570秒)にマクロ定義する.
1571
1572
15736.カーネル実装
1574のターゲット依存部
1575
15766.1 カーネル実装
1577のターゲット依存部のå…
1578±é€šäº‹é …
1579
1580
15816.1.1 カーネル実装
1582のターゲット依存部の構成要素
1583
1584カーネル実装
1585のターゲット依存部は,以下の要素で構成される.
1586
1587(a) カーネル実装
1588のターゲット依存の定義
1589
1590カーネル実装
1591のターゲット非依存部から参ç…
1592§ã•ã‚Œã‚‹ã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜ã®å®šç¾©ã¯ï¼Œ
1593target_config.hまたはそこからインクルードされるファイル(プロセッサ・チッ
1594プ・開発環境依存部で用意されるヘッダファイルなど)に含める.
1595
1596ターゲットのハードウェア資源(割込みハンドラ番号やCPU例外ハンドラ番号,
1597デバイスレジスタの番地など)の定義は,システムサービスやアプリケーショ
1598ンにも有用であるため,カーネル実装
1599のみに有用な定義を含むファイルとは切
1600り分けて,独立したヘッダファイルに含める.このヘッダファイルの標準的な
1601名称を,システム略称.h(または,チップ略称.h,プロセッサ略称.h)とする.
1602
1603(b) カーネル実装
1604のターゲット依存モジュール
1605
1606カーネル実装
1607のターゲット依存の変数定義や関数を含むモジュール.C言語で記
1608述される部分をtarget_config.c,アセンブリ言語で記述される部分を
1609target_support.Sに含める.プロセッサ・チップ・開発環境依存部を切り分け
1610ることや,ファイルが大きくなる場合に複数のファイルに分割することも可能
1611である.
1612
1613(c) カーネル実装
1614のターゲット依存部のためのリネーム記述
1615
1616カーネル実装
1617のターゲット依存部の変数名や関数名を,å…
1618ˆé ­ã«_kernel_を付与
1619した名前にリネームするためのモジュール.target_rename.defを用意し,ツー
1620ル(utils/genrename)により,target_rename.hとtarget_unrename.hを生成す
1621る.プロセッサ・チップ・開発環境依存部を切り分ける場合には,リネーム記
1622述も切り分ける.
1623
1624(d) タイマドライバ
1625
1626カーネルにタイムティックを通知する(signal_timeを周期的に呼び出す)ため
1627のタイマドライバのヘッダファイル,実装
1628ファイル,システムコンフィギュレー
1629ションファイルを,それぞれ,target_timer.h,target_timer.c,
1630target_timer.cfgに含める.プロセッサ・チップ・開発環境依存部を切り分け
1631ることも可能である.
1632
1633また,オーバランハンドラ機能拡張パッケージをサポートする場合には,オー
1634バランハンドラを起動する(call_ovrhdrを呼び出す)ためのオーバランタイマ
1635ドライバも,同じファイルに含める.
1636
1637なお,この章に示すコード中で,TOPPERS_SUPPORT_OVRHDRがマクロ定義されて
1638いる場合にのみ有効となるコードは,オーバランハンドラ機能拡張パッケージ
1639をサポートしない場合には,実装
1640する必
1641要がない.
1642
1643(e) コンフィギュレータ設定ファイル
1644
1645コンフィギュレータの設定ファイルのターゲット依存部を,target_def.csv,
1646target.tf,target_check.tfに用意する.コンフィギュレータ設定ファイルの
1647記述方法については,7章で説明する.
1648
16496.1.2 ターゲット依存部の関数の命名規則
1650
1651カーネル実装
1652のターゲット依存部を構成する関数の中で,t_で始まるものはタ
1653スクコンテキスト専用,i_で始まるものは非タスクコンテキスト専用,x_で始
1654まるものはいずれのコンテキストからでも呼び出すことができる関数である.
1655
16566.2 トレースログ機能への対応
1657
1658カーネルのトレースログ機能の中で,ディスパッチャ,割込みハンドラ,CPU例
1659外ハンドラの開始・終了のトレースログ取得は,ターゲット依存部で実装
1660する
1661必
1662要がある.ほとんどのターゲットシステムにおいて,それらの処理はアセン
1663ブリ言語で記述されており,ターゲット非依存部向けのトレースログマクロと
1664同じ方法(トレースログマクロを,トレースログ取得処理のC言語記述にマクロ
1665定義する方法)は,用いることができない.
1666
1667そこで,アセンブリ言語で記述されている処理中にトレースログ取得を埋め込
1668む場合には,トレースログマクロが定義されていれば,それが何に定義されて
1669いるかは無視して,標準的なトレースログ関数がC言語で記述されていると想定
1670して,それを呼び出すようにコーディングする.
1671
1672å…
1673·ä½“的には,下の表の左側に示したトレースログマクロが定義されていれば,
1674表の右側に示したC言語記述と同等の処理を行うようにコーディングする.
1675
1676 トレースログマクロ トレースログ取得処理
1677 -----------------------------------------------
1678 LOG_DSP_ENTER log_dsp_enter(p_runtsk)
1679 LOG_DSP_LEAVE log_dsp_leave(p_runtsk)
1680 LOG_INH_ENTER log_inh_enter(inhno)
1681 LOG_INH_LEAVE log_inh_leave(inhno)
1682 LOG_EXC_ENTER log_exc_enter(excno)
1683 LOG_EXC_LEAVE log_exc_leave(excno)
1684
16856.3 システム状æ…
1686‹ã®ç®¡ç†
1687
1688ASPカーネルを新たなターゲットシステムにポーティングする際に,最も重要な
1689作業は,カーネルが定義するシステム状æ…
1690‹ã‚’,ハードウェア(プロセッサ)上
1691でどのように実現するかである.以下の説明は,TOPPERS新世代カーネルにおけ
1692るシステム状æ…
1693‹ã®å®šç¾©ãƒ»æ„å‘³ã‚’知っていることを前提に記述している.
1694
16956.3.1 å…
1696¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
1697‹ã®ç®¡ç†
1698
1699å…
1700¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
1701‹ã¯ï¼ŒNMIを除くすべての割込みをマスクした状æ…
1702‹ã§ã‚る.å…
1703¨
1704割込みロック状æ…
1705‹ã‚’管理する機能は,システムインタフェースレイヤ(SIL)に
1706よって提供され,カーネルはå…
1707¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
1708‹ã‚’管理しない.
1709
1710å…
1711¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
1712‹ã§ã¯ï¼Œsns_kerとext_ker以外のカーネルのサービスコール
1713を呼ぶことはできないものとしており,呼んだ場合には何が起こるか保証して
1714いない.sns_kerとext_kerから呼び出す処理は,トレースログ取得処理とSILの
1715サービスコールを除くと,call_exit_kernelのみである.そのため,
1716call_exit_kernelから呼び出すものを除いて,カーネルのターゲット依存部の
1717関数が,å…
1718¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
1719‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹çŠ¶æ³ã¯è€ƒãˆã‚‹å¿…
1720要がない.
1721
17226.3.2 コンテキストの管理
1723
1724処理単位が実行されるコンテキストは,タスクコンテキストと非タスクコンテ
1725キストに分類される.
1726
1727ターゲット依存部は,実行中の処理単位が,タスクコンテキストで実行されて
1728いるか非タスクコンテキストで実行されているかを判別する機能を提供する.
1729また,CPU例外が発生したコンテキストについて判別する機能を提供する.
1730
1731ターゲット依存部では,割込みハンドラとCPU例外ハンドラのå…
1732¥å£å‡¦ç†ã§éžã‚¿ã‚¹
1733クコンテキストに切り換え,それらの出口処理でå…
1734ƒã®ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«æˆ»ã™ï¼Žã¾
1735た,ディスパッチャの内
1736部で一時的に非タスクコンテキストに切り換える.
1737
1738(6-3-2-1) bool_t sense_context(void)
1739
1740実行中の処理単位が,タスクコンテキストで実行されている場合にはfalse,非
1741タスクコンテキストで実行されている場合にはtrueを返す関数.この関数は,
1742CPUロック状æ…
1743‹ã§ã‚‚CPUロック解除状æ…
1744‹ã§ã‚‚呼び出せるように実装
1745しなければな
1746らない.
1747
17486.3.3 CPUロック状æ…
1749‹ã®ç®¡ç†
1750
1751ターゲット依存部は,CPUロック状æ…
1752‹ã¸é·ç§»ã™ã‚‹æ©Ÿèƒ½ï¼ŒCPUロック解除状æ…
1753‹ã¸é·
1754移する機能,CPUロック状æ…
1755‹ã§ã‚るかを判別する機能を提供する.
1756
1757(6-3-3-1) void t_lock_cpu(void)
1758(6-3-3-2) void i_lock_cpu(void)
1759(6-3-3-3) void x_lock_cpu(void)
1760
1761CPUロック解除状æ…
1762‹ã‹ã‚‰ï¼ŒCPUロック状æ…
1763‹ã¸é·ç§»ã•ã›ã‚‹é–¢æ•°ï¼Žã“れらの関数は,
1764CPUロック状æ…
1765‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ã“とはなく,呼び出された場合の動作は保証する
1766必
1767要がない.
1768
1769これらの関数を実現する際には,「1.6 クリティカルセクションの出å…
1770¥å‡¦ç†ã®
1771実現に関する制約」の節に記述されている制約に従わなければならない.
1772
1773(6-3-3-4) void t_unlock_cpu(void)
1774(6-3-3-5) void i_unlock_cpu(void)
1775(6-3-3-6) void x_unlock_cpu(void)
1776
1777CPUロック状æ…
1778‹ã‹ã‚‰ï¼ŒCPUロック解除状æ…
1779‹ã¸é·ç§»ã•ã›ã‚‹é–¢æ•°ï¼Žã“れらの関数は,
1780CPUロック解除状æ…
1781‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ã“とはなく,呼び出された場合の動作は保証
1782する必
1783要がない.
1784
1785タスクコンテキストでCPUロック状æ…
1786‹ã«é·ç§»ã—た場合には,CPUロック解除状æ…
1787‹
1788に戻るのはタスクコンテキストに限られ,非タスクコンテキストでCPUロック解
1789除状æ…
1790‹ã«æˆ»ã‚‹ã“とはない.言い換えると,t_unlock_cpuが呼び出されるのは,
1791t_lock_cpuによってCPUロック状æ…
1792‹ã«ãªã£ã¦ã„る時である.i_lock_cpuによって
1793CPUロック状æ…
1794‹ã«ãªã£ã¦ã„る時には,t_unlock_cpuが呼び出されることはない.
1795
1796同様に,非タスクコンテキストでCPUロック状æ…
1797‹ã«é·ç§»ã—た場合には,CPUロッ
1798ク解除状æ…
1799‹ã«æˆ»ã‚‹ã®ã¯éžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã«é™ã‚‰ã‚Œï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§
1800CPUロック解除状æ…
1801‹ã«æˆ»ã‚‹ã“とはない.言い換えると,i_unlock_cpuが呼び出さ
1802れるのは,i_lock_cpuによってCPUロック状æ…
1803‹ã«ãªã£ã¦ã„る時である.
1804t_lock_cpuによってCPUロック状æ…
1805‹ã«ãªã£ã¦ã„る時には,i_unlock_cpuが呼び出
1806されることはない.
1807
1808これらの関数を実現する際には,「1.6 クリティカルセクションの出å…
1809¥å‡¦ç†ã®
1810実現に関する制約」の節に記述されている制約に従わなければならない.
1811
1812(6-3-3-7) bool_t t_sense_lock(void)
1813(6-3-3-8) bool_t i_sense_lock(void)
1814(6-3-3-9) bool_t x_sense_lock(void)
1815
1816現在のシステム状æ…
1817‹ãŒï¼ŒCPUロック状æ…
1818‹ã®å ´åˆã¯true,CPUロック解除状æ…
1819‹ã®å ´
1820合にはfalseを返す関数.
1821
1822これらの関数がå…
1823¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
1824‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹çŠ¶æ³ã¯è€ƒãˆã‚‹å¿…
1825要がないこ
1826とから,å…
1827¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
1828‹ã¨CPUロック状æ…
1829‹ã‚’区別できる必
1830要はない.NMI以
1831外にカーネルの管理外の割込みを設けない場合には,å…
1832¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
1833‹ã¨
1834CPUロック状æ…
1835‹ãŒå…
1836¨ãåŒä¸€ã®çŠ¶æ…
1837‹ã§ã‚‚かまわない.
1838
18396.4 割込みに関連するシステム状æ…
1840‹ã®ç®¡ç†
1841
18426.4.1 割込み優å…
1843ˆåº¦ãƒžã‚¹ã‚¯ã®ç®¡ç†
1844
1845ターゲット依存部は,割込み優å…
1846ˆåº¦ãƒžã‚¹ã‚¯ã‚’設定する機能と,割込み優å…
1847ˆåº¦ãƒž
1848スクを参ç…
1849§ã™ã‚‹æ©Ÿèƒ½ã‚’提供する.
1850
1851(6-4-1-1) bool_t VALID_INTPRI_CHGIPM(PRI intpri)(オプション)
1852
1853intpriが,chg_ipmに対する割込み優å…
1854ˆåº¦ã¨ã—て有効な値である場合にtrue,そ
1855うでない場合にfalseを返すマクロ.標準では,TMIN_INTPRI以上,TIPM_ENAALL
1856(=0)以下の値がchg_ipmに対する割込み優å…
1857ˆåº¦ã¨ã—て有効であるが,ターゲッ
1858ト依存部でこのマクロを定義することで,TMIN_INTPRIよりも小さい値を有効と
1859することができる(有効な値の範囲を狭めてはならない).
1860
1861(6-4-1-2) void x_set_ipm(PRI intpri)
1862(6-4-1-3) void t_set_ipm(PRI intpri)
1863(6-4-1-4) void i_set_ipm(PRI intpri)
1864
1865割込み優å…
1866ˆåº¦ãƒžã‚¹ã‚¯ã®å€¤ã‚’intpriに設定する関数.
1867
1868これらの関数は,CPUロック状æ…
1869‹ã§ã‚‚CPUロック解除状æ…
1870‹ã§ã‚‚呼び出せるように
1871実装
1872するのが望ましい.ただし,x_set_ipmとt_set_ipmは,ターゲット非依存
1873部がCPUロック解除状æ…
1874‹ã§å‘¼ã³å‡ºã™ã“とはないため,CPUロック解除状æ…
1875‹ã§å‘¼ã³
1876出された場合の動作は保証する必
1877要がない.i_set_ipmは,CPUロック状æ…
1878‹ã§ã‚‚
1879CPUロック解除状æ…
1880‹ã§ã‚‚呼び出せるように実装
1881しなければならない.
1882
1883また,これらの関数は,VALID_INTPRI_CHGIPM(intpri)がtrueを返すintpriに対
1884してのみ呼ばれる.intpriにそうでない値が渡された場合の動作は保証する必
1885
1886要がない.
1887
1888(6-4-1-5) PRI x_get_ipm(void)
1889(6-4-1-6) PRI t_get_ipm(void)
1890(6-4-1-7) PRI i_get_ipm(void)
1891
1892割込み優å…
1893ˆåº¦ãƒžã‚¹ã‚¯ã®å€¤ã‚’参ç…
1894§ã—て返す関数.
1895
1896これらの関数は,CPUロック状æ…
1897‹ã§ã‚‚CPUロック解除状æ…
1898‹ã§ã‚‚呼び出せるように
1899実装
1900するのが望ましい.ただし,x_get_ipmとt_get_ipmは,ターゲット非依存
1901部がCPUロック解除状æ…
1902‹ã§å‘¼ã³å‡ºã™ã“とはないため,CPUロック解除状æ…
1903‹ã§å‘¼ã³
1904出された場合の動作は保証する必
1905要がない.i_get_ipmは,CPUロック状æ…
1906‹ã§ã‚‚
1907CPUロック解除状æ…
1908‹ã§ã‚‚呼び出せるように実装
1909しなければならない.
1910
1911割込み優å…
1912ˆåº¦ãƒžã‚¹ã‚¯ã‚’用いてカーネル管理の割込みをすべてマスクした状æ…
1913‹ã¯ï¼Œ
1914CPUロック状æ…
1915‹ã¨åŒºåˆ¥ã§ãã‚‹ã“とが必
1916要である.å…
1917·ä½“的には,CPUロック解除状
1918æ…
1919‹ã«ãŠã„て,x_set_ipmを用いてカーネル管理の割込みをすべてマスクした場合
1920でも,x_sense_lockはfalseを返す.
1921
1922それに対して,割込み優å…
1923ˆåº¦ãƒžã‚¹ã‚¯ã‚’用いてNMIを除くすべての割込みをマスク
1924できる場合,その状æ…
1925‹ã¨å…
1926¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
1927‹ã‚’区別できる必
1928要はなく,å…
1929¨ãåŒ
1930一の状æ…
1931‹ã§ã‚‚かまわない.
1932
19336.4.2 割込み要求禁止フラグの管理
1934
1935ターゲット依存部は,割込み要求禁止フラグをセットする機能とクリアする機
1936能を提供する.
1937
1938(6-4-2-1) bool_t VALID_INTNO_DISINT(INTNO intno)
1939
1940intnoが,dis_int/ena_intに対する割込み番号として有効な値である場合に
1941true,そうでない場合にfalseを返すマクロ.割込み要求禁止フラグがセット/
1942クリアできないintnoに対しては,このマクロがfalseを返すようにする.
1943
1944(6-4-2-2) bool_t x_disable_int(INTNO intno)
1945(6-4-2-3) bool_t t_disable_int(INTNO intno)
1946(6-4-2-4) bool_t i_disable_int(INTNO intno)
1947
1948intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをセットし,
1949trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ
1950れていない場合には,falseを返す.
1951
1952これらの関数は,ターゲット非依存部がCPUロック解除状æ…
1953‹ã§å‘¼ã³å‡ºã™ã“とはな
1954いため,CPUロック解除状æ…
1955‹ã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã®å‹•ä½œã¯ä¿è¨¼ã™ã‚‹å¿…
1956要がない.
1957ただし,ターゲット依存部からCPUロック解除状æ…
1958‹ã§å‘¼ã³å‡ºã™å ´åˆã«ã¯ï¼Œä¿è¨¼ã™
1959る必
1960要がある.
1961
1962また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し
1963てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必
1964要が
1965ない.
1966
1967dis_intサービスコールをサポートする場合(TOPPERS_SUPPORT_DIS_INTをマク
1968ロ定義する場合)には,t_disable_intが用意されていなければならない.
1969
1970(6-4-2-5) bool_t x_enable_int(INTNO intno)
1971(6-4-2-6) bool_t t_enable_int(INTNO intno)
1972(6-4-2-7) bool_t i_enable_int(INTNO intno)
1973
1974intnoで指定された割込み要求ラインに対する割込み要求禁止フラグをクリアし,
1975trueを返す関数.指定された割込み要求ラインに対して,割込み属性が設定さ
1976れていない場合には,falseを返す.
1977
1978これらの関数は,ターゲット非依存部がCPUロック解除状æ…
1979‹ã§å‘¼ã³å‡ºã™ã“とはな
1980いため,CPUロック解除状æ…
1981‹ã§å‘¼ã³å‡ºã•ã‚ŒãŸå ´åˆã®å‹•ä½œã¯ä¿è¨¼ã™ã‚‹å¿…
1982要がない.
1983ただし,ターゲット依存部からCPUロック解除状æ…
1984‹ã§å‘¼ã³å‡ºã™å ´åˆã«ã¯ï¼Œä¿è¨¼ã™
1985る必
1986要がある.
1987
1988また,これらの関数は,VALID_INTNO_DISINT(intno)がtrueとなるintnoに対し
1989てのみ呼ばれる.intnoにそうでない値が渡された場合の動作は保証する必
1990要が
1991ない.
1992
1993ena_intサービスコールをサポートする場合(TOPPERS_SUPPORT_ENA_INTをマク
1994ロ定義する場合)には,t_enable_intが用意されていなければならない.
1995
19966.4.3 割込み要求のクリア
1997
1998(6-4-3-1) void x_clear_int(INTNO intno)
1999(6-4-3-2) void t_clear_int(INTNO intno)
2000(6-4-3-3) void i_clear_int(INTNO intno)
2001
2002intnoで指定された割込み要求ラインがエッジトリガである場合に,トリガされ
2003た割込み要求をクリアする関数.intnoで指定された割込み要求ラインがレベル
2004トリガである場合には何もしない.
2005
2006ASPカーネルのターゲット非依存部では,これらの関数を呼び出していないが,
2007ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する
2008こととしている.そのため,これらの関数がどのようなシステム状æ…
2009‹ã§å‘¼ã³å‡º
2010せるかは,ターゲット依存部内
2011で一貫していればよい.
2012
20136.4.4 割込み要求のプローブ
2014
2015(6-4-4-1) bool_t x_probe_int(INTNO intno)
2016(6-4-4-2) bool_t t_probe_int(INTNO intno)
2017(6-4-4-3) bool_t i_probe_int(INTNO intno)
2018
2019intnoで指定された割込み要求ラインに対して,割込みが要求されている場合に
2020true,そうでない場合にfalseを返す関数.
2021
2022ASPカーネルのターゲット非依存部では,これらの関数を呼び出していないが,
2023ターゲット依存部やシステムサービスで呼び出す可能性が高いため,用意する
2024こととしている.そのため,これらの関数がどのようなシステム状æ…
2025‹ã§å‘¼ã³å‡º
2026せるかは,ターゲット依存部内
2027で一貫していればよい.
2028
20296.4.5 割込みハンドラのå…
2030ˆé ­å‡¦ç†ã¨æœ«å°¾å‡¦ç†
2031
2032(6-4-5-1) void i_begin_int(INTNO intno)
2033
2034intnoで指定された割込み要求ラインに対する割込みハンドラのå…
2035ˆé ­ã§è¡Œã†ã¹ã
2036処理を行う関数.ここで行うべき処理としては,割込み要求ラインがエッジト
2037リガである場合のトリガされた割込み要求のクリアが挙げられる.
2038
2039intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの
2040å…
2041ˆé ­ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žãã®ãŸã‚ã“の関数は,割込みハンドラのå…
2042ˆé ­ï¼ˆé€šå¸¸ã¯
2043CPUロック解除状æ…
2044‹ï¼‰ã§å‘¼ã³å‡ºã›ã‚‹ã‚ˆã†ã«å®Ÿè£…
2045しなければならない.
2046
2047(6-4-5-2) void i_end_int(INTNO intno)
2048
2049intnoで指定された割込み要求ラインに対する割込みハンドラの末尾で行うべき
2050処理を行う関数.ここで行うべき処理としては,割込みコントローラ(IRC)に
2051対する割込み処理の終了通知が挙げられる.
2052
2053intnoに対して登録された割込みサービスルーチンを呼び出す割込みハンドラの
2054末尾で呼び出される.そのためこの関数は,割込みハンドラの末尾(通常は
2055CPUロック解除状æ…
2056‹ï¼‰ã§å‘¼ã³å‡ºã›ã‚‹ã‚ˆã†ã«å®Ÿè£…
2057しなければならない.
2058
2059ターゲットによっては,IRCに対する割込み処理の終了通知を行う前に,すべて
2060の割込みを禁止しなければならない場合がある.この場合には,この関数の中
2061で割込みを禁止し,その状æ…
2062‹ã®ã¾ã¾ï¼Œå‰²è¾¼ã¿ãƒãƒ³ãƒ‰ãƒ©ã‹ã‚‰ãƒªã‚¿ãƒ¼ãƒ³ã™ã‚‹ï¼Žå‰²è¾¼
2063みハンドラからのリターン前には,割込み禁止を解除するのが原則であるが,
2064割込みハンドラの出口処理でå…
2065ƒã«æˆ»ã™å‡¦ç†ã‚’行うので差し支えないはずである.
2066割込みハンドラの出口処理が,これで差し支えない実装
2067になっていることを確
2068認するべきである.
2069
20706.5 タスクディスパッチャ
2071
20726.5.1 タスクコンテキストブロックとタスク初期化コンテキストブロック
2073
2074(6-5-1-1) TSKCTXB
2075
2076ターゲット依存のタスクコンテキストを保存するために,TCB中に持つことが必
2077
2078要なデータ構造の型を,TSKCTXBに定義する.標準的には,TSKCTXBには,タス
2079クのスタックポインタと実行再開番地を格納する.
2080
2081(6-5-1-2) USE_TSKINICTXB(オプション)
2082(6-5-1-3) TSKINICTXB(オプション)
2083
2084ターゲット依存の情
2085報をタスク初期化ブロック(TINIB)にå…
2086¥ã‚ŒãŸã„場合や,
2087TINIB中のスタック領域のサイズとå…
2088ˆé ­ç•ªåœ°ã®æŒã¡æ–¹ã‚’ターゲット依存に変更し
2089たい場合には,USE_TSKINICTXBをマクロ定義し,TINIB中に持つことが必
2090要なデー
2091タ構造の型を,TSKINICTXBに定義する.
2092
2093USE_TSKINICTXBをマクロ定義すると,TINIB中にスタック領域とサイズとå…
2094ˆé ­ç•ª
2095地が含まれなくなるため,それに代わる情
2096報をTSKINICTXB中に持つ必
2097要がある.
2098また,コンフィギュレータのパス2のテンプレートファイルのターゲット非依存
2099部で,TSKINICTXBの初期化情
2100報を生成するためのGENERATE_TSKINICTXBを,パス
21013のテンプレートファイルのターゲット非依存部で,TINIBからスタック領域の
2102å…
2103ˆé ­ç•ªåœ°ã‚’取り出すためのGET_STK_TSKINICTXBを定義する必
2104要がある.
2105
21066.5.2 ディスパッチャ本体
2107
2108ディスパッチャ本体(dispatcher)は,ターゲット非依存部から直接呼び出さ
2109れることはなく,カーネルのターゲット依存部の内
2110部からのみ呼び出される.
2111dispatcherは,タスクコンテキスト・CPUロック状æ…
2112‹ãƒ»å‰²è¾¼ã¿å„ªå…
2113ˆåº¦ãƒžã‚¹ã‚¯å…
2114¨è§£
2115除状æ…
2116‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ…
2117‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
2118
2119dispatcherの処理内
2120容は次の通り.
2121
2122----------------------------------------
2123void
2124dispatcher(void)
2125{
2126#ifdef LOG_DSP_ENTER
2127 log_dsp_enter(p_runtsk);
2128#endif /* LOG_DSP_ENTER */
2129 dispatcher_0:
2130 while ((p_runtsk = p_schedtsk) == NULL) {
2131 割込みを許可したらCPUロック解除状æ…
2132‹ã«ãªã‚‹ã‚ˆã†æº–備する
2133 非タスクコンテキストに切り換える … (*1)
2134 do {
2135 割込みをすべて許可し,割込み発生を待
2136つ … (*2)
2137 割込み許可前の状æ…
2138‹ã«æˆ»ã™ï¼ˆï¼ã‚«ãƒ¼ãƒãƒ«ç®¡ç†ã®å‰²è¾¼ã¿ã‚’禁止する)
2139 } while (!reqflg);
2140 reqflg = false;
2141 タスクコンテキストに戻す … (*1)
2142 CPUロック状æ…
2143‹ã«æˆ»ã™ ... (*3)
2144 }
2145 自タスク(p_runtsk)のTCBからスタックポインタを復帰する
2146#ifdef LOG_DSP_LEAVE
2147 log_dsp_leave(p_runtsk);
2148#endif /* LOG_DSP_LEAVE */
2149 自タスクのTCBから実行再開番地を復帰し,そこへ分岐する … (*a)
2150}
2151----------------------------------------
2152
2153割込み発生を待
2154つ間に非タスクコンテキストに切り換えるのは,この間に実行
2155される割込みハンドラ内
2156で,タスクディスパッチをしないようにするためであ
2157る.この時,割込みハンドラが,非タスクコンテキスト用のスタックを使うよ
2158うにしなければならない.通常は,非タスクコンテキストに切り換える際に非
2159タスクコンテキスト用のスタックに切り換え,タスクコンテキストに戻す際に
2160å…
2161ƒã®ã‚¹ã‚¿ãƒƒã‚¯ã«åˆ‡ã‚Šæ›ãˆã‚‹ï¼Ž
2162
2163ターゲットによっては(特に,シミュレーション環境の場合),強制的に非タ
2164スクコンテキストに切り換えることが難しい場合がある.その場合には,この
2165間に実行される割込みハンドラ内
2166でタスクディスパッチをしないような仕組み
2167を実装
2168することで,非タスクコンテキストへの切換えを省略することができる.
2169
2170(*1)の非タスクコンテキストに切り換える処理とタスクコンテキストに戻す処
2171理は,doループの中で行ってもよい(ターゲットによっては,割込みの許可/
2172禁止とまとめて処理した方が効率が良い).
2173
2174(*2)において,割込みを許可する処理と,割込み発生を待
2175つ処理とは,不可分
2176に行なう必
2177要がある.これを不可分に行なわない場合,割込みを許可した直後
2178に割込みがå…
2179¥ã‚Šï¼Œãã®ä¸­ã§ã‚¿ã‚¹ã‚¯ãŒå®Ÿè¡Œå¯èƒ½çŠ¶æ…
2180‹ã«ãªã‚‹ã¨ï¼Œå®Ÿè¡Œã™ã¹ãã‚¿ã‚¹ã‚¯
2181があるにもかかわらずプロセッサが割込み待
2182ちになってしまう.
2183
2184また,(*2)において,割込み発生を待
2185つ命令が用意されていない場合や,それ
2186を発行するのが不都合な場合には,割込みをすべて許可して割込みを受け付け
2187られる状æ…
2188‹ã«ãªã£ãŸå¾Œã«ï¼Œå‰²è¾¼ã¿ç™ºç”Ÿã‚’å¾…
2189たずに次に進んでもよい.この場合,
2190その外側のdoループによって,割込み発生を待
2191つことになる.
2192
2193CPUロックを解除するための情
2194報(例えば,CPUロック前の割込み優å…
2195ˆåº¦ãƒžã‚¹ã‚¯ï¼‰
2196を変数に保持している場合には,(*3)でCPUロック状æ…
2197‹ã«æˆ»ã™éš›ã«ï¼Œãã®å¤‰æ•°ã®
2198値もå…
2199ƒã«æˆ»ã£ã¦ã„ã‚‹å¿…
2200要がある.特に,その変数が,割込み待
2201ちの間に実行し
2202た割込みハンドラ内
2203で書き換えられる場合は,å…
2204ƒã®å€¤ã«æˆ»ã™ã“とが必
2205要である.
2206
2207割込み待
2208ちの間は,p_runtskをNULL(=0)に設定しなければならない(上の処
2209理内
2210容をそのまま実装
2211すればこうなる).このように設定しないと,割込みハ
2212ンドラからiget_tidを呼び出した際の動作が仕様に合致しなくなる.
2213
2214dispatcherをアセンブリ言語で記述する場合には,トレースログ取得処理は,
2215「6.2 トレースログ機能への対応」の節で記述した方法でコーディングするこ
2216と.なお,log_dsp_enterは切換え前のタスクのスタックで,log_dsp_leave は
2217切換え後のタスクのスタックで実行する.
2218
22196.5.3 タスクコンテキストからのディスパッチ
2220
2221(6-5-3-1) void dispatch(void)
2222(6-5-3-2) OMIT_CALLTEX(オプション)
2223
2224タスクコンテキストからのディスパッチ(dispatch)は,タスクコンテキスト
2225用のサービスコール処理においてタスク切換えが必
2226要になった場合に,ターゲッ
2227ト非依存部のサービスコール処理関数から呼び出される.
2228
2229dispatchは,タスクコンテキスト・CPUロック状æ…
2230‹ãƒ»å‰²è¾¼ã¿å„ªå…
2231ˆåº¦ãƒžã‚¹ã‚¯å…
2232¨è§£é™¤
2233状æ…
2234‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ…
2235‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
2236
2237dispatchの処理内
2238容は次の通り.
2239
2240----------------------------------------
2241void
2242dispatch(void)
2243{
2244#ifdef TOPPERS_SUPPORT_OVRHDR
2245 ovrtimer_stop(); /* オーバランタイマの停止 */
2246#endif /* TOPPERS_SUPPORT_OVRHDR */
2247 スクラッチレジスタ(*)を除くすべてのレジスタをスタックに保存する
2248 スタックポインタを自タスク(p_runtsk)のTCBに保存する
2249 dispatch_rを,実行再開番地として自タスクのTCBに保存する … (*a)
2250 dispatcherに分岐する
2251
2252 dispatch_r:
2253 スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
2254#ifdef TOPPERS_SUPPORT_OVRHDR
2255 ovrtimer_start(); /* オーバランタイマの動作開始 */
2256#endif /* TOPPERS_SUPPORT_OVRHDR */
2257 calltex(); … (*b)
2258}
2259----------------------------------------
2260
2261ここでスクラッチレジスタ(*)とは,関数呼出しにより保存されないレジスタの
2262ことである.必
2263要な場合には,関数を呼び出す側で保存しなければならないた
2264め,caller saved registerと呼ばれる場合もある.
2265
2266dispatchを呼び出したタスクが次に実行される時には,実行再開番地として登
2267録したdispatch_rに戻ってくる.dispatch_rには,dispatcherのみから分岐し,
2268その時の状æ…
2269‹ã¯ï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒ»CPUロック状æ…
2270‹ãƒ»å‰²è¾¼ã¿å„ªå…
2271ˆåº¦ãƒžã‚¹ã‚¯å…
2272¨
2273解除状æ…
2274‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ…
2275‹ã§ã‚る.
2276
2277(*b)でcalltexを呼ぶ代わりに,calltexの処理内
2278容(p_runtsk->enatexがtrue
2279で,p_runtsk->texptnが0でなく,ipmflgがtrueの場合に,call_texrtnを呼ぶ)
2280をここにインライン展開した方が効率がよい.ターゲット非依存部のcalltexを
2281使わない場合には,OMIT_CALLTEXをマクロ定義することで,ターゲット非依存
2282部からcalltexを取り除くことができる.
2283
22846.5.4 ディスパッチャの動作開始
2285
2286(6-5-4-1) void start_dispatch(void)
2287
2288ディスパッチャの動作開始(start_dispatch)は,カーネル起動時に,カーネ
2289ルの初期化処理から呼び出される.start_dispatchは,リターンすることのな
2290い関数である.
2291
2292start_dispatchは,非タスクコンテキストで,NMIを除くすべての割込みをマス
2293クした状æ…
2294‹ï¼ˆå…
2295¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
2296‹ã¨åŒç­‰ã®çŠ¶æ…
2297‹ï¼‰ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žstart_dispatch
2298内
2299で,タスクコンテキストに切り換え,CPUロック状æ…
2300‹ãƒ»å‰²è¾¼ã¿å„ªå…
2301ˆåº¦ãƒžã‚¹ã‚¯å…
2302¨
2303解除状æ…
2304‹ã«ã—なければならない.
2305
2306start_dispatchの処理内
2307容は次の通り.
2308
2309----------------------------------------
2310void
2311start_dispatch(void)
2312{
2313 タスクコンテキストに切り換える
2314 CPUロック状æ…
2315‹ãƒ»å‰²è¾¼ã¿å„ªå…
2316ˆåº¦ãƒžã‚¹ã‚¯å…
2317¨è§£é™¤çŠ¶æ…
2318‹ã«ã™ã‚‹
2319 dispatcher_0に分岐する
2320}
2321----------------------------------------
2322
23236.5.5 現在のコンテキストを捨ててディスパッチ
2324
2325(6-5-5-1) void exit_and_dispatch(void)
2326
2327現在のコンテキストを捨ててディスパッチ(exit_and_dispatch)は,自タスク
2328を終了させるサービスコール処理関数から呼び出される.exit_and_dispatchは,
2329リターンすることのない関数である.
2330
2331exit_and_dispatchは,タスクコンテキスト・CPUロック状æ…
2332‹ãƒ»å‰²è¾¼ã¿å„ªå…
2333ˆåº¦ãƒž
2334スクå…
2335¨è§£é™¤çŠ¶æ…
2336‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ…
2337‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Ž
2338
2339exit_and_dispatchの処理内
2340容は次の通り.
2341
2342----------------------------------------
2343void
2344exit_and_dispatch(void)
2345{
2346 dispatcherに分岐する
2347}
2348----------------------------------------
2349
23506.5.6 タスクの起動処理
2351
2352(6-5-6-1) void activate_context(TCB *p_tcb)
2353
2354タスクの起動処理(activate_context)は,タスクを休止状æ…
2355‹ã‹ã‚‰å®Ÿè¡Œã§ãã‚‹
2356状æ…
2357‹ã«ã™ã‚‹æ™‚に呼ばれ,p_tcbで指定されたタスク(対象タスク)のTCB中のス
2358タックポインタを初期化し,実行再開番地をタスク開始時処理(start_r)に設
2359定する.この時点では,後述する理由で,対象タスクのスタック領域を使って
2360はならない.
2361
2362対象タスクが最初に実行される時には,対象タスクを自タスクとして,実行再
2363開番地として登録したstart_rに分岐してくる.start_rには,dispatcherのみ
2364から分岐し,その時の状æ…
2365‹ã¯ï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆãƒ»CPUロック状æ…
2366‹ãƒ»å‰²è¾¼ã¿å„ª
2367å…
2368ˆåº¦ãƒžã‚¹ã‚¯å…
2369¨è§£é™¤çŠ¶æ…
2370‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッチ許可状æ…
2371‹ã§ã‚る.
2372
2373start_rは,CPUロック状æ…
2374‹ã‚’解除した後,タスクの起動番地を呼び出す.さら
2375に,タスクの起動番地から戻ってきた場合には,ext_tskを呼び出す.
2376
2377activate_contextとstart_rの処理内
2378容は次の通り.
2379
2380----------------------------------------
2381void
2382activate_context(TCB *p_tcb)
2383{
2384 指定されたタスク(p_tcb)のTCB中のスタックポインタを初期化する
2385 start_rを,実行再開番地として自タスクのTCBに保存する … (*a)
2386 return;
2387
2388 start_r:
2389#ifdef TOPPERS_SUPPORT_OVRHDR
2390 ovrtimer_start(); /* オーバランタイマの動作開始 */
2391#endif /* TOPPERS_SUPPORT_OVRHDR */
2392 CPUロック解除状æ…
2393‹ã«ã™ã‚‹
2394 自タスク(p_runtsk)の起動番地を,拡張情
2395報をパラメータとして呼び出す
2396 ext_tskに分岐する ... (*c)
2397}
2398----------------------------------------
2399
2400(*c)でext_tskを呼ぶ代わりに,自タスクの起動番地を呼び出す時の返り番地を
2401ext_tskの番地としておく方法がある.
2402
2403ここで,タスクの起動処理において対象タスクのスタック領域を使ってはなら
2404ない理由は,次の通り.制約タスク拡張パッケージにおいて,複数の制約タス
2405クがスタック領域をå…
2406±æœ‰ã—ている場合に,タスクの起動時点では,そのタスク
2407とスタック領域をå…
2408±æœ‰ã—ているタスクが,スタック領域を使用している可能性
2409があるためである.
2410
2411このポーティングガイドでは,タスクの実行再開番地をTCBに保存している
2412(*a)。これをスタックに保存する方法も考えられるが,タスクの起動処理でス
2413タック領域が使えないことから,タスクの起動処理だけは例外扱いしなければ
2414ならない.例えば,タスクの起動処理においてはTCB中のスタックポインタを特
2415殊な値(例えば0)に設定しておき,ディスパッチャ本体でTCB中のスタックポ
2416インタがその値の場合にはstart_rに分岐させ,start_rにおいてスタックポイ
2417ンタを初期化する方法が考えられる.
2418
24196.6 割込みハンドラ
2420
24216.6.1 割込みハンドラの出å…
2422¥å£å‡¦ç†
2423
2424カーネル管理の割込みの出å…
2425¥å£å‡¦ç†ã®æ–¹æ³•ã¯ï¼Œãƒ—ロセッサによって大きく異な
2426るが,おおよその処理内
2427容は次の通り.
2428
2429----------------------------------------
2430void
2431<割込みの出å…
2432¥å£å‡¦ç†>(void)
2433{
2434 少なくともカーネル管理の割込みを禁止した状æ…
2435‹ã«ã™ã‚‹ … (*f)
2436 スクラッチレジスタをスタックに保存する
2437 if (タスクコンテキストで割込み発生) {
2438#ifdef TOPPERS_SUPPORT_OVRHDR
2439 ovrtimer_stop(); /* オーバランタイマの停止 */
2440#endif /* TOPPERS_SUPPORT_OVRHDR */
2441 スタックを非タスクコンテキスト用のスタックに切り換え,
2442 非タスクコンテキストに切り換える
2443 }
2444 割込み優å…
2445ˆåº¦ãƒžã‚¹ã‚¯ã‚’,受け付けた割込み要求の割込優å…
2446ˆåº¦ã«è¨­å®šã—,
2447 CPUロック解除状æ…
2448‹ã«ã™ã‚‹ï¼ˆå—け付けた割込みよりも
2449 優å…
2450ˆåº¦ã®é«˜ã„割込みを受け付けるようにする)… (*i)
2451
2452
2453#ifdef LOG_INH_ENTER
2454 log_inh_enter(割込みハンドラ番号);
2455#endif /* LOG_INH_ENTER */
2456 割込みハンドラを呼び出す
2457#ifdef LOG_INH_LEAVE
2458 log_inh_leave(割込みハンドラ番号);
2459#endif /* LOG_INH_LEAVE */
2460
2461 ret_int:
2462 if (タスクコンテキストで割込み発生) {
2463 (少なくとも)カーネル管理の割込みを禁止した状æ…
2464‹ã«ã™ã‚‹ … (*d)
2465 スタックをタスク用のスタックに戻し,タスクコンテキストに切り換える
2466 … (*g)
2467 if (reqflg) {
2468 reqflg = false;
2469 CPUロック状æ…
2470‹ã«ã™ã‚‹ … (*e)
2471 割込み優å…
2472ˆåº¦ãƒžã‚¹ã‚¯ã‚’,å…
2473¨è§£é™¤çŠ¶æ…
2474‹ï¼ˆTIPM_ENAALL)に設定する … (*h)
2475 if (dspflg && p_runtsk != p_schedtsk) {
2476 スクラッチレジスタを除くすべてのレジスタをスタックに保存する
2477 スタックポインタを自タスク(p_runtsk)のTCBに保存する
2478 ret_int_rを,実行再開番地として自タスクのTCBに保存する … (*a)
2479 dispatcherに分岐する
2480
2481 ret_int_r:
2482 スクラッチレジスタを除くすべてのレジスタをスタックから復帰する
2483 }
2484#ifdef TOPPERS_SUPPORT_OVRHDR
2485 ovrtimer_start(); /* オーバランタイマの動作開始 */
2486#endif /* TOPPERS_SUPPORT_OVRHDR */
2487 calltex(); … (*b)
2488 }
2489#ifdef TOPPERS_SUPPORT_OVRHDR
2490 else {
2491 ovrtimer_start(); /* オーバランタイマの動作開始 */
2492 }
2493#endif /* TOPPERS_SUPPORT_OVRHDR */
2494 }
2495 割込み処理からのリターン後に,割込み優å…
2496ˆåº¦ãƒžã‚¹ã‚¯ãŒ
2497 割込み処理前の値に戻るように準備する
2498 割込み処理からのリターン後に,CPUロック解除状æ…
2499‹ã«æˆ»ã‚‹ã‚ˆã†ã«æº–備する
2500 スクラッチレジスタをスタックから復帰する
2501 割込み処理からのリターン
2502}
2503----------------------------------------
2504
2505割込みの受付けにより,スタックポインタが切り換わらず,すべての割込みが
2506禁止されないプロセッサでは,(*f)において,少なくともカーネル管理の割込
2507みを禁止する.この理由は次の通りである.
2508
2509割込みのå…
2510¥å£å‡¦ç†ã«ãŠã„て,スタックを非タスクコンテキスト用のスタックに
2511切り換える前に多重割込みが発生すると,タスクのスタック領域が使用される.
2512上記のようなプロセッサでは,スタックの切換え前に,最大で割込み優å…
2513ˆåº¦ã®
2514段数分の多重割込みが発生することを防ぐことはできず,各タスクのスタック
2515領域を確保する際に,その分を見込んで確保しなければならない.各タスクの
2516スタック領域をなるべく小さくするためには,スタックをなるべく使用しない
2517内
2518に,多重割込みを禁止するのが望ましい.そのため,スクラッチレジスタを
2519スタックに保存する前に,割込みを禁止する.ただし,割込みの禁止処理に必
2520
2521要な最低限のレジスタについては,割込みの禁止にå…
2522ˆç«‹ã£ã¦ã‚¹ã‚¿ãƒƒã‚¯ã«ä¿å­˜ã™
2523る必
2524要がある.
2525
2526同様のことは,カーネル管理外の割込みにも当てはまる.すなわち,カーネル
2527管理外の割込みについても,スタックをなるべく使用しない内
2528に禁止するのが
2529望ましい.このことから,カーネル管理外の割込みを使用する場合には,(*f)
2530において,すべての割込みを禁止した状æ…
2531‹ã«ã™ã‚‹ã®ãŒæœ›ã¾ã—いことになる.一
2532方で,カーネル管理外の割込みの禁止時間が長くなると,カーネル管理外の割
2533込みの応答性が低下するため,ユーザに注意を促す必
2534要がある.また,カーネ
2535ル管理外の割込み処理においても,非タスクコンテキスト用のスタック(また
2536は,カーネル管理外の割込み処理用のスタック)に切り換えることが望ましい
2537が,これはカーネルの管轄外である.
2538
2539(*i)に含まれる割込み優å…
2540ˆåº¦ãƒžã‚¹ã‚¯ã‚’設定する処理は,プロセッサがハードウェ
2541アで実現している場合も多い.
2542
2543(*d)においては,カーネル管理の割込みを禁止するだけで,CPUロック状æ…
2544‹ã«ã™
2545る必
2546要はない.例えば,CPUロック状æ…
2547‹ã§ã‚ることを示す変数を用意している場
2548合には,(*d)の時点ではその変数をCPUロック状æ…
2549‹ã‚’示す値に変更する必
2550要はな
2551く,(*e)において変更すればよい.
2552
2553(*g)においてタスクコンテキストに切り換える処理は,割込み処理からのリター
2554ンによりスタックとコンテキストがå…
2555ƒã«æˆ»ã‚‹ãƒ—ロセッサでは,reqflgがtrueの
2556場合にのみ行えばよい.reqflgがfalseの時は,非タスクコンテキストのまま処
2557理を続け,割込み処理からのリターンでタスクコンテキストに戻ることになる.
2558
2559(*e)においてCPUロック状æ…
2560‹ã«ã™ã‚‹ã®ã¯ï¼Œdispatcherに分岐する際と,(*b)にお
2561いてcalltex(または,それを展開した場合にはcall_texrtn)を呼び出す際に,
2562CPUロック状æ…
2563‹ã«ãªã£ã¦ã„ã‚‹å¿…
2564要があるためである.
2565
2566(*h)の処理が実行されるのは,割込み処理前に割込み優å…
2567ˆåº¦ãƒžã‚¹ã‚¯ãŒå…
2568¨è§£é™¤çŠ¶
2569æ…
2570‹ï¼ˆTIPM_ENAALL)であった場合に限られ,ここで割込み優å…
2571ˆåº¦ãƒžã‚¹ã‚¯ã‚’å…
2572¨è§£é™¤
2573状æ…
2574‹ã«è¨­å®šã™ã‚‹ã®ã¯ï¼Œå‰²è¾¼ã¿å‡¦ç†å‰ã®å€¤ã«æˆ»ã™ã®ã¨ç­‰ä¾¡ã§ã‚る.ここでこの処
2575理を行うのは,dispatcherに分岐する際と,(*b)においてcalltex(または,そ
2576れを展開した場合にはcall_texrtn)を呼び出す際には,割込み優å…
2577ˆåº¦ãƒžã‚¹ã‚¯å…
2578¨
2579解除状æ…
2580‹ã«ãªã£ã¦ã„ã‚‹å¿…
2581要があるためである.
2582
2583タスクの実行中に割込みが発生し,上の処理中でdispatcherに分岐した場合,
2584そのタスクが次に実行される時には,実行再開番地として登録したret_int_rに
2585戻ってくる.ret_int_rには,dispatcherのみから分岐し,その時の状æ…
2586‹ã¯ï¼Œã‚¿
2587スクコンテキスト・CPUロック状æ…
2588‹ãƒ»å‰²è¾¼ã¿å„ªå…
2589ˆåº¦ãƒžã‚¹ã‚¯å…
2590¨è§£é™¤çŠ¶æ…
2591‹ãƒ»ãƒ‡ã‚£ã‚¹ãƒ‘ッ
2592チ許可状æ…
2593‹ã§ã‚る.
2594
2595割込みの出å…
2596¥å£å‡¦ç†ã‚’アセンブリ言語で記述する場合には,トレースログ取得
2597処理は,「6.2 トレースログ機能への対応」の節で記述した方法でコーディン
2598グすること.
2599
26006.6.2 割込みハンドラ毎の出å…
2601¥å£å‡¦ç†ã®ç”Ÿæˆ
2602
2603割込みベクトルをハードウェアで実現している場合など,割込みハンドラ毎に
2604出å…
2605¥å£å‡¦ç†ã‚’用意した方が効率が良いターゲットのために,割込みハンドラ毎
2606に出å…
2607¥å£å‡¦ç†ã‚’生成する機構を用意している.
2608
2609以下のマクロは,標準の割込み管理機能の初期化処理を用いた場合のみ,ター
2610ゲット非依存部で使われる.割込み管理機能の初期化処理をターゲット依存部
2611で用意し,その中でこれらのマクロを使わない場合には,これらのマクロを用
2612意する必
2613要はない.
2614
2615(6-6-2-1) INT_ENTRY(inhno, inthdr)
2616
2617割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ
2618ンドラの出å…
2619¥å£å‡¦ç†ã®ãƒ©ãƒ™ãƒ«ã‚’作るマクロ.INTHDR_ENTRYを用いて割込みハン
2620ドラ毎に出å…
2621¥å£å‡¦ç†ã‚’生成する場合には,次のように定義する.
2622
2623#define INT_ENTRY(inhno, inthdr) _kernel_##inthdr##_##inhno
2624
2625割込みハンドラ毎に出å…
2626¥å£å‡¦ç†ã‚’作る必
2627要がない場合には,次のように定義し
2628て,割込みハンドラの関数名をそのまま返す.
2629
2630#define INT_ENTRY(inhno, inthdr) inthdr
2631
2632(6-6-2-2) INTHDR_ENTRY(inhno, inhno_num, inthdr)
2633
2634割込みハンドラ番号がinhno,割込みハンドラの関数名がinthdrである割込みハ
2635ンドラの出å…
2636¥å£å‡¦ç†ã‚’生成するマクロ.inhno_numには,アセンブリ言語記述用
2637に,割込みハンドラ番号が数値で渡される.割込みハンドラ毎に出å…
2638¥å£å‡¦ç†ã‚’
2639作る必
2640要がない場合には,空に定義する.
2641
26426.6.3 割込みハンドラの設定
2643
2644(6-6-3-1) bool_t VALID_INHNO_DEFINH(INHNO inhno)(オプション)
2645
2646inhnoが,DEF_INHに対する割込みハンドラ番号として有効な値である場合に
2647true,そうでない場合にfalseを返すマクロ.
2648
2649ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
2650ゲット依存部で使わないなら,用意する必
2651要がない.
2652
2653(6-6-3-2) void x_define_inh(INHNO inhno, FP int_entry)
2654
2655inhnoで指定された割込みハンドラの出å…
2656¥å£å‡¦ç†ã®ç•ªåœ°ã‚’int_entryに設定する.
2657
2658この関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ
2659ト非依存部から呼び出される.割込み管理機能の初期化処理をターゲット依存
2660部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する
2661必
2662要はない.
2663
2664この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
2665カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼
2666び出せるように実装
2667すればよい.
2668
2669指定された割込みハンドラ番号がDEF_INHに対するものとして有効な値でない場
2670合の動作は保証する必
2671要がない(assertでエラーとするのが望ましい).これ
2672は,コンフィギュレータが,パス2のテンプレートファイルのターゲット依存部
2673で定義するINHNO_DEFINH_VALIDを用いてエラーを検出するためである.
2674
26756.6.4 割込み要求ラインの属性の設定
2676
2677(6-6-4-1) bool_t VALID_INTNO_CFGINT(INTNO intno)(オプション)
2678
2679intnoが,割込み番号として有効な値である場合にtrue,そうでない場合に
2680falseを返すマクロ.CFG_INTには,すべての割込み番号を指定することができ
2681るため,このマクロは,intnoが有効な値の場合にはtrue,intnoが無効の値の
2682場合にはfalseを返すようにする.
2683
2684ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
2685ゲット依存部で使わないなら,用意する必
2686要がない.
2687
2688(6-6-4-2) void x_config_int(INTNO intno, ATR intatr, PRI intpri)
2689
2690intnoで指定された割込み要求ラインの割込み属性を,intatrで指定された通り
2691に設定する.また,割込み優å…
2692ˆåº¦ã‚’,intpriで指定された値に設定する.
2693
2694この関数は,標準の割込み管理機能の初期化処理を用いた場合のみ,ターゲッ
2695ト非依存部から呼び出される.割込み管理機能の初期化処理をターゲット依存
2696部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する
2697必
2698要はない.
2699
2700この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
2701カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼
2702び出せるように実装
2703すればよい.
2704
2705intatrとして設定できる割込み属性は次の通り.
2706
2707 TA_ENAINT 0x01 割込み要求禁止フラグをクリア
2708 TA_EDGE 0x02 エッジトリガ
2709
2710この他に,ターゲット定義で割込み属性を追加してもよい.ターゲット定義で
2711追加するために,以下の属性名が予約されている.
2712
2713 TA_POSEDGE ポジティブエッジトリガ
2714 TA_NEGEDGE ネガティブエッジトリガ
2715 TA_BOTHEDGE 両エッジトリガ
2716 TA_LOWLEVEL ローレベルトリガ
2717 TA_HIGHLEVEL ハイレベルトリガ
2718
2719これらの属性名をターゲット定義で追加する場合には,その属性値を決定し,
2720定義をtarget_kernel.h(または,そこからインクルードされるファイル)に含
2721める.また,コンフィギュレータテンプレートファイルから参ç…
2722§ã§ãã‚‹ã‚ˆã†ã«ï¼Œ
2723target_def.csv(または,同等の役割を持つファイル)に含め,コンフィギュ
2724レータテンプレートファイルのターゲット非依存部でエラーとならないように,
2725target.tf(または,そこからインクルードされるファイル)でTARGET_INTATR
2726に設定する.
2727
2728指定された割込み番号が有効な値でない場合や,その割込み要求ラインに対し
2729て設定できない属性を指定した場合,設定できない割込み優å…
2730ˆåº¦ã‚’指定した場
2731合の動作は保証する必
2732要がない(assertでエラーとするのが望ましい).この
2733ようなケースは,コンフィギュレータでエラーを検出すべきである.コンフィ
2734ギュレータテンプレートファイルのターゲット非依存部は,パス2のテンプレー
2735トファイルのターゲット依存部で定義するINTNO_CFGINT_VALID,
2736TARGET_INTATR,INTPRI_CFGINT_VALIDを用いてエラーを検出するが,標準の割
2737込み属性(TA_ENAINT,TA_EDGE)が設定できない場合や,設定できない属性や
2738割込み優å…
2739ˆåº¦ãŒå‰²è¾¼ã¿è¦æ±‚ラインによって異なる場合には,コンフィギュレー
2740タテンプレートファイルのターゲット依存部で検出しなければならない.
2741
27426.6.5 割込み管理機能の初期化処理の変更
2743
2744(6-6-5-1) OMIT_INITIALIZE_INTERRUPT(オプション)
2745
2746割込み管理機能の初期化処理をターゲット依存部で用意し,ターゲット非依存
2747部に含まれる標準の割込み管理機能の初期化処理を用いない場合には,このシ
2748ンボルをマクロ定義する.
2749
2750このシンボルをマクロ定義すると,INHINIB,INTINIB,initialize_interrupt
2751の定義が,カーネルのターゲット非依存部から取り除かれる.また,
2752TNUM_INHNO,tnum_inhno,inhinib_table,TNUM_INTNO,tnum_intno,
2753intinib_tableの定義と,割込みハンドラ毎の出å…
2754¥å£å‡¦ç†ã‚’生成するための記述
2755(INTHDR_ENTRYマクロのリスト)が,コンフィギュレータのパス2のテンプレー
2756トファイルのターゲット非依存部によってkernel_cfg.cに生成されなくなる.
2757ただし,コンフィギュレータのパス2のテンプレートファイルのターゲット依存
2758部で,USE_INHINIB_TABLEとUSE_INTINIB_TABLEを設定することで,その一部
2759分をkernel_cfg.cに生成することが可能である.
2760
2761(6-6-5-2) void initialize_interrupt(void)(オプション)
2762
2763OMIT_INITIALIZE_INTERRUPTをマクロ定義した場合には,この関数をターゲット
2764依存部で用意する.OMIT_INITIALIZE_INTERRUPTをマクロ定義することにより取
2765り除かれるその他のデータ型,変数,マクロは,この関数で使用する場合にの
2766み用意すればよい.
2767
27686.6.6 デフォルトの割込みハンドラ
2769
2770(6-6-6-1) void default_int_handler(void)(オプション)
2771
2772コンフィギュレータにより割込みハンドラのテーブルを生成する場合などには,
2773割込みハンドラを登録しなかった割込みハンドラ番号に対して,デフォルトの
2774割込みハンドラとして,default_int_handlerを登録する.
2775
2776default_int_handlerは,標準のものをターゲット依存部で用意するが,ユーザ
2777が用意したもので置き換えられるように,OMIT_DEFAULT_INT_HANDLERをマクロ
2778定義した場合には,ターゲット依存部で定義しないようにする.なお,ユーザ
2779が用意する場合の名称は,_kernel_default_int_handlerとなる.
2780
27816.6.7 カーネル管理外の割込み
2782
2783カーネル管理外の割込みハンドラは,カーネル内
2784の割込み出å…
2785¥å£å‡¦ç†ã‚’経由せ
2786ずに実行するのが基本である.
2787
2788ただし,すべての割込みで同じアドレスに分岐するプロセッサでは,カーネル
2789内
2790の割込み出å…
2791¥å£å‡¦ç†ã‚’å…
2792¨ãçµŒç”±ã›ãšã«ã‚«ãƒ¼ãƒãƒ«ç®¡ç†å¤–の割込みハンドラを実
2793行することができないため,割込み出å…
2794¥å£å‡¦ç†ã®ãªã‚‹ã¹ãæ—©ã„タイミングで,
2795カーネル管理外の割込みであるかを判別し,処理内
2796容を分ける必
2797要がある.å…
2798·
2799体的には,カーネル管理外の割込みの出å…
2800¥å£å‡¦ç†ã§ã¯ï¼Œã‚ªãƒ¼ãƒãƒ©ãƒ³ãƒãƒ³ãƒ‰ãƒ©ã®
2801停止と動作開始を行ってはならない.また,reqflgをチェックし,タスク切換
2802えやタスク例外処理ルーチンの呼出しを行う必
2803要がない.さらに,NMIの出å…
2804¥å£
2805処理では,トレースログ取得処理(log_inh_enterおよびlog_inh_leave)を呼
2806び出してはならない.
2807
2808カーネル管理外の割込みハンドラを実行する際に,カーネル内
2809の割込み出å…
2810¥å£
2811処理の一部分を経由する場合には,CPU例外が起こる可能性を極力減らすととも
2812に,CPU例外を起こす可能性がある場合には,その可能性をターゲット依存部の
2813ユーザーズマニュアルに記載しなければならない.
2814
2815次に,カーネル管理外の割込みの設定方法に関して,「TOPPERS新世代カーネル
2816統合仕様書」の「2.7.8 カーネル管理外の割込みの設定方法」の節の3つの方法
2817のいずれを採用するかを決定する.
2818
2819(a-1)または(a-2)を採用し,カーネル管理外とした割込みに対して,カーネル
2820のAPIによる割込みハンドラの登録と割込み要求ラインの属性の設定をサポート
2821しない場合には,それに代わる方法をターゲット依存部のユーザーズマニュア
2822ルに記述する.
2823
2824(a-1)または(a-2)を採用してカーネルのAPIによる割込みハンドラの登録や割込
2825み要求ラインの属性の設定をサポートする場合や,(b)を採用した場合には,ター
2826ゲット依存部においてそれを実現する必
2827要がある.
2828
2829カーネル管理外の割込みに対して,DEF_INHによる割込みハンドラの登録をサポー
2830トするには,次の設定が必
2831要になる.
2832
2833・TARGET_INHATRに,TA_NONKERNELを設定する.
2834
2835・(a-1)または(a-2)を採用した場合には,INHNO_DEFINH_VALIDに,カーネル管
2836 理外とした割込みに対応する割込みハンドラ番号を含める.また,
2837 VALID_INHNO_DEFINHを,カーネル管理外とした割込みハンドラ番号を有効な
2838 値と判定するようにする.
2839
2840・(a-1)または(a-2)を採用した場合には,INHNO_FIX_KERNELにカーネル管理と
2841 した割込みハンドラ番号のリストを,INHNO_FIX_NONKERNELにカーネル管理外
2842 とした割込みハンドラ番号のリスト設定する.
2843
2844・DEF_INHがカーネル管理外の割込みに対応できるようにする.標準の割込み管
2845 理機能の初期化処理を用いる場合には,x_define_inhをカーネル管理外の割
2846 込みに対応させる.
2847
2848・必
2849要な場合には,TA_NONKERNEL属性が設定された割込みハンドラをカーネル
2850 管理外と扱うように,カーネル内
2851の割込み出å…
2852¥å£å‡¦ç†ã‚’修正する.標準の割
2853 込み管理機能の初期化処理を用いる場合,カーネル管理外の割込みに対して
2854 は,カーネル内
2855の割込み出å…
2856¥å£å‡¦ç†ã‚’生成せず,アプリケーションが登録し
2857 た割込みハンドラを直接呼び出すように,ターゲット非依存部により設定さ
2858 れるため,ターゲット依存部では対応する必
2859要がない.
2860
2861カーネル管理外の割込みに対して,CFG_INTによる割込み要求ラインの属性の設
2862定をサポートするには,次の設定が必
2863要になる.
2864
2865・(a-1)または(a-2)を採用した場合には,INTNO_CFGINT_VALIDに,カーネル管
2866 理外とした割込みに対応する割込み番号を含める.また,VALID_INTNO_CFGINT
2867 を,カーネル管理外とした割込み番号を有効な値と判定するようにする.
2868
2869・(a-1)または(a-2)を採用した場合には,INTNO_FIX_KERNELにカーネル管理と
2870 した割込み番号のリストを,INTNO_FIX_NONKERNELにカーネル管理外とした割
2871 込み番号のリスト設定する.
2872
2873・INTPRI_CFGINT_VALIDに,カーネル管理外の割込みとなる優å…
2874ˆåº¦ã‚’含める.
2875
2876・CFG_INTがカーネル管理外の割込みに対応できるようにする.標準の割込み管
2877 理機能の初期化処理を用いる場合には,x_config_intをカーネル管理外の割
2878 込みに対応させる.
2879
2880chg_ipmにより,(NMI以外の)カーネル管理外の割込みをマスクできるように
2881する場合には,次の設定が必
2882要になる.
2883
2884・VALID_INTPRI_CHGIPMを,カーネル管理外の割込みとなる優å…
2885ˆåº¦ã‚’有効な値と
2886 判定するようにする.
2887
2888・t_set_ipmを,カーネル管理外の割込みとなる優å…
2889ˆåº¦ã‚’扱えるようにする.
2890
28916.6.8 割込みサービスルーチンの生成
2892
2893(6-6-8-1) bool_t VALID_INTNO_CREISR(INTNO intno)
2894
2895intnoが,acre_isrに対する割込み番号として有効な値である場合にtrue,そう
2896でない場合にfalseを返すマクロ.動的生成機能拡張パッケージを使用しない場
2897合には,定義する必
2898要がない.
2899
29006.7 CPU例外ハンドラとCPU例外発生時のシステム状æ…
2901‹ã®å‚ç…
2902§
2903
29046.7.1 CPU例外ハンドラの出å…
2905¥å£å‡¦ç†
2906
2907CPU例外の出å…
2908¥å£å‡¦ç†ã®æ–¹æ³•ã¯ãƒ—ロセッサによって大きく異なるが,おおよその
2909処理内
2910容は次の通り.
2911
2912----------------------------------------
2913void
2914<CPU例外の出å…
2915¥å£å‡¦ç†>(void)
2916{
2917 スクラッチレジスタをスタックに保存する
2918 if (カーネル管理外のCPU例外) {
2919 if (タスクコンテキストでCPU例外発生) {
2920 スタックを非タスクコンテキスト用のスタックに切り換え,
2921 非タスクコンテキストに切り換える … (*j)
2922 }
2923 システム状æ…
2924‹ï¼ˆã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã¯é™¤ãï¼‰ã‚’,CPU例外発生時の状æ…
2925‹ã«ã™ã‚‹
2926 CPU例外ハンドラを,CPU例外の情
2927報を記憶している領域のå…
2928ˆé ­ç•ªåœ°ã‚’
2929 パラメータ(p_excinf)として呼び出す
2930 if (タスクコンテキストでCPU例外発生) {
2931 スタックをタスク用のスタックに戻し,
2932 タスクコンテキストに切り換える … (*j)
2933 }
2934 CPU例外処理からのリターン後に,CPU例外発生時のシステム状æ…
2935‹ã«
2936 戻るように準備する
2937 }
2938 else {
2939 if (タスクコンテキストでCPU例外発生) {
2940 (少なくとも)カーネル管理の割込みを禁止した状æ…
2941‹ã«ã™ã‚‹
2942#ifdef TOPPERS_SUPPORT_OVRHDR
2943 ovrtimer_stop(); /* オーバランタイマの停止 */
2944#endif /* TOPPERS_SUPPORT_OVRHDR */
2945 スタックを非タスクコンテキスト用のスタックに切り換え,
2946 非タスクコンテキストに切り換える
2947 }
2948 割込み優å…
2949ˆåº¦ãƒžã‚¹ã‚¯ã‚’,CPU例外発生時の値に設定し,
2950 CPUロック解除状æ…
2951‹ã«ã™ã‚‹ï¼ˆCPU例外発生時の割込み優å…
2952ˆåº¦ãƒžã‚¹ã‚¯
2953 よりも優å…
2954ˆåº¦ã®é«˜ã„割込みを受け付けるようにする)
2955
2956#ifdef LOG_EXC_ENTER
2957 log_exc_enter(CPU例外ハンドラ番号);
2958#endif /* LOG_EXC_ENTER */
2959 CPU例外ハンドラを,CPU例外の情
2960報を記憶している領域のå…
2961ˆé ­ç•ªåœ°ã‚’
2962 パラメータ(p_excinf)として呼び出す
2963#ifdef LOG_EXC_LEAVE
2964 log_exc_leave(CPU例外ハンドラ番号);
2965#endif /* LOG_EXC_LEAVE */
2966
2967 ret_exc:
2968 if (タスクコンテキストでCPU例外発生) {
2969 (少なくとも)カーネル管理の割込みを禁止した状æ…
2970‹ã«ã™ã‚‹ … (*d)
2971 スタックをタスク用のスタックに戻し,タスクコンテキストに切り換える
2972 … (*g)
2973 if (reqflg) {
2974 reqflg = false;
2975 CPUロック状æ…
2976‹ã«ã™ã‚‹ … (*e)
2977 if (dspflg && p_runtsk != p_schedtsk) {
2978 スクラッチレジスタを除くすべてのレジスタをスタックに保存する
2979 スタックポインタを自タスク(p_runtsk)のTCBに保存する
2980 ret_exc_rを,実行再開番地として自タスクのTCBに保存する
2981 … (*a)
2982 dispatcherに分岐する
2983
2984 ret_exc_r:
2985 スクラッチレジスタを除くすべてのレジスタを
2986 スタックから復帰する
2987 }
2988#ifdef TOPPERS_SUPPORT_OVRHDR
2989 ovrtimer_start(); /* オーバランタイマの動作開始 */
2990#endif /* TOPPERS_SUPPORT_OVRHDR */
2991 calltex(); … (*b)
2992 }
2993#ifdef TOPPERS_SUPPORT_OVRHDR
2994 else {
2995 ovrtimer_start(); /* オーバランタイマの動作開始 */
2996 }
2997#endif /* TOPPERS_SUPPORT_OVRHDR */
2998 }
2999 CPU例外処理からのリターン後に,CPUロック解除状æ…
3000‹ã«æˆ»ã‚‹ã‚ˆã†ã«æº–備する
3001 }
3002 スクラッチレジスタをスタックから復帰する
3003 CPU例外処理からのリターン
3004}
3005----------------------------------------
3006
3007CPU例外ハンドラは,非コンテキストに切り換えることを除いては,CPU例外発
3008生時と同じシステム状æ…
3009‹ã§å‘¼ã³å‡ºã•ãªã‘ればならない.例えば,CPU例外がCPU
3010ロック状æ…
3011‹ã§ç™ºç”Ÿã—た場合にはCPUロック状æ…
3012‹ï¼ŒCPUロック解除状æ…
3013‹ã§ç™ºç”Ÿã—た
3014場合にはCPUロック解除状æ…
3015‹ã§ï¼ŒCPU例外ハンドラを呼び出さなければならない.
3016CPUロック状æ…
3017‹ã§ç™ºç”Ÿã—たCPU例外は,カーネル管理外のCPU例外となるため,カー
3018ネル管理のCPU例外ハンドラについては,CPUロック解除状æ…
3019‹ã§å‘¼ã³å‡ºã™ã“とに
3020なる.
3021
3022ターゲットによっては,カーネル管理外のCPU例外を正確に判定するのが難しい
3023場合がある.このような場合には,割込み優å…
3024ˆåº¦ãƒžã‚¹ã‚¯ãŒå…
3025¨è§£é™¤ã§ãªã„状æ…
3026‹ã§
3027発生したCPU例外を,カーネル管理外のCPU例外と扱っても支障がない.これは,
3028割込み優å…
3029ˆåº¦ãƒžã‚¹ã‚¯ãŒå…
3030¨è§£é™¤ã§ãªã„場合には,xsns_dpn,xsns_xpnともtrueを
3031返すため,アプリケーションからはカーネル管理外のCPU例外と区別できないた
3032めである.
3033
3034å…
3035·ä½“的には,å…
3036¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯ï¼ˆã¾ãŸã¯CPUロック)を小さいオーバヘッドで実現
3037しようとすると,CPU例外ハンドラの中で,å…
3038¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
3039‹ï¼ˆã¾ãŸã¯CPUロッ
3040ク状æ…
3041‹ï¼‰ã¨å‰²è¾¼ã¿å„ªå…
3042ˆåº¦ãƒžã‚¹ã‚¯ã‚’高いレベルに設定した状æ…
3043‹ã‚’区別できない場
3044合がある.また,カーネル管理外の割込み処理中やカーネル実行中であること
3045を正確に判断することも難しい場合がある.
3046
3047カーネル管理外のCPU例外ハンドラを呼ぶ時に,(*j)において,スタックを非タ
3048スクコンテキスト用のスタックに切り換え,非タスクコンテキストに切り換え
3049ているが,この切換えはターゲット定義で省いても良い.これは,カーネル管
3050理外のCPU例外は,カーネル内
3051のクリティカルセクション中で発生する可能性が
3052あるため,安å…
3053¨ã«åˆ‡ã‚Šæ›ãˆã‚‰ã‚Œã‚‹ã¨ã¯é™ã‚‰ãªã„ためである.また,カーネル管
3054理外の割込みハンドラを呼ぶ時のコンテキストやスタックはターゲット依存な
3055ので,カーネル管理外のCPU例外ハンドラもそれと同様に扱って良いと考えられ
3056るためである.
3057
3058上のコードでは,カーネル管理外のCPU例外に対して,トレースログ取得処理
3059(log_exc_enterおよびlog_exc_leave)を呼び出していないが,å…
3060¨å‰²è¾¼ã¿ãƒ­ãƒƒ
3061ク状æ…
3062‹ã‹NMIの処理中にCPU例外が発生した場合を除外すれば,呼び出してもか
3063まわない.å…
3064¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
3065‹ã‹NMIの処理中に発生したCPU例外の場合には,
3066トレースログ取得処理を呼び出してはならない.
3067
3068CPU例外ハンドラを実行する際に経由する部分では,CPU例外が起こる可能性を
3069極力減らすとともに,CPU例外を起こす可能性がある場合(例えば,スクラッチ
3070レジスタをスタックに保存する時に,バスエラーなどのCPU例外が発生する可能
3071性が考えられる)には,その可能性をターゲット依存部のユーザーズマニュア
3072ルに記載しなければならない.
3073
3074ret_exc以降の処理は,割込みの出å…
3075¥å£å‡¦ç†ã®ret_int以降の処理とほぼ同じで
3076あるため,ターゲットによっては,å…
3077±é€šã®ãƒ«ãƒ¼ãƒãƒ³ã‚’用いることができる可能
3078性がある.
3079
3080CPU例外の出å…
3081¥å£å‡¦ç†ã‚’アセンブリ言語で記述する場合には,トレースログ取得
3082処理は,「6.2 トレースログ機能への対応」の節で記述した方法でコーディン
3083グすること.
3084
30856.7.2 CPU例外ハンドラの出å…
3086¥å£å‡¦ç†ã®ç”Ÿæˆ
3087
3088CPU例外ベクトルをハードウェアで実現している場合など,CPU例外ハンドラ毎
3089に出å…
3090¥å£å‡¦ç†ã‚’用意した方が効率が良いターゲットのために,CPU例外ハンドラ
3091毎に出å…
3092¥å£å‡¦ç†ã‚’生成する機構を用意している.
3093
3094以下のマクロは,標準のCPU例外管理機能の初期化処理を用いた場合のみ,ター
3095ゲット非依存部で使われる.CPU例外管理機能の初期化処理をターゲット依存部
3096で用意し,その中でこれらのマクロを使わない場合には,これらのマクロを用
3097意する必
3098要はない.
3099
3100(6-7-2-1) EXC_ENTRY(excno, exchdr)
3101
3102CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例
3103外ハンドラの出å…
3104¥å£å‡¦ç†ã®ãƒ©ãƒ™ãƒ«ã‚’作るマクロ.EXCHDR_ENTRYを用いてCPU例外
3105ハンドラ毎に出å…
3106¥å£å‡¦ç†ã‚’生成する場合には,次のように定義する.
3107
3108#define EXC_ENTRY(excno, exchdr) _kernel_##exchdr##_##excno
3109
3110CPU例外ハンドラ毎に出å…
3111¥å£å‡¦ç†ã‚’作る必
3112要がない場合には,次のように定義し
3113て,CPU例外ハンドラの関数名をそのまま返す.
3114
3115#define EXC_ENTRY(excno, exchdr) exchdr
3116
3117(6-7-2-2) EXCHDR_ENTRY(excno, excno_num, exchdr)
3118
3119CPU例外ハンドラ番号がexcno,CPU例外ハンドラの関数名がexchdrであるCPU例
3120外ハンドラの出å…
3121¥å£å‡¦ç†ã‚’生成するマクロ.excno_numには,アセンブリ言語記
3122述用に,CPU例外ハンドラ番号が数値で渡される.CPU例外ハンドラ毎に出å…
3123¥å£
3124処理を作る必
3125要がない場合には,空に定義する.
3126
31276.7.3 CPU例外ハンドラの設定
3128
3129(6-7-3-1) bool_t VALID_EXCNO_DEFEXC(EXCNO excno)(オプション)
3130
3131excnoが,DEF_EXCに対するCPU例外ハンドラ番号として有効な値である場合に
3132true,そうでない場合にfalseを返すマクロ.
3133
3134ASPカーネルのターゲット非依存部では,このマクロは使われていないため,ター
3135ゲット依存部で使わないなら,用意する必
3136要がない.
3137
3138(6-7-3-2) void x_define_exc(EXCNO excno, FP exc_entry)
3139
3140excnoで指定されたCPU例外ハンドラの出å…
3141¥å£å‡¦ç†ã®ç•ªåœ°ã‚’exc_entryに設定する.
3142
3143この関数は,標準のCPU例外管理機能の初期化処理を用いた場合のみ,ターゲッ
3144ト非依存部から呼び出される.CPU例外管理機能の初期化処理をターゲット依存
3145部で用意し,その中でこの関数を呼び出さない場合には,この関数を用意する
3146必
3147要はない.
3148
3149この関数は,ターゲット非依存部のカーネル初期化処理から呼び出されるため,
3150カーネルの初期化処理(NMIを除くすべての割込みがマスクされている)から呼
3151び出せるように実装
3152すればよい.
3153
3154指定されたCPU例外ハンドラ番号がDEF_EXCに対するものとして有効な値でない
3155場合の動作は保証する必
3156要がない(assertでエラーとするのが望ましい).こ
3157れは,コンフィギュレータが,パス2のテンプレートファイルのターゲット依存
3158部で定義するEXCNO_DEFEXC_VALIDを用いてエラーを検出するためである.
3159
31606.7.4 CPU例外管理機能の初期化処理の変更
3161
3162(6-7-4-1) OMIT_INITIALIZE_EXCEPTION(オプション)
3163
3164CPU例外管理機能の初期化処理をターゲット依存部で用意し,ターゲット非依存
3165部に含まれる標準の割込み管理機能の初期化処理を用いない場合には,このシ
3166ンボルをマクロ定義する.
3167
3168このシンボルをマクロ定義すると,EXCINIBとinitialize_exceptionの定義が,
3169カーネルのターゲット非依存部から取り除かれる.また,TNUM_EXCNO,
3170tnum_excno,excinib_tableの定義と,CPU例外ハンドラ毎の出å…
3171¥å£å‡¦ç†ã‚’生成
3172するための記述(EXCHDR_ENTRYマクロのリスト)を,コンフィギュレータのパ
3173ス2のテンプレートファイルのターゲット非依存部によってkernel_cfg.cに生成
3174されなくなる.
3175
3176(6-7-4-2) void initialize_exception(void)(オプション)
3177
3178OMIT_INITIALIZE_EXCEPTIONをマクロ定義した場合には,この関数をターゲット
3179依存部で用意する.OMIT_INITIALIZE_EXCEPTIONをマクロ定義することにより取
3180り除かれるその他のデータ型,変数,マクロは,この関数で使用する場合にの
3181み用意すればよい.
3182
31836.7.5 デフォルトのCPU例外ハンドラ
3184
3185(6-7-5-1) void default_exc_handler(void *p_excinf)(オプション)
3186
3187コンフィギュレータによりCPU例外ハンドラのテーブルを生成する場合などには,
3188CPU例外ハンドラを登録しなかったCPU例外ハンドラ番号に対して,デフォルト
3189のCPU例外ハンドラとして,default_exc_handlerを登録する.
3190
3191default_exc_handlerは,標準のものをターゲット依存部で用意するが,ユーザ
3192が用意したもので置き換えられるように,OMIT_DEFAULT_EXC_HANDLERをマクロ
3193定義した場合には,ターゲット依存部で定義しないようにする.なお,ユーザ
3194が用意する場合の名称は,_kernel_default_exc_handlerとなる.
3195
31966.7.6 CPU例外発生時のシステム状æ…
3197‹ã®å‚ç…
3198§
3199
3200(6-7-6-1) bool_t exc_sense_intmask(void *p_excinf)
3201
3202CPU例外の発生した時のシステム状æ…
3203‹ãŒï¼Œã‚«ãƒ¼ãƒãƒ«å®Ÿè¡Œä¸­ã§ãªãï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†
3204キストであり,å…
3205¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
3206‹ã§ãªãï¼ŒCPUロック状æ…
3207‹ã§ãªãï¼Œå‰²è¾¼ã¿å„ªå…
3208ˆ
3209度マスクå…
3210¨è§£é™¤çŠ¶æ…
3211‹ã§ã‚る時にtrue,そうでない時にfalseを返す関数.
3212
3213p_excinfには,CPU例外の情
3214報を記憶している領域のå…
3215ˆé ­ç•ªåœ°ãŒæ¸¡ã•ã‚Œã‚‹ï¼Ž
3216
3217CPU例外がカーネル管理外の割込み処理中で発生した場合にもfalseを返さなけ
3218ればならないことに注意すること.
3219
32206.8 カーネルの起動・終了とスタック領域など
3221
3222(6-8-1) スタートアップモジュール
3223
3224カーネルのスタートアップモジュールは,システムのリセット後に最初に実行
3225されるプログラムである.スタートアップモジュールは,標準的には,プロセッ
3226サ依存部またはチップ依存部で用意し以下の処理を行うが,それにこだわる必
3227
3228要はない.å…
3229·ä½“的には,開発環境に用意されているスタートアップモジュール
3230を用いる方法(この場合,ターゲット依存部でmain関数を用意する必
3231要がある)
3232や,アプリケーションで用意する場合が考えられる.
3233
3234(a) プロセッサ状æ…
3235‹ã®åˆæœŸåŒ–
3236
3237プロセッサモード,スタックポインタ,フレームポインタ等,プロセッサの状
3238æ…
3239‹ã‚’初期化する.また,NMIを除くすべての割込みをマスクした状æ…
3240‹ï¼ˆå…
3241¨å‰²è¾¼ã¿
3242ロック状æ…
3243‹ã¨åŒç­‰ã®çŠ¶æ…
3244‹ï¼‰ã¨ã™ã‚‹ï¼ŽDRAMコントローラの初期化など,メモリを
3245アクセスするために必
3246要な初期化処理をここで行ってもよい(次の
3247hardware_init_hookで行ってもよい).
3248
3249(b) hardware_init_hookを呼び出す
3250
3251システムのリセット後すぐに行う必
3252要のあるターゲットシステム依存の初期化
3253処理を行うために,hardware_init_hookを呼び出す.hardware_init_hookが用
3254意されていない場合は,何もしない.GNU開発環境では,リンカスクリプト中の
3255weak definitionにより,hardware_init_hookが用意されていない場合の値を0
3256とすることで,これを実現できる.weak definitionの機能を持たない開発環境
3257では,hardware_init_hookを必
3258ず呼び出すことにする.
3259
3260hardware_init_hookは,ターゲット依存部で用意するのが標準であるが,シス
3261テムのリセット後すぐに行う必
3262要のある初期化処理を追加するために,アプリ
3263ケーションで用意したものを用いる場合もある.
3264
3265メモリアクセスに必
3266要な初期化処理をhardware_init_hookで行う場合には,こ
3267れを呼び出す時点でメモリにアクセスすることができないため,関数(サブルー
3268チン)を呼び出すためにスタックを使用するプロセッサでは,戻り番地を汎用
3269レジスタにå…
3270¥ã‚Œã¦å‘¼ã³å‡ºã™ã¨ã„った工夫が必
3271要である.この場合,
3272hardware_init_hookをC言語で記述することはできなくなるが,やむをえない.
3273
3274(c) bssセクションとdataセクションの初期化
3275
3276bssセクションをクリアし,dataセクションに初期値を設定する.
3277
3278ただし,カーネル本体は,kerflgがfalse(=0)に初期化されること以外に,
3279これらのセクションが初期化されることに依存していないため,スタートアッ
3280プモジュールをアプリケーションで用意する場合で,システムサービスやアプ
3281リケーションがこれらのセクションが初期化されることに依存していない場合
3282には,システムの起動時間を短縮するために,kerflgをfalseに初期化するだけ
3283で十分である.
3284
3285(d) software_init_hookを呼び出す
3286
3287開発環境(特にライブラリ)に依存して必
3288要な初期化処理を行うために,
3289software_init_hookを呼び出す.software_init_hookが用意されていない場合
3290は,何もしない.GNU開発環境では,リンカスクリプト中のweak definitionに
3291より,software_init_hookが用意されていない場合の値を0とすることで,これ
3292を実現できる.weak definitionの機能を持たない開発環境では,
3293software_init_hookを必
3294ず呼び出すことにする.
3295
3296software_init_hookは,ターゲット依存部で用意するのが標準である.
3297
3298(e) sta_kerへ分岐
3299
3300sta_kerを呼び出す.sta_kerは,NMIを除くすべての割込みをマスクした状æ…
3301‹
3302(å…
3303¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
3304‹ã¨åŒç­‰ã®çŠ¶æ…
3305‹ï¼‰ã§å‘¼ã³å‡ºã•ãªã‘ればならない.sta_kerか
3306らはリターンすることがないため,スタートアップモジュールに戻ってくるこ
3307とは考える必
3308要がない.
3309
3310(6-8-2) void target_initialize(void)
3311
3312ターゲット依存部の初期化を行う関数.sta_kerの最初で呼び出される.プロセッ
3313サ・チップ・開発環境依存の初期化処理を,それらの依存部に切り分けること
3314も可能である.
3315
3316この関数は,あくまでもカーネルのターゲット依存部の初期化処理を行うため
3317のものである.アプリケーションに必
3318要な初期化処理は,初期化ルーチンで行
3319うのが基本であるが,システムのリセット後すぐに行う必
3320要がある場合には,
3321hardware_init_hookを用いる.
3322
3323(6-8-3) void call_exit_kernel(void)
3324
3325非タスクコンテキストに切り換えて,exit_kernelへ分岐する関数.ext_kerか
3326ら呼び出される.exit_kernelからはリターンすることがないため,この関数に
3327戻ってくることは考える必
3328要がない.
3329
3330非タスクコンテキストに切り換えるのは,終了処理ルーチンを,非タスクコン
3331テキスト用のスタックで実行するためである.終了処理ルーチンをタスク用の
3332スタックで実行すると,各タスクのスタック領域のサイズを決定する際に,終
3333了処理ルーチンが使用するスタック領域を考æ…
3334®ã—なければならない.これには,
3335終了処理ルーチンが使用するスタック領域が大きい場合に各タスクのスタック
3336領域を無駄に大きくしなければならないことに加えて,意図しないスタックオー
3337バーフローが発生する可能性を高めるという問題がある.
3338
3339この関数は,å…
3340¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
3341‹ã§å‘¼ã°ã‚Œã‚‹ãŸã‚ï¼Œå…
3342¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
3343‹ã‹ã‚‰å‘¼
3344び出すことができない関数を呼ばないように実装
3345しなければならない.
3346
3347(6-8-4) void target_exit(void)
3348
3349ターゲット依存部の終了処理を行う関数.この関数は,カーネル終了処理の最
3350後に呼び出され,リターンしてはならない.プロセッサ・チップ・開発環境依
3351存の終了処理を,それらの依存部に切り分けることも可能である.
3352
3353この関数では,最初に,atexitによって登録された関数とデストラクタを呼び
3354出すことを意図しており,標準的には,software_term_hookを呼び出す.
3355software_term_hookが用意されていない場合は,何もしない.GNU開発環境では,
3356リンカスクリプト中のweak definitionにより,software_term_hookが用意され
3357ていない場合の値を0とすることで,これを実現できる.weak definitionの機
3358能を持たない開発環境では,software_term_hookを必
3359ず呼び出すことにする.
3360
3361この関数は,å…
3362¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
3363‹ã§å‘¼ã°ã‚Œã‚‹ãŸã‚ï¼Œå…
3364¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
3365‹ã‹ã‚‰å‘¼
3366び出すことができない関数を呼ばないように実装
3367しなければならない.
3368
33696.9 カーネル内
3370部のチューニング
3371
33726.9.1 ビットマップサーチ
3373
3374(6-9-1-1) OMIT_BITMAP_SEARCH(オプション)
3375(6-9-1-2) uint_t bitmap_search(uint16_t bitmap)(オプション)
3376
3377ターゲット非依存部で,uint16_t型の整数値(bitmap)中の1のビットの内
3378,最
3379も下位(右)のものをサーチし,そのビット番号を返す関数bitmap_searchを用
3380意している.ここで,ビット番号は最下位ビットを0とし,bitmapに0を指定し
3381てはならないものとしている.
3382
3383ビットサーチ命令を持つプロセッサでは,bitmap_searchを,ビットサーチ命令
3384を使うように書き直した方が効率が良い場合がある.このような場合には,ター
3385ゲット依存部でビットサーチ命令を使ったbitmap_searchを定義し,
3386OMIT_BITMAP_SEARCHをマクロ定義する.
3387
3388標準ライブラリにビットサーチ命令を用いたffsがある場合,bitmap_searchを
3389(ffs(bitmap) - 1)に定義するとよい.
3390
3391(6-9-1-3) uint16_t PRIMAP_BIT(PRI pri)(オプション)
3392
3393ビットサーチ命令のサーチ方向が逆などの理由で,優å…
3394ˆåº¦ã¨ãƒ“ットとの対応を
3395変更したい場合には,PRIMAP_BITをマクロ定義する.
3396
33976.9.2 ビットフィールド
3398
3399(6-9-2-1) BIT_FIELD_UINT(オプション)
3400
34018ビット以下の幅
3402のビットフィールドで,符号無し整数値を保持したい場合に用
3403いるべきデータ型.デフォルトの定義はunsigned intとなっているが,ターゲッ
3404トやツール依存で,unsigned charまたはunsigned shortに定義した方が効率が
3405良い場合がある.
3406
3407(6-9-2-2) BIT_FIELD_BOOL(オプション)
3408
34091ビット幅
3410のビットフィールドで,ブール値を保持したい場合に用いるべきデー
3411タ型.デフォルトではBIT_FIELD_UINTと同一に定義しているが,ブール値を保
3412持することを明示するために別の名前としている.
3413
3414(6-9-2-3) TBIT_TCB_PRIORITY(オプション)
3415
3416現在優å…
3417ˆåº¦ï¼ˆãŠã‚ˆã³ï¼ŒãƒŸãƒ¥ãƒ¼ãƒ†ãƒƒã‚¯ã‚¹æ‹¡å¼µã«ãŠã‘るベース優å…
3418ˆåº¦ï¼‰ã‚’保持する
3419ためのTCB中のフィールドのビット数.デフォルトでは8ビットに定義している
3420が,それ以外に定義したい場合に,ビット数をこの名前にマクロ定義する.
3421
34226.10 カーネル実装
3423に関するその他の定義
3424
34256.10.1 ターゲット依存のオブジェクト属性
3426
3427(6-10-1-1) TARGET_TSKATR(オプション) ターゲット定義のタスク属性
3428(6-10-1-2) TARGET_ISRATR(オプション) ターゲット定義のISR属性
3429(6-10-1-3) TARGET_INHATR(オプション) ターゲット定義の割込みハンドラ属性
3430(6-10-1-4) TARGET_INTATR(オプション) ターゲット定義の割込み属性
3431(6-10-1-5) TARGET_EXCATR(オプション) ターゲット定義のCPU例外ハンドラ属性
3432
3433各オブジェクトの属性を,ターゲット定義に拡張する場合に,該当するオブジェ
3434クト属性を示す変数に,拡張に使用するビットの論理和を定義する.これによ
3435り,拡張に使用するビットが設定されている場合に,エラーになるのを防ぐ.
3436
3437なお,TOPPERS新世代カーネル統合仕様書では,割込みサービスルーチン(ISR)
3438属性をターゲット定義で拡張できる仕様とはなっていない.
3439
34406.10.2 エラーチェック方法の指定
3441
3442(6-10-2-1) TARGET_MIN_STKSZ(オプション)
3443
3444ターゲット定義で,タスクのスタックサイズの最小値を設定する場合には,こ
3445の変数をスタックサイズの最小値に定義する.
3446
3447(6-10-2-2) TARGET_MIN_ISTKSZ(オプション)
3448
3449ターゲット定義で,非タスクコンテキストのスタックサイズの最小値を設定す
3450る場合には,この変数をスタックサイズの最小値に定義する.
3451
3452(6-10-2-3) CHECK_STKSZ_ALIGN(オプション)
3453
3454スタック領域のサイズがある値(アライン単位)の倍数でなければならない場
3455合に,この変数をアライン単位に定義する.この変数を定義することで,
3456kernel.tfおよびacre_tsk(動的生成機能拡張パッケージのみ)において,スタッ
3457ク領域のサイズが正しくない(この変数に定義した値の倍数でない)場合のエ
3458ラーをチェックするようになる.チェックが必
3459要ない場合には,この変数を定
3460義しない.
3461
3462(6-10-2-4) CHECK_FUNC_ALIGN(オプション) 処理単位のアライン単位
3463(6-10-2-5) CHECK_FUNC_NONNULL(オプション) 処理単位の非NULLチェック
3464(6-10-2-6) CHECK_STACK_ALIGN(オプション) スタック領域のアライン単位
3465(6-10-2-7) CHECK_STACK_NONNULL(オプション)スタック領域の非NULLチェック
3466(6-10-2-8) CHECK_MPF_ALIGN(オプション) 固定長メモリプール領域のアライン単位
3467(6-10-2-9) CHECK_MPF_NONNULL(オプション)固定長メモリプール領域の非NULLチェック
3468
3469処理単位/スタック領域/固定長メモリプール領域のå…
3470ˆé ­ç•ªåœ°ãŒã‚る値(アラ
3471イン単位)の倍数でなければならない場合に,それぞれ,CHECK_FUNC_ALIGN/
3472CHECK_STACK_ALIGN/CHECK_MPF_ALIGNをアライン単位に定義する.処理単位/
3473スタック領域/固定長メモリプール領域のå…
3474ˆé ­ç•ªåœ°ãŒNULLでないかのチェック
3475を行う場合には,それぞれCHECK_FUNC_NONNULL/CHECK_STACK_NONNULL/
3476CHECK_MPF_NONNULLを定義する.
3477
3478(6-10-2-10) CHECK_MB_ALIGN(オプション) 管理領域のアライン単位
3479
3480カーネル内
3481の管理領域(å…
3482·ä½“的には,データキュー管理領域,優å…
3483ˆåº¦ãƒ‡ãƒ¼ã‚¿
3484キュー管理領域,固定長メモリプール管理領域)のå…
3485ˆé ­ç•ªåœ°ãŒã‚る値(アライ
3486ン単位)の倍数でなければならない場合に,この変数をアライン単位に定義す
3487る.動的生成機能拡張パッケージを使用しない場合には,定義する必
3488要がない.
3489
34906.10.3 非タスクコンテキスト用のスタック領域
3491
3492(6-10-3-1) DEFAULT_ISTKSZ
3493
3494DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の,
3495デフォルトのスタック領域のサイズ.
3496
3497(6-10-3-2) DEFAULT_ISTK(オプション)
3498
3499DEF_ICSにより非タスクコンテキスト用のスタック領域が指定されない場合の,
3500デフォルトのスタック領域のå…
3501ˆé ­ç•ªåœ°ï¼Žã“のマクロが定義されない場合には,
3502サイズがDEFAULT_ISTKSZのスタック領域が,é…
3503åˆ—により確保される.
3504
3505(6-10-3-3) STK_T *TOPPERS_ISTKPT(STK_T *istk, SIZE istksz)(オプション)
3506
3507非タスクコンテキスト用のスタックポインタの初期値を保持する変数(istkpt)
3508を用いる場合に,このシンボルに,スタック領域のå…
3509ˆé ­ç•ªåœ°ï¼ˆistk)とスタッ
3510ク領域のサイズ(istksz)から,スタックポインタの初期値を求めるマクロを
3511定義する.
3512
35136.10.4 空ラベルの定義
3514
3515(6-10-4-1) TOPPERS_EMPTY_LABEL(type, symbol)(オプション)
3516
3517リンクエラーを防ぐために,データ型typeのé…
3518åˆ—である変数symbolに定義を与
3519えるためのマクロ.与えた定義が参ç…
3520§ã•ã‚Œã‚‹ã“とはないため,どのような定義
3521を与えてもよい.
3522
3523デフォルトでは,symbolを,要素型がtypeでサイズが0のé…
3524åˆ—に定義している.
3525サイズが0のé…
3526åˆ—がエラーとならないコンパイラ(GCCはこれに該当)を用いる
3527場合には,ターゲット依存部で定義する必
3528要はない.
3529
35306.11 トレースログ機能に関する設定
3531
3532ASPカーネルのソースコードには,カーネルの実行トレースログを取得するため
3533のマクロ等が埋め込んである.デフォルトでは,これらのマクロは空に定義さ
3534れてトレースログの取得は行わないが,これらのマクロを適切に定義すること
3535でトレースログの取得を行うことができる.
3536
35376.11.1 取得できるトレースログの種類とマクロ
3538
3539取得できるトレースログの種類と,それを取得するために定義するマクロは次
3540の通りである.
3541
3542(a) カーネルの動作開始と終了
3543
3544次のマクロを定義することで,カーネルの動作開始時と終了時のトレースログ
3545を取得することができる.
3546
3547 LOG_KER_ENTER カーネルが動作を開始する直前(初期化の完了後)
3548 LOG_KER_LEAVE カーネルの終了(ext_ker)が呼ばれた直後(終了処
3549 理の実行前)
3550
3551(b) 処理単位の実行開始と終了
3552
3553次のマクロを定義することで,割込みハンドラ(INH),割込みサービスルーチ
3554ン(ISR),周期ハンドラ(CYC),アラームハンドラ(ALM),CPU例外ハンド
3555ラ(EXC),タスク例外処理ルーチン(TEX)の実行開始前と終了後のトレース
3556ログを取得することができる.
3557
3558 LOG_<処理単位略号>_ENTER 処理単位の実行開始直前
3559 LOG_<処理単位略号>_LEAVE 処理単位の終了直後
3560
3561割込みハンドラは,アプリケーションが登録したもののみを対象とし,割込み
3562サービスルーチンを呼び出すためにカーネル内
3563に生成されるものは対象としな
3564い.タスクの実行開始と終了は,他の方法で取得できるため,この方法は用意
3565していない.
3566
3567なお,割込みハンドラとCPU例外ハンドラの実行開始と終了のトレースログ取得
3568は,ターゲット依存部で実装
3569する必
3570要がある.詳しくは,「6.2 トレースログ
3571機能への対応」「6.6.1 割込みハンドラの出å…
3572¥å£å‡¦ç†ã€ã€Œ6.7.1 CPU例外ハンド
3573ラの出å…
3574¥å£å‡¦ç†ã€ã®ç¯€ã‚’参ç…
3575§ã™ã‚‹ã“と.
3576
3577(c) タスク状æ…
3578‹ã®å¤‰åŒ–
3579
3580次のマクロを定義することで,タスク状æ…
3581‹ãŒå¤‰åŒ–した時のトレースログを取得
3582することができる.ただし,実行状æ…
3583‹ã¨å®Ÿè¡Œå¯èƒ½çŠ¶æ…
3584‹ã®é–“の遷移は,他の方法
3585で取得できるため,このマクロでは取得できない.
3586
3587 LOG_TSKSTAT タスク状æ…
3588‹ã®å¤‰åŒ–
3589
3590(d) ディスパッチャの実行開始と終了
3591
3592次のマクロを定義することで,ディスパッチャが実行開始する時と,終了する
3593時のトレースログを取得することができる.
3594
3595 LOG_DSP_ENTER ディスパッチャの実行開始
3596 LOG_DSP_LEAVE ディスパッチャの終了
3597
3598ディスパッチャの実行開始は,タスクが実行状æ…
3599‹ã‹ã‚‰å®Ÿè¡Œå¯èƒ½çŠ¶æ…
3600‹ã«é·ç§»ã™ã‚‹
3601タイミングであるため,実行可能状æ…
3602‹ã¸é·ç§»ã™ã‚‹ã‚¿ã‚¹ã‚¯ã®TCBへのポインタをパ
3603ラメータとする.逆に,ディスパッチャの終了は,タスクが実行可能状æ…
3604‹ã‹ã‚‰
3605実行状æ…
3606‹ã«é·ç§»ã™ã‚‹ã‚¿ã‚¤ãƒŸãƒ³ã‚°ã§ã‚るため,実行状æ…
3607‹ã¸é·ç§»ã™ã‚‹ã‚¿ã‚¹ã‚¯ã®TCBへ
3608のポインタをパラメータとする.
3609
3610ASPカーネルでは,実行できるタスクがなく,カーネルがアイドル状æ…
3611‹ã«ãªã‚‹å ´
3612合には,ディスパッチャの中に留まる.そのため,アイドル状æ…
3613‹ã¸ã®é·ç§»ã¨ã‚¢
3614イドル状æ…
3615‹ã‹ã‚‰ä»–の状æ…
3616‹ã¸ã®é·ç§»ã¯ï¼Œã“のマクロでは取得できない.
3617
3618なお,ディスパッチャの実行開始と終了のトレースログ取得は,ターゲット依
3619存部で実装
3620する必
3621要がある.詳しくは,「6.2 トレースログ機能への対応」と
3622「6.5.2 ディスパッチャ本体」の節を参ç…
3623§ã™ã‚‹ã“と.
3624
3625(e) サービスコールのå…
3626¥å£ã¨å‡ºå£
3627
3628次のマクロを定義することで,各サービスコールのå…
3629¥å£ã¨å‡ºå£ã®ãƒˆãƒ¬ãƒ¼ã‚¹ãƒ­ã‚°
3630を取得することができる.
3631
3632 LOG_<サービスコールの大文字表記>_ENTER サービスコール名のå…
3633¥å£
3634 LOG_<サービスコールの大文字表記>_LEAVE サービスコール名の出口
3635
3636それぞれのマクロの名称やパラメータの詳細については,カーネルのソースコー
3637ドを参ç…
3638§ã™ã‚‹ã“と.
3639
36406.11.2 トレースログ記録のサンプルコード
3641
3642トレースログを記録する方法の一例として,メモリ上にトレースログを記録す
3643るためのサンプルコードをarch/logtraceディレクトリに用意している.このサ
3644ンプルコードは,システムログ機能と同様のトレースログ機能を用意し,トレー
3645スログ情
3646報をメモリ上に記録するとともに,それを読み出して表示する機能を
3647実現している.
3648
3649このサンプルコードを組み込む方法は次の通りである.
3650
3651(1) target_config.hおよびtarget_syssvc.hに,次の記述を追加する.
3652
3653 #ifdef TOPPERS_ENABLE_TRACE
3654 #include "logtrace/trace_config.h"
3655 #endif /* TOPPERS_ENABLE_TRACE */
3656
3657(2) Makefile.targetに,次の記述を追加する.
3658
3659 ifeq ($(ENABLE_TRACE),true)
3660 COPTS := $(COPTS) -DTOPPERS_ENABLE_TRACE
3661 KERNEL_DIR := $(KERNEL_DIR) $(SRCDIR)/arch/logtrace
3662 KERNEL_COBJS := $(KERNEL_COBJS) trace_config.o trace_dump.o
3663 endif
3664
3665(3) スタートアップモジュールで,bssセクションのクリアを省略している場合
3666 には,trace_modeをTRACE_STOP(=0)に初期化するコードを追加する.こ
3667 れは,トレースログ機能が初期化される前に書き込まれるトレースログを
3668 無視するためである.
3669
3670このサンプルコードを用いて,トレースログを記録・ダンプする方法の例につ
3671いては,「TOPPERS/ASPカーネル ユーザーズマニュアル」の「11.6 トレースロ
3672グ記録のサンプルコードの使用方法」の節を参ç…
3673§ã™ã‚‹ã“と.
3674
3675なお,このサンプルコードでは,ディスパッチャの出口,タスクの状æ…
3676‹é·ç§»ï¼Œ
3677システムログの出力の3つのトレースログのみを記録している.他のトレースロ
3678グを記録したい場合には,trace_config.h(およびtrace_dump.c)を修正する
3679必
3680要がある.なお,カーネルのトレースログを網羅
3681的に記録するためのコード
3682は,TLV(TraceLogVisualizer)のé…
3683å¸ƒãƒ‘ッケージに含まれている.
3684
36856.12 カーネル実装
3686のターゲット依存部のためのリネーム記述
3687
3688カーネル内
3689部に閉じて使われる関数や変数などの名称で,オブジェクトファイ
3690ルのシンボル表に登録されて外部から参ç…
3691§ã§ãã‚‹åç§°ã¯ï¼ŒC言語レベルで,å…
3692ˆé ­
3693が"_kernel_"または"_KERNEL_"である名称としなければならないが,ASPカーネ
3694ルでは,ソースコードをコンパクトに保ちつつこれを実現するために,リネー
3695ム記述ファイルを導å…
3696¥ã—ている.
3697
3698å…
3699·ä½“的には,リネームすべき名称をリストアップしたxxx_rename.defを用意し,
3700このファイルからツール(utils/genrename)により,名称をリネームするため
3701のマクロ定義を含むxxx_rename.hと,それらのマクロ定義を解除するための
3702xxx_unrename.hを生成する.ツールの起動方法は次の通りである.
3703
3704 % genrename xxx
3705
3706xxx_rename.defには,リネームすべき名称を1行に1つ記述する.xxxxという名
3707称が記述されている場合,xxx_rename.hには次のような記述が生成される.
3708
3709#define xxxx _kernel_xxxx
3710#ifdef TOPPERS_LABEL_ASM
3711#define _xxxx __kernel_xxxx
3712#endif /* TOPPERS_LABEL_ASM */
3713
3714また,xxx_unrename.hには次のような記述が生成される.
3715
3716#undef xxxx
3717#ifdef TOPPERS_LABEL_ASM
3718#undef _xxxx
3719#endif /* TOPPERS_LABEL_ASM */
3720
3721xxx_rename.defの中には,他のリネーム記述を取り込むために,「INCLUDE
3722"yyy"」または「INCLUDE <yyy>」という記述を含めることができる.この記述
3723がされている場合,xxx_rename.hには「#include "yyy_rename.h"」または
3724「#include <yyy_rename.h>」という記述が,xxx_unrename.hには「#include
3725"yyy_unrename.h"」または「#include <yyy_unrename.h>」という記述が生成さ
3726れる.
3727
3728xxx_rename.defの中の"#"で始まる行はコメントとして読み飛ばされる.また,
3729空行も無視される.
3730
3731カーネルのターゲット非依存部で使われる名称をリネームするために,kernel
3732ディレクトリに,kernel_rename.defと,そこから生成したkernel_rename.hお
3733よびkernel_unrename.hが用意されている.kernel_rename.defには,
3734「INCLUDE "target"」という記述が含まれており,ターゲット依存部のリネー
3735ム記述を取り込むようになっている.ターゲット依存部で定義し,ターゲット
3736非依存部で参ç…
3737§ã•ã‚Œã‚‹åç§°ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆä¾å­˜éƒ¨ã®ãƒªãƒãƒ¼ãƒ è¨˜è¿°ã«å«ã‚ã‚‹ï¼Ž
3738
3739ターゲット依存部では,ターゲット依存部で使われる名称をリネームするため
3740に,target_rename.defと,そこから生成したtarget_rename.hおよび
3741target_unrename.hを用意する.ターゲット依存部からプロセッサ・チップ・開
3742発環境依存部を切り分ける場合には,target_rename.defにINCLUDE記述をå…
3743¥ã‚Œï¼Œ
3744プロセッサ・チップ・開発環境依存部のリネーム記述を取り込むようにする.
3745
37466.13 タイマドライバ
3747
3748タイマドライバは,カーネルにタイムティックを通知するためのタイマドライ
3749バである.
3750
37516.13.1 タイマドライバのファイル構成
3752
3753タイマドライバを組み込むための静的APIを記述したシステムコンフィギュレー
3754ションファイルを,target_timer.cfgに用意する.このファイルには,タイマ
3755ドライバを初期化するための初期化ルーチンの追加,タイマドライバを終了さ
3756せるための終了処理ルーチンの追加,タイマ割込みのための割込みハンドラの
3757定義(または,割込みサービスルーチンの追加),タイマ割込みのための割込
3758み要求ラインの属性の設定の静的APIなどを含むことになる.
3759
3760タイマドライバを呼び出すために必
3761要な定義を含むヘッダファイルを,
3762target_timer.hに用意する.また,タイマドライバの実装
3763ファイルを
3764target_timer.cに用意する.
3765
3766タイムティックの通知により行う処理の多くは,タスクの起動や待
3767ち解除を行
3768うものであるため,タイマ割込みの割込み優å…
3769ˆåº¦ã¯ï¼Œå‰²è¾¼ã¿ã®ä¸­ã§æœ€ä½Žã®å„ªå…
3770ˆ
3771度で十分である.ただし,周期ハンドラやアラームハンドラの実行開始遅
3772れが
3773問題になる場合には,タイマ割込みの割込み優å…
3774ˆåº¦ã‚’より高い値に設定したい.
3775そこで,タイマ割込みの割込み優å…
3776ˆåº¦ã‚’変更する方法を,ターゲット依存部の
3777ユーザーズマニュアルに記載すべきである.
3778
37796.13.2 タイマの初期化・終了処理・割込み処理
3780
3781(6-13-2-1) void target_timer_initialize(intptr_t exinf)
3782
3783タイマを初期化し,タイマ割込みを周期的に発生させる関数.タイマ割込みの
3784周期は,TIC_NUMEとTIC_DENOで指定された時間と一致させる(「5.2 タイム
3785ティックの定義」の節を参ç…
3786§ï¼‰ï¼Ž
3787
3788この関数は,target_timer.cfg中に記述する静的APIにより,初期化ルーチンと
3789してカーネルに登録することを想定している.
3790
3791(6-13-2-2) void target_timer_terminate(intptr_t exinf)
3792
3793タイマの動作を停止させ,タイマ割込みを発生しないようにする関数.
3794
3795この関数は,target_timer.cfg中に記述する静的APIにより,終了処理ルーチン
3796としてカーネルに登録することを想定している.
3797
3798(6-13-2-3) void target_timer_handler(void)
3799 または void target_timer_isr(intptr_t exinf)
3800
3801タイマ割込みにより起動される割込み処理プログラム.割込みハンドラとして
3802実現する場合にはtarget_timer_handler,割込みサービスルーチンとして実現
3803する場合にはtarget_timer_isrの名称とする.ターゲット非依存部の
3804signal_timeを呼び出す.
3805
3806target_timer_handlerは,標準的には次のように定義する.
3807
3808----------------------------------------
3809void
3810target_timer_handler(void)
3811{
3812 i_begin_int(<タイマ割込みの割込み番号>);
3813 signal_time();
3814 i_end_int(<タイマ割込みの割込み番号>);
3815}
3816----------------------------------------
3817
3818この関数は,target_timer.cfg中に記述する静的APIにより,割込みハンドラま
3819たは割込みサービスルーチンとしてカーネルに登録することを想定している.
3820
38216.13.3 性能評価用システム時刻の参ç…
3822§ã®ãŸã‚ã®æ©Ÿèƒ½
3823
3824性能評価用システム時刻の参ç…
3825§æ©Ÿèƒ½ï¼ˆget_utm)をサポートする場合には,タイ
3826マドライバで,以下のデータ型や関数などを用意する.
3827
3828(6-13-3-1) OMIT_GET_UTM(オプション)
3829
3830ターゲット非依存部のget_utmの実装
3831を使用せず,ターゲット依存部でget_utm
3832を用意する場合には,このシンボルをマクロ定義する.このシンボルをマクロ
3833定義した場合,以下のデータ型や関数などを用意する必
3834要はない.
3835
3836(6-13-3-2) CLOCK
3837
3838タイマ値の内
3839部表現のためのデータ型.
3840
3841(6-13-3-3) CLOCK target_timer_get_current(void)
3842
3843タイマの現在値を読み出し,内
3844部表現で返す関数.タイマ値は,時間の経過と
3845ともに増加することを想定している.ハードウェアのタイマが,タイマ値が減
3846少するものである場合には,この関数内
3847で増加する値となるように変換する.
3848
3849(6-13-3-4) bool_t target_timer_probe_int(void)
3850
3851タイマ割込み要求をチェックする関数.タイマ割込みが要求されている場合に
3852true,要求されていない場合にfalseを返す.
3853
3854(6-13-3-5) TO_USEC(clock)
3855
3856タイマ値の内
3857部表現を,1μ秒単位に変換するためのマクロ(または関数).
3858targettimer_get_currentで読み出した値を,タイマ割込み発生からの経過時間
3859(単位: 1μ秒)に変換するために用いる.
3860
38616.14 オーバランタイマドライバ(オプション)
3862
3863オーバランタイマドライバは,オーバランハンドラを起動するためのタイマの
3864ドライバである.オーバランハンドラ機能拡張パッケージをサポートしない場
3865合には,オーバランタイマドライバを用意する必
3866要はない.
3867
38686.14.1 オーバランタイマドライバのファイル構成
3869
3870オーバランタイマドライバは,タイマドライバと同じファイルの中に記述する.
3871オーバランタイマドライバのための記述は,TOPPERS_SUPPORT_OVRHDRがマクロ
3872定義されている場合にのみ有効になるようにする.
3873
3874すなわち,オーバランタイマドライバを組み込むための静的APIは
3875target_timer.cfgの中に記述する.このファイルには,オーバランタイマドラ
3876イバを初期化するための初期化ルーチンの追加,オーバランタイマドライバを
3877終了させるための終了処理ルーチンの追加,オーバランタイマ割込みのための
3878割込みハンドラの定義(または,割込みサービスルーチンの追加),オーバラ
3879ンタイマ割込みのための割込み要求ラインの属性の設定の静的APIなどを含むこ
3880とになる.
3881
3882また,オーバランタイマドライバを呼び出すために必
3883要な定義は
3884target_timer.hの中に,オーバランタイマドライバの実装
3885はtarget_timer.cの
3886中に記述する.
3887
3888オーバランハンドラは,タスクのオーバランに対する処理を行うものであるた
3889め,オーバランタイマ割込みの割込み優å…
3890ˆåº¦ã¯ï¼Œå‰²è¾¼ã¿ã®ä¸­ã§æœ€ä½Žã®å„ªå…
3891ˆåº¦ã§
3892十分である.ただし,オーバランタイマ割込みの割込み優å…
3893ˆåº¦ã‚’より高い値に
3894設定したい場合もないとは言えないため,オーバランタイマ割込みの割込み優
3895å…
3896ˆåº¦ã‚’変更する方法を,ターゲット依存部のユーザーズマニュアルに記載すべ
3897きである.
3898
38996.14.2 オーバランタイマの操作と割込み処理
3900
3901(6-14-2-1) void target_ovrtimer_initialize(intptr_t exinf)
3902
3903オーバランタイマの初期化処理を行う.タイマの動作開始は行わない.
3904
3905この関数は,target_timer.cfg中に記述する静的APIにより,初期化ルーチンと
3906してカーネルに登録することを想定している.
3907
3908(6-14-2-2) void target_ovrtimer_terminate(intptr_t exinf)
3909
3910オーバランタイマを停止させ,オーバランタイマ割込みを発生しないようにす
3911る.
3912
3913この関数は,target_timer.cfg中に記述する静的APIにより,終了処理ルーチン
3914としてカーネルに登録することを想定している.
3915
3916(6-14-2-3) void target_ovrtimer_start(OVRTIM ovrtim)
3917
3918オーバランタイマに,残り時間ovrtimを設定し,動作開始する.ovrtimの単位
3919はマイクロ秒とする.
3920
3921(6-14-2-4) OVRTIM target_ovrtimer_stop(void)
3922
3923オーバランタイマを停止し,タイマの残り時間を読み出す.もし残り時間が
39240(またはそれ未満)になっていた場合には,1を返す.また,オーバランタイ
3925マからの割込みをクリアする.
3926
3927(6-14-2-5) OVRTIM target_ovrtimer_get_current(void)
3928
3929オーバランタイマの残り時間を読み出す.もし残り時間が0(またはそれ未満)
3930になっていた場合には,0を返す.オーバランタイマからの割込みはクリアしな
3931い.
3932
3933(6-14-2-6) void target_ovrtimer_handler(void)
3934 または void target_ovrtimer_isr(intptr_t exinf)
3935
3936オーバランタイマ割込みにより起動される割込み処理プログラム.割込みハン
3937ドラとして実現する場合にはtarget_ovrtimer_handler,割込みサービスルーチ
3938ンとして実現する場合にはtarget_ovrtimer_isrの名称とする.ターゲット非依
3939存部のcall_ovrhdrを呼び出す.
3940
3941target_timer_handlerは,標準的には次のように定義する.
3942
3943----------------------------------------
3944void
3945target_ovrtimer_handler(void)
3946{
3947 i_begin_int(<オーバランタイマ割込みの割込み番号>);
3948 オーバランタイマ割込み要求のクリア(必
3949要なら)
3950 call_ovrhdr();
3951 i_end_int(<オーバランタイマ割込みの割込み番号>);
3952}
3953----------------------------------------
3954
3955この関数は,target_timer.cfg中に記述する静的APIにより,割込みハンドラま
3956たは割込みサービスルーチンとしてカーネルに登録することを想定している.
3957
3958(6-14-2-7) OMIT_OVRTIMER_START
3959(6-14-2-8) OMIT_OVRTIMER_STOP
3960
3961ターゲット依存部から呼び出すovrtimer_startとovrtimer_stopを,アセンブリ
3962言語のソースコード中に展開し,C言語の関数が不要になる場合には,それぞれ,
3963OMIT_OVRTIMER_STARTとOMIT_OVRTIMER_STOPをマクロ定義する.
3964
39656.15 動的メモリ管理(オプション)
3966
3967動的生成機能拡張パッケージを使用する場合には,カーネル内
3968での動的メモリ
3969管理の方法を決める必
3970要がある.
3971
3972動的生成機能拡張パッケージのターゲット非依存部では,メモリ領域をå…
3973ˆé ­ã‹
3974ら順に割り当て,解放されたメモリ領域を再利用しないメモリ管理モジュール
3975のみを実装
3976している.デフォルトでは,このメモリ管理モジュールが使用され
3977る.
3978
3979本格的な動的メモリ管理を行いたい場合には,ターゲット依存部またはユーザ
3980側で,以下の関数を定義したメモリ管理モジュールを用意する必
3981要がある.
3982
3983(6-15-1) OMIT_KMM_ALLOCONLY(オプション)
3984
3985ターゲット非依存部のメモリ管理モジュールを使用せず,ターゲット依存部ま
3986たはユーザ側で用意する場合には,このシンボルをマクロ定義する.
3987
3988(6-15-2) void initialize_kmm(void)(オプション)
3989
3990メモリ管理モジュールを初期化する関数.カーネルの割り付けるメモリ領域の
3991サイズとå…
3992ˆé ­ç•ªåœ°ã¯ï¼Œãã‚Œãžã‚Œkmmszとkmmによって参ç…
3993§ã§ãã‚‹ï¼Ž
3994
3995(6-15-3) void *kernel_malloc(SIZE size)(オプション)
3996
3997sizeで指定されたサイズのメモリ領域を割り付け,そのå…
3998ˆé ­ç•ªåœ°ã‚’返す関数.
3999割り付けることができない場合には,NULLを返す.
4000
4001(6-15-4) void kernel_free(void *ptr)(オプション)
4002
4003ptrで指定されたメモリ領域を解放する関数.
4004
40056.15.1 TLSFを用いたメモリ管理モジュールの例
4006
4007オープンソースのメモリ割付けライブラリであるTLSFを用いて動的メモリ管理
4008を実現するには,OMIT_KMM_ALLOCONLYをマクロ定義し,以下の関数定義等をC言
4009語ソースファイルに含めればよい.
4010
4011----------------------------------------
4012#include "tlsf.h"
4013
4014static bool_t tlsf_initialized = false;
4015
4016void
4017initialize_kmm(void)
4018{
4019 if (init_memory_pool(kmmsz, kmm) >= 0) {
4020 tlsf_initialized = true;
4021 }
4022}
4023
4024void *
4025kernel_malloc(SIZE size)
4026{
4027 if (tlsf_initialized) {
4028 return(malloc_ex(size, kmm));
4029 }
4030 else {
4031 return(NULL);
4032 }
4033}
4034
4035void
4036kernel_free(void *ptr)
4037{
4038 if (tlsf_initialized) {
4039 free_ex(ptr, kmm);
4040 }
4041}
4042----------------------------------------
4043
4044
40457.コンフィギュレータ設定ファイルのターゲット依存部
4046
40477.1 設定ファイルとターゲット依存部の位置付け
4048
4049ASPカーネルのコンフィギュレータは,設定ファイルの記述に従ってファイルの
4050生成およびエラーチェックを行う.コンフィギュレータの設定ファイルには,
4051以下の4つがある.
4052
4053(a) 静的APIテーブル
4054
4055静的APIの一覧と,各静的APIのパラメータについて記述したファイル.静的
4056APIを拡張する場合以外は変更する必
4057要がないため,ターゲット非依存部で用意
4058している(kernel/kernel_api.csv).
4059
4060(b) 値取得シンボルテーブル
4061
4062コンフィギュレータのパス1において,パラメータ計算用C言語ファイルに出力
4063し,値を求めたいシンボル(一般には式)を記述するためのファイル.ターゲッ
4064ト非依存部では,ターゲットに依存せずに必
4065要となるシンボルを記述したファ
4066イルを用意している(kernel/kernel_def.csv).
4067
4068ターゲットに依存して必
4069要となるシンボルがある場合には,targetディレクト
4070リに置かれたtarget_def.csv中に記述する.target_def.csv中に記述して値を
4071求めることができるシンボルは,kernel/kernel_int.hおよびそこからインクルー
4072ドされるファイルで定義されていなければならない.kernel_int.hからは,
4073target_stddef.h,target_kernel.h,target_config.hを(間接的に)インクルー
4074ドしているため,これらのファイルおよびそこからインクルードされるファイ
4075ルで定義されるターゲット依存のシンボルは,target_def.csv中に記述するこ
4076とができる.
4077
4078ここで値を求めたシンボルの値は,コンフィギュレータのパス2およびパス3の
4079テンプレートファイル中で参ç…
4080§ã™ã‚‹ã“とができる.
4081
4082(c) パス2のテンプレートファイル
4083
4084コンフィギュレータのパス2は,テンプレートファイルに従って,カーネルの構
4085成・初期化ファイル(kernel_cfg.c),構成・初期化ヘッダファイル
4086(kernel_cfg.h)などを生成する.このテンプレートファイルは,ターゲット
4087非依存部とターゲット依存部に切り分けてあるが,他のファイルのターゲット
4088依存部とは逆に,ターゲット依存部からターゲット非依存部をインクルードす
4089る形になっている.
4090
4091å…
4092·ä½“的には,targetディレクトリに置かれたtarget.tfで,必
4093要な変数を定義し
4094た後,テンプレートファイルのターゲット非依存部(kernel/kernel.tf)をイ
4095ンクルードする.kernel.tfでは,カーネルのターゲット非依存部で使用する変
4096数定義等を生成する.kernel.tfをインクルードした後,target.tfでは,カー
4097ネルのターゲット依存部で使用する変数定義等を生成する.target.tfから,プ
4098ロセッサ依存部,チップ依存部を,開発環境依存部を切り分けてもよい.
4099
4100(d) パス3のテンプレートファイル
4101
4102コンフィギュレータのパス3は,テンプレートファイルに従って,静的APIの一
4103般定数式パラメータのチェックを行う.このテンプレートファイルも,ターゲッ
4104ト非依存部とターゲット依存部に切り分けてあり,ターゲット依存部からター
4105ゲット非依存部をインクルードする形になっている.
4106
4107å…
4108·ä½“的には,targetディレクトリに置かれたtarget_check.tfで,必
4109要な変数を
4110定義した後,テンプレートファイルのターゲット非依存部
4111(kernel/kernel_check.tf)をインクルードする.kernel_check.tfでは,カー
4112ネルのターゲット非依存部で初期化ブロックに出力した一般定数式パラメータ
4113のチェックを行う.kernel_check.tfをインクルードした後,target_check.tf
4114では,ターゲットに依存するチェックを行う.target_check.tfから,プロセッ
4115サ依存部,チップ依存部を,開発環境依存部を切り分けてもよい.
4116
4117なお,コンフィギュレータの詳細仕様と設定ファイルの記述方法については,
4118別途PDFファイルの形でé…
4119å¸ƒã—ている「TOPPERS新世代カーネル用コンフィギュ
4120レータ仕様」および「TOPPERS新世代カーネル用コンフィギュレータ内
4121蔵マクロ
4122プロセッサ仕様」を参ç…
4123§ã™ã‚‹ã“と.
4124
41257.2 パス2のテンプレートファイルのターゲット依存部
4126
4127以下では,パス2のテンプレートファイルのターゲット依存部を記述する上で必
4128
4129要な事項
4130について説明する.
4131
41327.2.1 ターゲット非依存部をインクルードする前に定義すべき変数
4133
4134target.tfからkernel.tfをインクルードする前に,次の変数を定義しておかな
4135ければならない.
4136
4137(7-2-1-1) INTNO_ATTISR_VALID ATT_ISRで使用できる割込み番号
4138(7-2-1-2) INHNO_ATTISR_VALID INTNO_ATTISR_VALIDに対応する割込ハンドラ番号
4139(7-2-1-3) INHNO_DEFINH_VALID DEF_INTで使用できる割込みハンドラ番号
4140(7-2-1-4) EXCNO_DEFEXC_VALID DEF_EXCで使用できるCPU例外ハンドラ番号
4141(7-2-1-5) INTNO_CFGINT_VALID CFG_INTで使用できる割込み番号
4142(7-2-1-6) INTPRI_CFGINT_VALID CFG_INTで使用できる割込み優å…
4143ˆåº¦
4144
4145APIで使用できる割込み番号/割込みハンドラ番号/CPU例外ハンドラ番号/割
4146込み優å…
4147ˆåº¦ã®ãƒªã‚¹ãƒˆã‚’,各変数に定義する.INHNO_ATTISR_VALIDには,
4148INTNO_ATTISR_VALIDにリストアップした割込み番号に対応する割込みハンドラ
4149番号のリストを定義する.CFG_INTには,すべての割込み番号を指定することが
4150できるため,INTNO_CFGINT_VALIDには,有効な割込み番号をすべてリストアッ
4151プする.
4152
4153(7-2-1-7) INTNO_FIX_KERNEL(オプション) カーネル管理に固定されている
4154 割込み番号
4155(7-2-1-8) INHNO_FIX_KERNEL(オプション) カーネル管理に固定されている
4156 割込みハンドラ番号
4157(7-2-1-9) INHNO_FIX_NONKERNEL(オプション) カーネル管理外に固定されている
4158 割込み番号
4159(7-2-1-10) INHNO_FIX_NONKERNEL(オプション)カーネル管理外に固定されている
4160 割込みハンドラ番号
4161
4162カーネル管理またはカーネル管理外に固定されている割込みがある場合には,
4163それらの割込み番号と割込みハンドラ番号のリストを,各変数に定義する.
4164
4165(7-2-1-11) USE_INHINIB_TABLE(オプション)
4166
4167OMIT_INITIALIZE_INTERRUPTを定義したが,割込みハンドラの初期化に必
4168要な情
4169
4170報をkernel_cfg.cに生成したい場合には,この変数を1に設定する.å…
4171·ä½“的には,
4172TNUM_INHNO,tnum_inhno,inhinib_tableの定義と,割込みハンドラ毎の出å…
4173¥å£
4174処理を生成するための記述(INTHDR_ENTRYマクロのリスト)が,ターゲット非
4175依存部によって生成される.
4176
4177(7-2-1-12) USE_INTINIB_TABLE(オプション)
4178
4179OMIT_INITIALIZE_INTERRUPTを定義したが,割込み要求ラインの初期化に必
4180要な
4181情
4182報をkernel_cfg.cに生成したい場合には,この変数を1に設定する.å…
4183·ä½“的に
4184は,TNUM_INTNO,tnum_intno,intinib_tableの定義が,ターゲット非依存部に
4185よって生成される.
4186
4187(7-2-1-13) GENERATE_TSKINICTXB(オプション)
4188
4189USE_TSKINICTXBをマクロ定義した場合,TSKINICTXBの初期化情
4190報を生成するた
4191めテンプレートファイル関数GENERATE_TSKINICTXBを定義する.
4192GENERATE_TSKINICTXBには,タスクIDがパラメータとして渡される.
4193
4194(7-2-1-14) ALLOC_STACK(オプション)
4195
4196スタック領域の生成方法をデフォルトから変更したい場合には,スタック領域
4197を生成するためのテンプレートファイル関数ALLOC_STACKを定義する.
4198ALLOC_STACKには,スタック領域の変数名と丸める前のサイズがパラメータとし
4199て渡されるので,スタック領域を生成するコードを生成し,大きい方に丸めた
4200サイズを表す文字列を返す.
4201
42027.2.2 ターゲット非依存部で定義される変数
4203
4204kernel.tfの中では次の変数が定義されるため,kernel.tfをインクルードした
4205後,target.tfの中でこれらを参ç…
4206§ã™ã‚‹ã“とができる.
4207
4208(7-2-2-1) INTNO[inhno] inhnoを対応するintnoに変換するための連想é…
4209åˆ—
4210(7-2-2-2) INHNO[intno] intnoを対応するinhnoに変換するための連想é…
4211åˆ—
4212
42137.3 パス3のテンプレートファイルのターゲット依存部
4214
4215以下では,パス3のテンプレートファイルのターゲット依存部を記述する上で必
4216
4217要な事項
4218について説明する.
4219
42207.3.1 ターゲット非依存部をインクルードする前に定義すべき変数
4221
4222target_check.tfからkernel_check.tfをインクルードする前に,必
4223要に応じて,
4224次の変数を定義しておかなければならない.
4225
4226(7-3-1-1) GET_STK_TSKINICTXB(オプション)
4227
4228USE_TSKINICTXBをマクロ定義した場合,TINIBからスタック領域のå…
4229ˆé ­ç•ªåœ°ã‚’取
4230り出すためのテンプレートファイル関数GET_STK_TSKINICTXBを定義する.
4231GET_STK_TSKINICTXBには,タスク初期化ブロック(TINIB)のå…
4232ˆé ­ç•ªåœ°ãŒãƒ‘ラメー
4233タとして渡される.CHECK_STACK_ALIGN,CHECK_STACK_NONNULLとも定義しない
4234場合には,GET_STK_TSKINICTXBを定義する必
4235要はない.
4236
4237(7-3-1-2) LMA.ORDER_LIST(オプション)
4238(7-3-1-3) LMA.START_DATA[lmano](オプション)
4239(7-3-1-4) LMA.END_DATA[lmano](オプション)
4240(7-3-1-5) LMA.START_IDATA[lmano](オプション)
4241
4242パス3のテンプレートファイルのターゲット依存部でdataセクションからデータ
4243を取得する場合や,rodataセクションをRAMに置く場合(ユーザーズマニュアル
4244の「11.8 rodataセクションをRAMに置く場合」の節を参ç…
4245§ï¼‰ã«ã¯ï¼Œã“れらのセ
4246クションの内
4247容を,é…
4248ç½®ã‚¢ãƒ‰ãƒ¬ã‚¹ï¼ˆROM内
4249のアドレス,LMAと呼ぶ)からアクセ
4250スアドレス(RAM内
4251のアドレス,VMAと呼ぶ)にコピーする必
4252要がある.
4253
4254このコピーは,LMA.ORDER_LISTに,コピーするセクションの番号(lmano)のリ
4255スト(番号は任意に付与してよい),LMA.START_DATA[lmano]にコピーするセク
4256ションのアクセスアドレスのå…
4257ˆé ­ã®ãƒ©ãƒ™ãƒ«ï¼ŒLMA.END_DATA[lmano]に末尾のラベ
4258ル,LMA.START_IDATA[lmano]にそのé…
4259ç½®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å…
4260ˆé ­ã®ãƒ©ãƒ™ãƒ«ã‚’設定するこ
4261とで,パス3のテンプレートファイルのターゲット非依存部で実施する.
4262
4263例えば,コピーするセクションのアクセスアドレスのå…
4264ˆé ­ã®ãƒ©ãƒ™ãƒ«ãŒ
4265"__data_start",末尾のラベルが"__data_end",そのé…
4266ç½®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å…
4267ˆé ­ã®ãƒ©
4268ベルが"__idata_start"の場合には,パス3のテンプレートファイルのターゲッ
4269ト依存部に以下の記述を含める.
4270
4271----------------------------------------
4272$LMA.ORDER_LIST = { 1 }$
4273$LMA.START_DATA[1] = "__data_start"$
4274$LMA.END_DATA[1] = "__data_end"$
4275$LMA.START_IDATA[1] = "__idata_start"$
4276----------------------------------------
4277
4278
42797.3.2 ターゲット依存部で行うべきエラーチェック
4280
4281以下のå…
4282ˆé ­ç•ªåœ°ã¯ï¼Œã‚¿ãƒ¼ã‚²ãƒƒãƒˆéžä¾å­˜éƒ¨ã§ç”Ÿæˆã™ã‚‹ãƒ†ãƒ¼ãƒ–ルに出力されないた
4283め,パス3のターゲット非依存部(kernel_check.tf)では,プログラムの開始
4284番地として正しくない場合のエラーをチェックしない.そのため,ターゲット
4285依存部でエラーチェックを行う必
4286要がある.
4287
4288・割込みサービスルーチンのå…
4289ˆé ­ç•ªåœ°ï¼ˆATT_ISRのisr)
4290・割込みハンドラのå…
4291ˆé ­ç•ªåœ°ï¼ˆDEF_INHのinthdr)
4292・CPU例外ハンドラのå…
4293ˆé ­ç•ªåœ°ï¼ˆDEF_EXCのexchdr)
4294・初期化ルーチンのå…
4295ˆé ­ç•ªåœ°ï¼ˆATT_INIのinirtn)
4296・終了処理ルーチンのå…
4297ˆé ­ç•ªåœ°ï¼ˆATT_TERのterrtn)
4298
4299ただし,ターゲット依存部においても,これらのエラーチェックを行えるとは
4300限らないため,ユーザーズマニュアルの「1.5 既知の問題」の節には,ターゲッ
4301ト依存でこれらのエラーが検出されないことがある旨を記載してある.
4302
43037.4 cfg1_out.cのリンクに必
4304要なスタブの定義ファイル
4305
4306コンフィギュレータに関してターゲット依存に用意する必
4307要があるファイルと
4308して,設定ファイル以外に,cfg1_out.cをリンクするために必
4309要なスタブの定
4310義ファイルがある.
4311
4312コンフィギュレータのパス1では,静的APIの整数定数式パラメータの値をCコン
4313パイラを用いて求めるために,cfg1_out.cを生成する.これをコンパイル,リ
4314ンクしてオブジェクトファイルを生成する際に,スタートアップモジュールか
4315ら参ç…
4316§ã•ã‚Œã‚‹ã‚·ãƒ³ãƒœãƒ«ã®å®šç¾©ã‚’与える必
4317要がある.
4318
4319この定義を与えるために,cfg1_out.cから,ターゲット依存部の
4320target_cfg1_out.hをインクルードしている.target_cfg1_out.h(または,そ
4321こからインクルードされるファイル)には,スタートアップモジュールから参
4322ç…
4323§ã•ã‚Œã‚‹ã‚·ãƒ³ãƒœãƒ«ã®ã‚¹ã‚¿ãƒ–の定義を含める.å…
4324¸åž‹çš„には,以下のような定義を
4325含める必
4326要がある.
4327
4328----------------------------------------
4329void sta_ker(void)
4330{
4331}
4332
4333void hardware_init_hook(void)
4334{
4335}
4336
4337void software_init_hook(void)
4338{
4339}
4340
4341const SIZE _kernel_istksz = 0;
4342
4343STK_T *const _kernel_istk = NULL;
4344----------------------------------------
4345
4346また,コンフィギュレータを用いてオフセットファイル(offset.h)を生成す
4347る場合には,そのための記述をtarget_cfg1_out.h(または,そこからインクルー
4348ドされるファイル)に追加する必
4349要がある.詳しくは,「2.5.1 コンフィギュ
4350レータを用いる方法」の節を参ç…
4351§ã™ã‚‹ã“と.
4352
4353
43548.システムサービス等のターゲット依存部
4355
43568.0 システムサービスのターゲット依存部
4357
4358シリアルポート数やシステムログタスク関連の定数など,システムサービスの
4359構成を決定するための定義をtarget_syssvc.hまたはそこからインクルードされ
4360るファイル(プロセッサ・チップ・開発環境依存部で用意されるヘッダファイ
4361ルなど)に含める.
4362
4363なお,TOPPERS組込みコンポーネントシステムが導å…
4364¥ã•ã‚Œã‚‹ã¨ï¼Œã“のファイルの
4365内
4366容はコンポーネント記述ファイルに記述されることになり,このファイルは
4367無くなる(または,大幅
4368に縮小される)見込みである.
4369
43708.1 システムログ機能のターゲット依存定義
4371
4372システムログ機能を使用する場合で,スタートアップモジュールでbssセクショ
4373ンのクリアを省略している場合には,syslog_logmaskとsyslog_lowmask_notを
43740に初期化するコードを追加する.これは,システムログ機能が初期化される前
4375に出力されたログ情
4376報を,低レベル出力機能を用いて出力するためである.
4377
4378ターゲット依存部で提供すべきシステムログ機能のための定義は次の通りであ
4379る.
4380
4381(8-1-1) TCNT_SYSLOG_BUFFER
4382
4383システムログ機能のログバッファのサイズを定義するマクロ.定義しない場合
4384のデフォルト値は32.
4385
4386(8-1-2) void target_fput_log(char c)
4387
4388システムログの低レベル出力のための文字出力関数.ターゲット依存の方法で,
4389文字cを表示/出力/保存する.
4390
4391この関数は,リエントラントに実装
4392しなければならない.この関数内
4393で排他制
4394御が必
4395要な場合には,SILを用いてå…
4396¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
4397‹ã«ã™ã‚‹ã“と.また,å…
4398¨å‰²
4399込みロック状æ…
4400‹ã§å‘¼ã°ã‚Œã‚‹å ´åˆãŒã‚るため,å…
4401¨å‰²è¾¼ã¿ãƒ­ãƒƒã‚¯çŠ¶æ…
4402‹ã‹ã‚‰å‘¼ã³å‡ºã™
4403ことができない関数を呼ばないように実装
4404しなければならない.
4405
4406低レベル出力をシリアルポート経由で行う場合で,シリアルインタフェースド
4407ライバとポートをå…
4408±ç”¨ã—ないことが望ましいが,ポート数が足りないためにや
4409むをえずå…
4410±ç”¨ã™ã‚‹å ´åˆã«ã¯ï¼Œä¸¡è€…
4411が競合しないように注意が必
4412要である.å…
4413·ä½“
4414的には,両者
4415が同じ設定でシリアルI/Oデバイスを使うようにし,シリアルイン
4416タフェースドライバの動作中に低レベル出力が行われても差し支えないように
4417設計する.また,低レベル出力が動作開始後にシリアルインタフェースドライ
4418バがシリアルI/Oデバイスを初期化すると,文字化けが起こる可能性があるため,
4419å…
4420±ç”¨ã™ã‚‹ãƒãƒ¼ãƒˆã¯ï¼Œä½Žãƒ¬ãƒ™ãƒ«å‡ºåŠ›æ©Ÿèƒ½å´ã§åˆæœŸåŒ–し,シリアルインタフェース
4421ドライバでは初期化しないようにするとよい.
4422
4423なお,この関数の本体を,どのファイルに記述するかが問題になる.システム
4424サービスのターゲット依存部には,標準では,関数定義を記述するためのファ
4425イルを用意していない.ターゲット依存で用意してもよいが,例外的に,カー
4426ネル実装
4427のターゲット依存モジュール(target_config.c)に記述してもよい.
4428この場合,target_fput_logを,リネーム記述(target_rename.defなど)に含
4429めてはならない.
4430
44318.2 ログタスクのターゲット依存定義
4432
4433ターゲット依存部で提供すべきログタスクのための定義は次の通りである.こ
4434れらの定義は,target_syssvc.hまたはそこからインクルードされるファイルに
4435含める.
4436
4437(8-2-1) LOGTASK_PRIORITY(オプション)
4438
4439ログタスクの優å…
4440ˆåº¦ã‚’定義するマクロ.定義しない場合のデフォルト値は3.
4441
4442(8-2-2) LOGTASK_STACK_SIZE(オプション)
4443
4444ログタスクのスタックサイズを定義するマクロ.定義しない場合のデフォルト
4445値は1024.
4446
4447(8-2-3) LOGTASK_PORTID(オプション)
4448
4449ログタスクの出力å…
4450ˆã®ã‚·ãƒªã‚¢ãƒ«ãƒãƒ¼ãƒˆç•ªå·ï¼Žå®šç¾©ã—ない場合のデフォルト値は1.
4451
4452(8-2-4) LOGTASK_INTERVAL(オプション)
4453
4454ログタスクの動作間隔(単位はミリ秒).定義しない場合のデフォルト値は10.
4455
4456(8-2-5) LOGTASK_FLUSH_WAIT(オプション)
4457
4458ログ出力を待
4459ち合わせる処理において,タスクを待
4460たせる単位となる時間(単
4461位はミリ秒).定義しない場合のデフォルト値は1.
4462
44638.3 シリアルインタフェースドライバのターゲット依存部
4464
4465ターゲット依存部で提供すべきシリアルインタフェースドライバのための定義
4466は次の通りである.これらの定義は,別に指定がない限り,target_serial.hま
4467たはそこからインクルードされるファイルに含め,必
4468要なコンフィギュレーショ
4469ン情
4470報をtarget_serial.cfgに記述する.関数の実体が必
4471要な場合には,
4472target_serial.c等のファイルを用意する.
4473
4474シリアルインタフェースドライバの中で,ターゲットのシリアルI/Oデバイスに
4475依存する部分を,シリアルI/Oデバイスドライバと呼ぶ.シリアルI/Oデバイス
4476ドライバは,おおよそ,ITRONデバイスドライバ設計ガイドラインのPDICに相当
4477する.PDICに相当するファイルで,他のシステムにもå…
4478±é€šã«ä½¿ãˆã‚‹å¯èƒ½æ€§ãŒã‚
4479る場合には,pdicディレクトリに置く.
4480
44818.3.1 変数,データ型,管理関数
4482
4483(8-3-1-1) TNUM_PORT
4484
4485シリアルインタフェースドライバがサポートするシリアルポート数を定義する
4486マクロ.このマクロの定義は,target_syssvc.hまたはそこからインクルードさ
4487れるファイルに含める.
4488
4489(8-3-1-2) void sio_initialize(intptr_t exinf)(オプション)
4490
4491シリアルI/Oデバイスドライバの初期化処理.target_serial.cfgに,この関数
4492を初期化ルーチンとして登録する静的APIを含める.
4493
4494(8-3-1-3) void sio_terminate(intptr_t exinf)(オプション)
4495
4496シリアルI/Oデバイスドライバの終了処理.target_serial.cfgに,この関数を
4497終了処理ルーチンとして登録する静的APIを含める.
4498
4499(8-3-1-4) void sio_isr(intptr_t exinf)
4500
4501シリアルI/Oデバイスの割込みサービスルーチン.target_serial.cfgに,この
4502関数を割込みサービスルーチンとして登録する静的APIを含める.また,その静
4503的APIに必
4504要なシリアルI/Oデバイスの割込み番号などは,target_serial.hでマ
4505クロ定義する.割込みサービスルーチンではなく,割込みハンドラとすること
4506もできる.
4507
4508(8-3-1-5) SIOPCB
4509
4510シリアルI/Oポート管理ブロックのデータ型(target_serial.hには,データ型
4511の宣言だけ含まれていればよい).
4512
4513(8-3-1-6) SIO_RDY_SNDとSIO_RDY_RCV
4514
4515送信可能コールバックの識別番号をSIO_RDY_SNDに,受信通知コールバックの識
4516別番号をSIO_RDY_RCVにマクロ定義する.コールバックの禁止/許可を行なうサー
4517ビスコール(sio_ena_cbrとsio_dis_cbr)で用いる.
4518
45198.3.2 デバイスサービスルーチン
4520
4521以下のデバイスサービルルーチンは,(少なくとも)シリアルI/Oポートからの
4522割込みがマスクされた状æ…
4523‹ã§å‘¼ã³å‡ºã•ã‚Œã‚‹ï¼Žã¾ãŸï¼Œã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆï¼Œéžã‚¿
4524スクコンテキストのいずれで呼び出される場合もある(いずれで呼び出されて
4525も動作するようにしなければならない).
4526
4527(8-3-2-1) SIOPCB *sio_opn_por(ID siopid, intptr_t exinf)
4528
4529siopidで指定されるシリアルI/Oポートをオープンする関数.exinfはシリアル
4530I/Oポートに対する拡張情
4531報で,コールバックを呼ぶ時にポートを区別するた
4532めに渡す.
4533
4534(8-3-2-2) void sio_cls_por(SIOPCB *siopcb)
4535
4536siopcbで指定されるシリアルI/Oポートをクローズする関数.
4537
4538(8-3-2-3) bool_t sio_snd_chr(SIOPCB *siopcb, char c)
4539
4540siopcbで指定されるシリアルI/Oポートに,cで示される文字を送信する関数.
4541文字を送信レジスタにå…
4542¥ã‚ŒãŸå ´åˆã«ã¯trueを,前に送信した文字の送信が終わっ
4543ていないために,文字を送信レジスタにå…
4544¥ã‚Œã‚‰ã‚Œãªã‹ã£ãŸå ´åˆã«ã¯falseを返す.
4545
4546(8-3-2-4) int_t sio_rcv_chr(SIOPCB *siopcb)
4547
4548siopcbで指定されるシリアルI/Oポートから文字を読む関数.文字を受信してい
4549た場合,読んだ文字のコードは正の値として返し,文字を受信していない場合
4550には-1を返す.
4551
4552(8-3-2-5) void sio_ena_cbr(SIOPCB *siopcb, uint_t cbrtn)
4553
4554siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ
4555クを許可する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる.
4556
4557(8-3-2-6) void sio_dis_cbr(SIOPCB *siopcb, uint_t cbrtn)
4558
4559siopcbで指定されるシリアルI/Oポートからの,cbrtnで指定されるコールバッ
4560クを禁止する.cbrtnには,SIO_RDY_SNDかSIO_RDY_RCVを指定できる.
4561
45628.3.3 コールバックルーチン
4563
4564ターゲット依存部は,必
4565要なタイミングで,シリアルインタフェースドライバ
4566のターゲット非依存部に含まれる以下のコールバックルーチンを呼び出びださ
4567なければならない.ただし,それぞれのコールバックが禁止されている時は,
4568コールバックルーチンを呼び出してはならない.
4569
4570コールバックルーチンは,(少なくとも)シリアルI/Oポートからの割込みが禁
4571止された状æ…
4572‹ã§ï¼Œéžã‚¿ã‚¹ã‚¯ã‚³ãƒ³ãƒ†ã‚­ã‚¹ãƒˆã§å‘¼ã³å‡ºã™ï¼Žexinfには,シリアルI/O
4573ポートのオープン時に指定された拡張情
4574報を渡す.
4575
4576(8-3-3-1) void sio_irdy_snd(intptr_t exinf)
4577
4578送信可能コールバックルーチン.シリアルI/Oポートに対して文字が送信できる
4579状æ…
4580‹ã«ãªã£ãŸå ´åˆã«å‘¼ã³å‡ºã™ï¼Žã‚·ãƒªã‚¢ãƒ«ã‚¤ãƒ³ã‚¿ãƒ•ã‚§ãƒ¼ã‚¹ãƒ‰ãƒ©ã‚¤ãƒã¯ï¼Œã“のコー
4581ルバックルーチンの中で,sio_snd_chrを呼び出して次の文字を送信するか,送
4582信すべき文字がない場合には送信可能コールバックを禁止する.
4583
4584(8-3-3-2) void sio_irdy_rcv(intptr_t exinf)
4585
4586受信通知コールバックルーチン.シリアルI/Oポートから文字を受信した場合に
4587呼び出す.シリアルインタフェースドライバは,このコールバックルーチンの
4588中で,必
4589ずsio_rcv_chrを呼び出して受信した文字を取り出す.
4590
45918.4 カーネル起動メッセージの出力のターゲット依存定義
4592
4593ターゲット依存部で提供すべきカーネル起動メッセージの出力のための定義は
4594次の通りである.
4595
4596(8-4-1) TARGET_NAME
4597
4598ターゲットの名称に定義する.
4599
4600(8-4-2) TARGET_COPYRIGHT(オプション)
4601
4602カーネル起動メッセージに,ターゲット依存部の著作権表示を追加するための
4603マクロ.デフォルトでは,ターゲット依存部の著作権表示を追加しない.
4604
46058.5 サンプルプログラムとテストプログラムのターゲット依存定義
4606
4607ターゲット依存部で提供すべきサンプルプログラムおよびテストプログラムの
4608ための定義は次の通りである.これらの定義は,target_test.h(またはそれら
4609からインクルードされるファイル)に含める.
4610
4611(8-5-1) STACK_SIZE(オプション)
4612
4613サンプルプログラムおよびテストプログラムのタスクのスタックサイズを定義
4614するマクロ.定義しない場合のデフォルト値は4096.デフォルト設定ではメモ
4615リが不足する場合や,シミュレーション環境などで大きいスタック領域が必
4616要
4617な場合には,ターゲット依存部でこのマクロを設定するスタックサイズに定義
4618する.
4619
4620(8-5-2) CPUEXC1(オプション)
4621
4622サンプルプログラムおよびテストプログラムで用いるCPU例外のCPU例外ハンド
4623ラ番号を定義するマクロ.このマクロを定義しない場合,CPU例外ハンドラを使
4624う部分がサンプルプログラムから除外される.CPU例外ハンドラのテストをする
4625テストプログラムはコンパイルできない.
4626
4627(8-5-3) RAISE_CPU_EXCEPTION(オプション)
4628
4629CPUEXC1に定義したCPU例外を発生させるC言語のプログラムを定義するマクロ.
4630CPUEXC1を定義した場合には必
4631ず定義しなければならない.
4632
4633(8-5-4) CANNOT_RETURN_CPUEXC(オプション)
4634
4635ターゲットシステムの制約により,CPU例外ハンドラからリターンした後に,タ
4636スクの実行を継続できない場合に定義するマクロ.このマクロを定義すると,
4637CPU例外ハンドラのテストをするテストプログラムから,CPU例外ハンドラから
4638リターンした後の処理が除外される.サンプルプログラムの該当部分は正しく
4639動作しない.
4640
4641(8-5-5) TASK_PORTID(オプション)
4642
4643サンプルプログラムにおいて,コマンド文字を読み込むシリアルポート番号を
4644定義するマクロ.定義しない場合のデフォルト値は1.
4645
4646(8-5-6) LOOP_REF(オプション)
4647
4648サンプルプログラムにおいて,プロセッサの速度を計測するためのループ回数
4649を定義するマクロ.定義しない場合のデフォルト値は1000000.デフォルト設定
4650では,値が大き過ぎて計測に時間がかかりすぎる場合や,値が小さ過ぎて計測
4651結果が安定しない場合に,ターゲット依存部でこのマクロを設定するループ回
4652数に定義する.
4653
4654(8-5-7) MEASURE_TWICE(オプション)
4655
4656サンプルプログラムにおいて,プロセッサの速度を2度計測する場合に定義する
4657マクロ.シミュレーション環境などプロセッサの速度が変動する環境で,1度の
4658計測では計測結果が安定しない場合に定義する.
4659
4660(8-5-8) TASK_LOOP(オプション)
4661
4662サンプルプログラムにおいて,プロセッサの速度を計測せずに,タスク内
4663での
4664ループ回数を固定する場合に,ループ回数を定義するマクロ.ループå…
4665¨ä½“の実
4666行時間が0.4秒程度になるようなループ回数を,このマクロに定義する.
4667
46688.6 実行時間分布集計モジュールのターゲット依存定義
4669
4670実行時間分布集計モジュールの設定をターゲット依存部で変更する場合に,ター
4671ゲット依存部で提供すべき実行時間分布集計モジュールのための定義は次の通
4672りである.これらの定義は,target_test.h(またはそこからインクルードされ
4673るファイル)に含める.この他に,ターゲット依存で必
4674要な初期化処理がある
4675場合にも,ターゲット依存部に含める.
4676
4677(8-6-1) HISTTIM(オプション)
4678
4679実行時間計測用の時刻のデータ型を定義するマクロ.定義しない場合のデフォ
4680ルトはSYSUTM.
4681
4682(8-6-2) void HIST_GET_TIM(HISTTIM *p_time)(オプション)
4683
4684実行時間計測用の現在時刻を*p_timeに取得する処理に定義するマクロ.定義し
4685ない場合のデフォルトはget_utm.
4686
4687(8-6-3) uint_t HIST_CONV_TIM(HISTTIM time)(オプション)
4688
4689実行時間計測用の時刻の差(時間)を,実行時間分布集計用の値に変換する処
4690理に定義するマクロ.時刻が過去に戻ったかオーバフローしたかの区別がつか
4691ない場合には,最上位ビットが1の値(INT_MAXよりも大きい値)を返す.定義
4692しない場合のデフォルトは,timeをuint_tにキャストする処理.
4693
4694(8-6-4) void HIST_BM_HOOK(void)(オプション)
4695
4696実行時間計測直前に行うべき処理に定義するマクロ.キャッシュのパージやフィ
4697ル,メモリバリア処理等を行いたい場合には,このマクロに定義する.定義し
4698ない場合のデフォルトは,空の処理になる.
4699
4700
47019.その他
4702
47039.1 ドキュメント
4704
4705ターゲット依存部のユーザーズマニュアルを,target_user.txtに用意する.プ
4706ロセッサ・チップ・開発環境依存部のユーザーズマニュアルを切り分けてもよ
4707いし,ファイルが大きくなる場合には複数のファイルに分割してよいが,その
4708場合には,target_user.txt中にそれらのファイル名を記述すること.
4709
4710ターゲット依存部のユーザーズマニュアルには,少なくとも次のような内
4711容を
4712記述することが望ましい.
4713
4714(1) 対応しているターゲットシステムの種類・構成,バージョン番号
4715 ・ターゲットハードウェア(ボード等)の名称と対応している構成
4716 ・ターゲット略称
4717 ・ターゲット非依存部のバージョン番号
4718 ・プロセッサ,チップ,開発環境依存部の構成とバージョン番号
4719 ・使用するPDICとバージョン番号
4720
4721(2) 使用する開発環境と動作検証した条件(バージョン,オプション等)
4722 ・言語処理系(コンパイラ,アセンブラ,リンカ等)
4723 ・デバッグ環境
4724
4725(3) ターゲット定義事項
4726の規定
4727
4728(3-1) データ型に関する規定
4729 ・int_t型,long_t型のサイズ
4730 ・char型,int_least8_t型,void *型,intptr_t型のサイズ
4731 ・int8_t型,uint8_t型,int64_t型,uint64_t型,int128_t型,
4732  uint128_t型,float32_t型,double64_t型のサポートの有無
4733
4734(3-2) 割込み処理に関する規定
4735 ・割込みハンドラ番号と割込み番号の割当て,両者
4736の対応
4737 ・割込み優å…
4738ˆåº¦ã®æ®µéšŽæ•°ï¼ˆTMIN_INTPRIの値)
4739 ・dis_intとena_intのサポートの有無,その制限事項
4740
4741 ・CFG_INTの制限事項
4742と拡張(ターゲット定義で使用できる割込み属性)
4743 ・TOPPERS標準割込み処理モデルからのその他の逸脱
4744 ・デフォルトの割込みハンドラ(default_int_handler)の有無と処理内
4745容
4746
4747(3-3) カーネル管理外の割込みに関する規定
4748 ・TMIN_INTPRIは固定か設定できるか,その設定方法
4749 ・NMI以外にカーネル管理外の割込みを設けるか(設けられるようにするか)
4750 ・カーネル管理外の割込みの設定方法
4751 ・カーネル管理外の割込みに対してDEF_INH,CFG_INTをサポートするか
4752 ・カーネル管理外の割込みハンドラが実行開始される時のシステム状æ…
4753‹ã¨
4754  コンテキスト
4755 ・割込みハンドラの終了時に行われる処理
4756 ・カーネル管理外の割込みハンドラの記述方法
4757 ・カーネル内
4758の割込み出å…
4759¥å£å‡¦ç†ã§èµ·ã“る可能性のあるCPU例外
4760
4761(3-4) CPU例外処理に関する規定
4762 ・CPU例外ハンドラ番号の割当て
4763 ・割込み優å…
4764ˆåº¦ãƒžã‚¹ã‚¯ã‚’TMIN_INTPRIと同じかそれよりも高い値に設定して
4765  いる状æ…
4766‹ã§ç™ºç”Ÿã—たCPU例外を,カーネル管理外のCPU例外と扱うか
4767 ・カーネル内
4768のCPU例外出å…
4769¥å£å‡¦ç†ã§èµ·ã“る可能性のあるCPU例外
4770 ・デフォルトのCPU例外ハンドラ(default_exc_handler)の有無と処理内
4771容
4772
4773(3-5) 性能評価用システム時刻の参ç…
4774§ã«é–¢ã™ã‚‹è¦å®š
4775 ・get_utmのサポートの有無,その制限事項
4776
4777
4778(3-6) 拡張パッケージに関する規定
4779 ・各拡張パッケージのサポートの有無
4780 - ミューテックス機能拡張パッケージ
4781 - オーバランハンドラ機能拡張パッケージ
4782 - タスク優å…
4783ˆåº¦æ‹¡å¼µãƒ‘ッケージ
4784 - 制約タスク拡張パッケージ
4785 - 動的生成機能拡張パッケージ
4786 ・オーバランハンドラ機能拡張パッケージをサポートする場合に,プロセッ
4787  サ時間に指定できる値の最大値(TMAX_OVRTIMの値)
4788 ・動的生成機能拡張パッケージをサポートする場合に,動的メモリ管理の
4789  方法
4790
4791(3-7) その他
4792 ・その他の制限事項
4793
4794 ・その他の拡張機能
4795
4796(4) カーネルの起動/終了処理に関する情
4797å ±
4798 ・用意しているスタートアップモジュールの処理内
4799容
4800 ・スタートアップモジュールからhardware_init_hookを呼び出している場
4801  合には,hardware_init_hookをアプリケーションで用意する場合の作成
4802  方法や制限事項
4803など
4804 ・カーネルを終了した後の振舞い
4805
4806(5) メモリマップ
4807 ・デフォルトのメモリマップ,その変更方法
4808
4809(6) タイマドライバ関連の情
4810å ±
4811 ・タイムティックの周期,その変更方法
4812 ・使用するリソース(タイマ)
4813 ・タイマ割込みの割込み優å…
4814ˆåº¦ã®å¤‰æ›´æ–¹æ³•
4815 ・オーバランタイマ割込みの割込み優å…
4816ˆåº¦ã®å¤‰æ›´æ–¹æ³•
4817
4818(7) シリアルインタフェースドライバの情
4819å ±
4820 ・使用するリソース(SIOコントローラ)
4821 ・通信パラメータ(ボーレート,ビット数,パリティの有無,ストップビット)
4822
4823(8) システムログ機能の情
4824å ±
4825 ・システムログの低レベル出力の実現方法
4826 ・通信パラメータ(ボーレート,ビット数,パリティの有無,ストップビット)
4827
4828(9) システム構築手順
4829
4830(10) ターゲットシステム固有の注意事項
4831
4832 ・タスクコンテキストに含まれるレジスタ,含まれないレジスタ
4833
4834(11) 類似のターゲットにポーティングする開発者
4835向けの参考情
4836å ±
4837
4838(12) ディレクトリ構成・ファイル構成
4839
4840(13) バージョン履歴
4841
4842また,必
4843要に応じて,ターゲット依存部の設計メモを,target_design.txtに用
4844意する.プロセッサ・チップ・開発環境依存部に関する設計メモを切り分けて
4845もよいし,ファイルが大きくなる場合には複数のファイルに分割してもよいが,
4846その場合には,target_design.txt中にそれらのファイル名を記述すること.
4847
48489.2 パッケージ記述ファイル
4849
4850リリースパッケージ(個別パッケージおよび簡易パッケージ)を作成するため
4851に,パッケージに含めるファイルを記述したパッケージ記述ファイルを用意す
4852る.パッケージ記述ファイルの名称は,個別パッケージ用をMANIFEST,簡易パッ
4853ケージ用をE_PACKAGEとする.
4854
4855例えば,arch/arm_gccディレクトリに置かれたMANIFESTファイルを用いて個別
4856パッケージを作成する場合には,次のコマンドを実行する.
4857
4858 % utils/makerelease arch/arm_gcc/MANIFEST
4859
4860このコマンドにより,RELEASE/asp_arch_arm_gcc-<バージョン番号>.tar.gzが
4861作成される.また,target/at91skyeye_gccディレクトリに置かれたE_PACKAGE
4862ファイルを用いて簡易パッケージを作成する場合には,次のコマンドを実行す
4863る.
4864
4865 % utils/makerelease target/at91skyeye_gcc/E_PACKAGE
4866
4867このコマンドにより,RELEASE/asp_at91skyeye_gcc-<バージョン番号>.tar.gz
4868が作成される(RELEASEディレクトリがない場合には,ディレクトリが作られ
4869る).
4870
4871なお,makereleaseユーティリティは,ASPカーネルのソースファイルが置かれ
4872たディレクトリが,aspという名称であることを仮定している(異なる名称の場
4873合でもパッケージは作成できるが,パッケージを展開した時に展開されるディ
4874レクトリがaspでなくなる).また,標準のtarコマンドがGNU tarであること
4875(正確には,zオプションに対応していること)を想定している.
4876
4877パッケージ記述ファイルには,パッケージに含めるファイル名を,パッケージ
4878記述ファイルが置かれたディレクトリからの相対パス名で,1行に1つずつ記述
4879する.また,必
4880要に応じて,以下のディレクティブを含める.
4881
4882(a) E_PACKAGE <簡易パッケージ名>
4883
4884簡易パッケージ名を指定する.簡易パッケージ記述ファイル(E_PACKAGE)のå…
4885ˆ
4886頭に記述する.簡易パッケージ名は,asp_<ターゲット略称>とする.例えば,
4887ターゲット略称がat91skyeye_gccの場合には,asp_at91skyeye_gccとなる.個
4888別パッケージと区別するために,簡易パッケージのファイル名には"target"を
4889含めない.
4890
4891(b) PACKAGE <個別パッケージ名>
4892
4893個別パッケージ名を指定する.個別パッケージ記述ファイル(MANIFEST)のå…
4894ˆ
4895頭に記述する.また,そこからインクルードされる各ファイルのå…
4896ˆé ­ã«ã‚‚記述
4897し,それをインクルードしている個別パッケージ名を指定する.ターゲット依
4898存部の個別パッケージ名は,個別パッケージ記述ファイルが置かれたディレク
4899トリの相対パス中の"/"を"_"に置き換えた文字列を,"asp_"の後につなげたも
4900のとする.例えば,個別パッケージ記述ファイルがarch/arm_gcc/MANIFESTの場
4901合には,asp_arch_arm_gccとなる.
4902
4903(c) VERSION <バージョン番号>
4904
4905パッケージのバージョン番号を指定する.簡易パッケージ記述ファイルおよび
4906個別パッケージ記述ファイルの中に記述する.簡易パッケージにおいて,バー
4907ジョン番号をパッケージ化した日付とする場合には,パッケージ番号の代わり
4908に%dateと記述する.
4909
4910バージョン番号の付与方法については,「TOPPERS/ASPカーネル ユーザーズマ
4911ニュアル」の「2.2 簡易パッケージ」および「2.3 個別パッケージ」の節を参
4912ç…
4913§ã™ã‚‹ã“と.
4914
4915(d) INCLUDE <ファイル名>
4916
4917別のパッケージ記述ファイルをインクルードする.簡易パッケージ記述ファイ
4918ルからは,個別パッケージ記述ファイルのみをインクルードするのを原則とす
4919る.個別パッケージ記述ファイルからインクルードされるファイル中で指定さ
4920れる個別パッケージ名は,すべて一致していなければならない.
4921
4922
492310.リファレンス
4924
492510.1 ターゲット依存部のファイル一覧
4926
4927標準的なターゲット依存部のファイル構成は次の通りである.
4928
4929Makefile.target Makefileのターゲット依存部(2章).
4930target_offset.tf オフセットファイル生成用テンプレートファイル(2.5.1節,
4931 オプション)
4932
4933target_stddef.h TOPPERSå…
4934±é€šå®šç¾©ï¼ˆt_stddef.h)のターゲット依存部(3
4935 章).アプリケーションとカーネルの両方からインクルー
4936 ドされる.
4937target_sil.h システムインタフェースレイヤ(sil.h)のターゲット依
4938 存部(4章).アプリケーションとカーネルの両方から
4939 インクルードされる.
4940target_kernel.h カーネルAPI(kernel.h)のターゲット依存部(5章).
4941 アプリケーションとカーネルの両方からインクルードさ
4942 れる.
4943
4944target_config.h カーネル実装
4945のターゲット依存部のヘッダファイル(6
4946 章).カーネルのみからインクルードされる.
4947target_config.c カーネル実装
4948のターゲット依存部のC言語で記述される
4949 部分(6章,オプション).
4950target_support.S カーネル実装
4951のターゲット依存部のアセンブリ言語で記
4952 述される部分(6章,オプション).
4953target_rename.def カーネル実装
4954のターゲット依存部のためのリネーム記述
4955 (6.12節).
4956target_rename.h target_rename.defから生成されるファイル(6.12節).
4957target_unrename.h target_rename.defから生成されるファイル(6.12節).
4958target_timer.cfg タイマドライバのシステムコンフィギュレーションファ
4959 イル(6.13節).
4960target_timer.h タイマドライバのヘッダファイル(6.13節).カーネル
4961 のみからインクルードされる.
4962target_timer.c タイマドライバの実装
4963ファイル(6.13節,オプション).
4964システム略称.h ターゲットのハードウェア資源(割込みハンドラ番号や
4965 CPU例外ハンドラ番号,デバイスレジスタの番地など)の
4966 定義を含むヘッダファイル.アプリケーションとカーネ
4967 ルの両方からインクルードされる(6章,オプション).
4968
4969target_def.csv コンフィギュレータの値取得シンボルテーブルのターゲッ
4970 ト依存部(7章,オプション).
4971target.tf コンフィギュレータのパス2のテンプレートファイルの
4972 ターゲット依存部(7.2節).
4973target_check.tf コンフィギュレータのパス3のテンプレートファイル(7.3
4974 節).
4975target_cfg1_out.h cfg1_out.cのリンクに必
4976要なスタブの定義ファイル(7.4
4977 節).
4978
4979target_syssvc.h システムサービスのターゲット依存定義(8.0節).
4980target_serial.cfg シリアルドライバのシステムコンフィギュレーションファ
4981 イル(8.3節).
4982target_serial.h シリアルドライバのヘッダファイル(8.3節).シリアル
4983 ドライバのみからインクルードされる.
4984target_serial.c シリアルドライバの実装
4985ファイル(8.3節,オプション).
4986target_test.h テストプログラムのターゲット依存定義(8.4節).
4987
4988target_user.txt ユーザーズマニュアル(9.1節)
4989target_design.txt 設計メモ(9.1節,オプション)
4990MANIFEST 個別パッケージに含めるファイルのリスト(9.2節,オプ
4991 ション)
4992E_PACKAGE 簡易パッケージに含めるファイルのリスト(9.2節,オプ
4993 ション)
4994
4995以上
Note: See TracBrowser for help on using the repository browser.