source: asp3_wo_tecs/trunk/doc/porting.txt@ 302

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

TECSレスのASP3の開発のため以下のtrunkからコピー
http://dev.toppers.jp/svn/asp3/branches/WO_TECS-3.C.0

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