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

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

3.1.0を反映

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