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

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

SVNプロパティを設定

  • Property svn:eol-style set to native
  • Property svn:keywords set to Id
  • Property svn:mime-type set to text/plane; charset=UTF-8
File size: 119.0 KB
Line 
1
2 TOPPERS/ASPカーネル
3 ユーザーズマニュアル
4
5 対応バージョン: Release 1.9.3
6 最終更新: 2017年4月29日
7
8このドキュメントは,TOPPERS/ASPカーネルを使用するために必要な事項を説明
9するものである.
10
11----------------------------------------------------------------------
12 TOPPERS/ASP Kernel
13 Toyohashi Open Platform for Embedded Real-Time Systems/
14 Advanced Standard Profile Kernel
15
16 Copyright (C) 2005-2017 by Embedded and Real-Time Systems Laboratory
17 Graduate School of Information Science, Nagoya Univ., JAPAN
18
19 上記著作権者は,以下の(1)~(4)の条件を満たす場合に限り,本ソフトウェ
20 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
21 変・再配布(以下,利用と呼ぶ)することを無償で許諾する.
22 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
23 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
24 スコード中に含まれていること.
25 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
26 用できる形で再配布する場合には,再配布に伴うドキュメント(利用
27 者マニュアルなど)に,上記の著作権表示,この利用条件および下記
28 の無保証規定を掲載すること.
29 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
30 用できない形で再配布する場合には,次のいずれかの条件を満たすこ
31 と.
32 (a) 再配布に伴うドキュメント(利用者マニュアルなど)に,上記の著
33 作権表示,この利用条件および下記の無保証規定を掲載すること.
34 (b) 再配布の形態を,別に定める方法によって,TOPPERSプロジェクトに
35 報告すること.
36 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
37 害からも,上記著作権者およびTOPPERSプロジェクトを免責すること.
38 また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
39 由に基づく請求からも,上記著作権者およびTOPPERSプロジェクトを
40 免責すること.
41
42 本ソフトウェアは,無保証で提供されているものである.上記著作権者お
43 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
44 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
45 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
46 の責任を負わない.
47
48 $Id: user.txt 315 2017-07-23 05:29:40Z coas-nagasima $
49----------------------------------------------------------------------
50
51○目次
52
531.TOPPERS/ASPカーネルの概要
54 1.1 TOPPERS/ASPカーネルの位置付け
55 1.2 TOPPERS/ASPカーネルの仕様
56 1.3 マイグレーションガイド
57 1.4 機能拡張・チューニングガイド
58 1.5 既知の問題
59 1.6 Cygwin環境における注意事項
602.ターゲット依存部
61 2.1 ターゲット依存部の概要
62 2.2 簡易パッケージ
63 2.3 個別パッケージ
643.クイックスタートガイド
65 3.1 開発環境の準備
66 3.2 コンフィギュレータの構築
67 3.3 サンプルプログラムの構築と実行
68 3.4 カーネルを関数単位でライブラリ化する方法
69 3.5 アプリケーションとカーネルを別々に構築する方法
704.ディレクトリ構成・ファイル構成
71 4.1 配布パッケージのディレクトリ構成
72 4.2 ターゲット非依存部のファイル構成
735.コンフィギュレーションスクリプトの使い方
746.Makefileの修正方法
75 6.1 Makefileの変数定義
76 6.2 コンパイルオプション
777.コンフィギュレータの使い方
788.システムサービス
79 8.1 システムログ機能
80 8.1.1 システムログ機能の位置付け
81 8.1.2 ログバッファへの記録と低レベル出力
82 8.1.3 ログ情報の種別
83 8.1.4 ログ情報の重要度
84 8.1.5 ログ情報のデータ構造
85 8.1.6 システムログ機能のサービスコール
86 8.1.7 システムログ機能のためのライブラリ関数とマクロ
87 8.1.8 システムログ機能のその他のサービス
88 8.2 シリアルインタフェースドライバ
89 8.2.1 シリアルインタフェースドライバのサービスコール
90 8.2.2 シリアルインタフェースドライバのその他のサービス
91 8.3 システムログタスク
92 8.3.1 システムログタスクのサービスコール
93 8.3.2 システムログタスクのその他のサービス
94 8.4 カーネル起動メッセージの出力
959.サポートライブラリ
96 9.1 基本的なライブラリ関数
97 9.2 キュー操作ライブラリ関数
98 9.3 システムログ出力用ライブラリ関数
99 9.4 実行時間分布集計モジュール
10010.テストプログラム
101 10.1 テストプログラム用ライブラリ
102 10.2 カーネルの整合性検査
103 10.3 機能テストプログラム
104 10.4 性能評価プログラム
10511.使用上の注意とヒント
106 11.1 タイマドライバの組込み
107 11.2 assertマクロの処理
108 11.3 システムログ機能の扱い
109 11.4 オブジェクトIDの管理
110 11.5 カーネルの内部シンボルのリネーム
111 11.6 トレースログ記録のサンプルコードの使用方法
112 11.7 システムの起動時の初期化処理
113 11.8 rodataセクションをRAMに置く場合
11412.参考情報
115 12.1 利用条件と利用報告
116 12.2 保証・適用性・サポート
117 12.3 バグレポート
118 12.4 ウェブサイト
119 12.5 TOPPERSユーザーズメーリングリスト
120 12.6 TOPPERSプロジェクトのメンバ向けのサービス
121 12.7 TOPPERSプロジェクトへの参加
12213.リファレンス
123 13.1 サービスコール一覧
124 13.2 静的API一覧
125 13.3 バージョン履歴
126
127
1281.TOPPERS/ASPカーネルの概要
129
1301.1 TOPPERS/ASPカーネルの位置付け
131
132TOPPERS/ASPカーネル(以下,ASPカーネル)は,TOPPERS新世代カーネルの基盤
133となるものとして,TOPPERSプロジェクトにおいて開発したリアルタイムカーネ
134ルである.μITRON4.0仕様のスタンダードプロファイル準拠のリアルタイムカー
135ネルであるTOPPERS/JSPカーネルを拡張・改良する形で開発した.
136
1371.2 TOPPERS/ASPカーネルの仕様
138
139ASPカーネルの仕様の概要については,「TOPPERS/ASPカーネルの仕様概要」を
140参照すること.また,ASPカーネルを含むTOPPERS新世代カーネルの仕様の詳細
141については,別途PDFファイルの形で配布している「TOPPERS新世代カーネル統
142合仕様書(Release 1.7.1)」を参照すること.
143
1441.3 マイグレーションガイド
145
146従来のTOPPERSカーネルや他のμITRON4.0仕様準拠のカーネルから,TOPPERS新
147世代カーネルに移行するための方法(またはヒント)を説明した「TOPPERS新世
148代カーネルへのマイグレーションガイド」を,別途PDFファイルの形で配布して
149いる.必要に応じて参照すること.
150
1511.4 機能拡張・チューニングガイド
152
153TOPPERS/ASPカーネルを,機能拡張・チューニングするための方法(またはヒン
154ト)を説明した「機能拡張・チューニングガイド」を用意している.拡張パッ
155ケージの使用方法は,「機能拡張・チューニングガイド」に含まれている.必
156要に応じて参照すること.
157
1581.5 既知の問題
159
160割込みサービスルーチンの先頭番地(ATT_ISRのisr),割込みハンドラの先頭
161番地(DEF_INHのinthdr),CPU例外ハンドラの先頭番地(DEF_EXCのexchdr),
162初期化ルーチンの先頭番地(ATT_INIのinirtn),終了処理ルーチンの先頭番地
163(ATT_TERのterrtn)がプログラムの開始番地として正しくない場合のエラーは,
164コンフィギュレータに検出されない場合がある(ターゲットに依存).
165
166kernel_cfg.c(およびcfg1_out.c)は,カーネル,システムサービス,アプリ
167ケーションのいずれのインクルードファイルもインクルードし,いずれのシン
168ボルも参照する可能性がある.そのため,カーネル,システムサービス,アプ
169リケーションでシンボル等が衝突している場合や,コンパイルオプションが食
170い違っている場合に,kernel_cfg.c(およびcfg1_out.c)が正しくコンパイル
171できなくなる場合が考えられる.カーネルのシンボルをリネームするなどの方
172法で軽減されてはいるが,問題がなくなっているわけではない.
173
174システムコンフィギュレーションファイルから,コンフィギュレータに対する
175INCLUDEディレクティブにより他のコンフィギュレーションファイルをインクルー
176ドしている場合に,その中に含まれるC言語プリプロセッサのインクルードディ
177レクティブ(#include)で,コンフィギュレーションファイルの置かれている
178ディレクトリが,ファイルを検索するパスにはいらないという問題がある.例
179えば,syssvc/syslog.cfgに「#include "syslog.h"」と記述できないのは,こ
180の問題があるためである.
181
182現時点では,アドレスが64ビットの環境には対応していない.64ビットアドレ
183ス環境をサポートするための最大の課題は,モトローラSレコードフォーマット
184が64ビットアドレスに対応していないことである.
185
1861.6 Cygwin環境における注意事項
187
188Cygwin環境においては,ディレクトリの指定を相対パスで行うことを推奨する.
189これは,Cygwin環境の絶対パスは,Windowsネイティブでビルドされたツールは
190解釈できないためである.
191
192
1932.ターゲット依存部
194
1952.1 ターゲット依存部の概要
196
197ASPカーネルのターゲット非依存部と,各種のターゲットシステムに対応するた
198めのターゲット依存部は,別々に開発されている.そのため,ASPカーネルが対
199応しているすべてのターゲット依存部を,バージョンを整合させてパッケージ
200化することは困難である.そこで,主に初級のユーザを対象にした簡易パッケー
201ジと,上級のユーザやカーネル開発者を対象にした個別パッケージを用意して
202いる.
203
204ASPカーネルを未サポートのターゲットシステムへポーティングするために必要
205な作業は,開発環境の構築と標準の開発環境との差異の吸収,カーネル自身の
206ポーティング,システムサービスのポーティングなどからなる.詳しくは,
207「ターゲット依存部 ポーティングガイド」を参照すること.
208
2092.2 簡易パッケージ
210
211簡易パッケージは,ASPカーネルが対応しているターゲットシステム毎に用意さ
212れ,そのターゲットシステム上でASPカーネルを動作させるために必要なファイ
213ル一式をパッケージ化したものである.簡易パッケージに含まれるファイルは,
214バージョンが整合していることが確認されている.
215
216簡易パッケージのバージョン番号は,パッケージ化した日付とすることを原則
217とするが,ターゲットシステム毎の事情によりこの原則に従わない場合がある.
218
219簡易パッケージは,基本的には,次に説明する個別パッケージを複数まとめた
220ものである.そのため,対象ターゲットシステムに必要のないファイルも含ま
221れている.また,簡易パッケージに含まれている個別パッケージのバージョン
222は,個別パッケージのMANIFESTファイルを参照することで知ることができる.
223
2242.3 個別パッケージ
225
226個別パッケージは,ASPカーネルの開発単位毎に,その開発単位で開発を担当し
227ているファイル一式をパッケージ化したものである.ASPカーネルのターゲット
228非依存部も,一つの個別パッケージとして配布される.ある個別パッケージを
229使用するためには,一般には,他の個別パッケージが必要となる.ターゲット
230依存部の個別パッケージを使用するために必要となる個別パッケージとそのバー
231ジョンについては,ターゲット依存部のユーザーズマニュアルを参照すること.
232使用する個別パッケージのバージョンを整合させることは,ユーザの責任であ
233る.
234
235個別パッケージのバージョン番号は,X.Y.Zの形で表現される.ターゲット非依
236存部のバージョン番号を,ASPカーネル全体のリリース番号とする.ターゲット
237依存部のバージョン番号は,XとYが,それが依存するターゲット非依存部と一
238致している.それに対して,Zは一致しているとは限らない.例えば,ターゲッ
239ト非依存部のバージョン1.1.0に対応するターゲット依存部は,バージョン
2401.1.Zの形となる.ターゲット依存部のみがバージョンアップした場合には,Z
241が変更される.
242
243使用する個別パッケージは,次の例のように,ターゲット非依存部の個別パッ
244ケージを展開したのと同じディレクトリで展開する.
245
246 % tar xvfz asp-1.1.0.tar.gz
247 % tar xvfz asp_arch_arm_gcc_1.1.2.tar.gz
248
249ターゲット非依存部の個別パッケージには,以下のターゲット依存部が含まれ
250ているが,これらは他のターゲットシステムにポーティングする際の参考にす
251るために用意しているものであり,その動作については未検証である.
252
253 target/dve68k_gcc DVE-68K/40(GNU開発環境)用ターゲット依存部
254 arch/m68k_gcc M68040(GNU開発環境)用プロセッサ依存部
255 pdic/upd72001 μPD72001用 簡易SIOドライバ
256
257
2583.クイックスタートガイド
259
260ここでは,ターゲット依存部が用意されているターゲットシステム上で,ASPカー
261ネル上で動作するサンプルプログラムを構築・動作させるまでの手順を示す.
262
2633.1 開発環境の準備
264
265ASPカーネルを用いたシステム構築には,以下のツールが必要である.
266
267 ホストシステム用のツール
268 perl 動作確認:5.10.0
269 GNU Make 動作確認:3.81
270
271 TOPPERS新世代カーネル用コンフィギュレータ
272 cfg 動作確認:1.9.4
273 ※ 1.5以前のバージョンでは動作しない.
274
275 ターゲットシステム用のツール(クロス開発環境)
276 標準規格に準拠したCコンパイラ
277 アセンブラ,リンカ,ライブラリアン
278 シンボルファイル出力ツール,ヘキサファイル出力ツール
279 標準Cライブラリ(必須ではない)
280
281ターゲットシステム用のツールにGNU開発環境を用いる場合には,以下のツール
282が必要である.
283
284 ターゲットシステム用のGNU開発環境ツール
285 BINUTILS(as,ld,ar,nm,ranlib,objcopy,objdump)
286 GCCまたはGCC-CORE(gccおよびそこから呼び出されるツール)
287 NEWLIB(標準Cライブラリ,必須ではない)
288
289動作確認されているターゲットシステム用のツールについては,ターゲット依
290存部のユーザーズマニュアルを参照すること.
291
292ターゲットシステム用の標準Cライブラリは,アプリケーションが標準Cライブ
293ラリを使用しない場合には,必要ない.ただし,コンパイラが標準Cライブラリ
294関数(memcpy,memsetなど)を呼び出すコードを生成する場合があり,その場
295合には標準Cライブラリが必要である.標準Cライブラリを用意する代わりに,
296生成したコードが呼び出す関数のみを自分で用意してもよい.
297
298以下では,これらのツールが用意できていることを前提に,UNIXマシン上での
299構築手順を説明する.また以下の説明では,makeコマンドがGNU Makeであるも
300のとする(ASPカーネルのサンプルのMakefileは,GNU Makeの拡張機能を用いて
301いる).
302
3033.2 コンフィギュレータの構築
304
305カーネルを構築する前に,まず,TOPPERS新世代カーネル用コンフィギュレータ
306を構築する必要がある.簡易パッケージに含まれていた場合など,コンフィギュ
307レータを実行ファイル形式で入手した場合には,このステップは必要ない.
308
309コンフィギュレータの構築には,以下のツールが必要である.
310
311 ホストシステム用のツール(セルフ開発環境)
312 C++コンパイラ,C++ライブラリ
313 動作確認(Mac OS X環境):GNU C++ 4.2.1
314 Boost 動作確認:1.52.0
315 GNU Make 動作確認:3.81
316
317最初に,パッケージにコンフィギュレータのソースファイルが含まれていない
318場合には,コンフィギュレータのパッケージを,ASPカーネルのソースファイル
319を展開したディレクトリの下に展開する.
320
321 % cd asp
322 % tar xvfz cfg-1.9.4.tar.gz
323
324または,コンフィギュレータのパッケージを他のディレクトリに展開し,ASPカー
325ネルのソースファイルを展開したディレクトリからシンボリックリンクをはっ
326てもよい.
327
328ソースファイルが展開できると,cfgディレクトリに移動し,コンフィギュレー
329ションスクリプト(configure)でMakefileの環境依存部(Makefile.config)
330を生成した後,makeコマンドによりコンフィギュレータ(cfgプログラム)が構
331築できる.
332
333 % cd cfg
334 % ./configure --without-xml
335 % make depend
336 % make
337
338ただし,Boostをインストールしたディレクトリおよび名称が標準で想定してい
339るものとは違う場合には,configureの--with-headersおよび--with-libraries
340オプションにより,ヘッダファイルおよびライブラリの置かれたディレクトリ
341を指定する必要がある.--without-xmlは,AUTOSAR XMLファイルの読み込み機
342能(ASPカーネル用には必要ない)を取り込まないことを指定するオプションで
343ある(AUTOSAR XMLファイルの読み込み機能を取り込むには,Xerces-C++ XML
344Parserが必要になる).
345
346また,ホストシステムによっては,最適化レベルを上げると正しくコンパイル
347できないことが知られている.そのような場合には,最適化レベルを下げるか,
348最適化を抑止するように,Makefileを修正する必要がある.
349
350なお,コンフィギュレータの使用方法については,「7.コンフィギュレータ
351の使い方」の章で説明する.
352
3533.3 サンプルプログラムの構築と実行
354
355次に,ASPカーネル上で動作するサンプルプログラムを構築する方法を説明する.
356
357まず,サンプルプログラムのオブジェクトファイルを置くディレクトリを作成
358し,コンフィギュレーションスクリプトを実行する.例えば,オブジェクトファ
359イルを置くディレクトリを,ASPカーネルのソースファイルを展開したディレ
360クトリの下のOBJという名称のディレクトリにする場合には,次のコマンドを
361実行する(ディレクトリの場所と名称は任意に決めてよい).
362
363 % cd asp
364 % mkdir OBJ
365 % cd OBJ
366 % perl ../configure -T <ターゲット略称>
367
368ここで,<ターゲット略称>は,targetディレクトリの下に置かれているターゲッ
369ト依存部ディレクトリの名称である.コンフィギュレーションスクリプトのオ
370プションについては,「5.コンフィギュレーションスクリプトの使い方」の
371章で説明する.
372
373コンフィギュレーションスクリプトの実行により,カレントディレクトリには,
374サンプルプログラムを構築するためのMakefile,サンプルプログラム用のコン
375フィギュレーションファイル(sample1.cfg),サンプルプログラム本体
376(sample1.hおよびsample1.c)が生成される.
377
378コンフィギュレーションスクリプトの実行後,必要であればMakefileを修正す
379る.Makefileの修正方法については,「6.Makefileの修正方法」の章で説明
380する.
381
382その後,make dependで依存関係ファイル(Makefile.depend)を生成した後,
383makeコマンドによりサンプルプログラムのロードモジュール(aspまたは
384asp.exe)が生成できる.依存関係ファイルの生成には若干時間がかかる.
385
386 % make depend
387 % make
388
389ここで構築したサンプルプログラム(sample1.h,sample1.c,sample1.cfg)
390は,ASPカーネルの基本的な動作を確認するためのものである.このプログラ
391ムの概要説明は,sample1.cの先頭のコメントにある.
392
3933.4 カーネルを関数単位でライブラリ化する方法
394
395前節の手順では,カーネルをファイル単位でコンパイルし,ライブラリ化して
396いたが,カーネルのコードサイズを縮小するためには,使用しないサービスコー
397ルはリンクしない方が望ましい.そこでASPカーネルでは,カーネルを関数単位
398でコンパイルし,ライブラリ化する方法を用意している.
399
400この方法でサンプルプログラムを構築するには,コンフィギュレーションスク
401リプトに,それを指示するオプション(-f)を付加するだけでよい.
402
403 % mkdir OBJ_LIB
404 % cd OBJ_LIB
405 % perl ../configure -T <ターゲット略称> -f
406
407ここで,OBJ_LIBというディレクトリの場所と名称は,任意に決めてよい.これ
408以降の手順は,前節と同じである.
409
4103.5 アプリケーションとカーネルを別々に構築する方法
411
412前節で説明した方法では,アプリケーションとカーネルを同時に生成するため,
413オブジェクトファイルを置くディレクトリに非常に多くのファイルが作成され
414て,扱いにくくなる.そこで,カーネルを修正する頻度が低い場合には,カー
415ネルは事前に構築しておき,後でアプリケーションだけを構築する方法を用意
416している.以下では,サンプルプログラムを構築を例に,その手順について説
417明する.
418
419まず,カーネルを構築するディレクトリを作成し,コンフィギュレーションス
420クリプトを実行する.例えば,カーネルを構築するディレクトリを,ASPカー
421ネルのソースファイルを展開したディレクトリの下のKERNEL_LIBという名称の
422ディレクトリにする場合には,次のコマンドを実行する(ディレクトリの場所
423と名称は任意に決めてよい).
424
425 % mkdir KERNEL_LIB
426 % cd KERNEL_LIB
427 % perl ../configure -T <ターゲット略称> -f
428
429これにより,カーネルを構築するディレクトリに,Makefile,sample1.cfg,
430sample1.h,sample1.cが生成されるが,Makefile以外は実質的には使用しない.
431
432make dependで依存関係ファイル(Makefile.depend)を生成した後,make
433libkernel.aによりカーネルライブラリ(libkernel.a)が生成できる.
434
435 % make depend
436 % make libkernel.a
437
438次に,アプリケーションを構築するディレクトリを作成し,コンフィギュレー
439ションスクリプトを実行する.例えば,アプリケーションを構築するディレク
440トリを,ASPカーネルのソースファイルを展開したディレクトリの下のAPLとい
441う名称のディレクトリにする場合には,次のコマンドを実行する(ディレクト
442リの場所と名称は任意に決めてよい).
443
444 % cd ..
445 % mkdir APL
446 % cd APL
447 % perl ../configure -T <ターゲット略称> -L ../KERNEL_LIB
448
449ここで-Lオプションには,カーネルを構築したディレクトリのパスを指定する.
450
451最後に,make dependで依存関係ファイル(Makefile.depend)を生成した後,
452makeコマンドによりサンプルプログラムのロードモジュール(aspまたは
453asp.exe)が生成できる.
454
455 % make depend
456 % make
457
458この手順では,アプリケーション構築時にはカーネルの再構築が必要かチェッ
459クしないため,カーネルのソースコードを修正した場合には,カーネルを構築
460したディレクトリでmake libkernel.aを再実行する必要がある.
461
462以上では,カーネルとアプリケーションを別々のディレクトリで構築したが,
463-Lオプションにカレントディレクトリ(ただし,"."という記述では不可)を指
464定することで,カーネルとアプリケーションを同じディレクトリで別々に構築
465することもできる.具体的には,次の手順となる.
466
467 % mkdir OBJ
468 % cd OBJ
469 % perl ../configure -T <ターゲット略称> -L ../OBJ
470 % make depend
471 % make libkernel.a
472 % make cleankernel
473 % make
474
475ここで,make cleankernelは,カーネルライブラリを生成するための中間ファ
476イルを削除するものである.この手順では,make dependによりカーネルライ
477ブラリに関する依存関係を生成しないため,カーネルのソースコードを修正し
478た場合には,必ずmake cleankernel(または,make clean)してから,make
479libkernel.aする必要があるので注意すること.
480
481なお,make realcleanすると,make dependとmakeにより生成したファイルをす
482べて削除する.それに対して,make cleanでは,make dependにより生成した依
483存関係ファイルは削除しない.
484
485
4864.ディレクトリ構成・ファイル構成
487
4884.1 配布パッケージのディレクトリ構成
489
490 include/ アプリケーション向けヘッダファイル
491 kernel/ カーネルのソースファイル
492 syssvc/ システムサービスのヘッダファイル,ソースファイル
493 library/ サポートライブラリのソースファイル
494 target/ ターゲット依存部
495 arch/ ターゲット依存部の共通部分
496 gcc/ GCC開発環境依存部
497 logtrace/ トレースログ記録のサンプルコード
498 pdic/ PDIC(デバイスドライバのOS非依存部分)
499 utils/ ユーティリティプログラム
500 sample/ サンプルプログラムとMakefile
501 doc/ ドキュメント
502 test/ テストプログラム
503 extension/ 拡張パッケージ
504
5054.2 ターゲット非依存部のファイル構成
506
507ターゲット非依存部(テストプログラムと拡張パッケージは除く)の各ファイ
508ルの概要は次の通り.
509
510 README.txt TOPPERS/ASPカーネルの簡単な紹介
511 configure コンフィギュレーションスクリプト(GNU開発環境用)
512 MANIFEST 個別パッケージのファイルリスト
513
514 include/
515 kernel.h ASPカーネルを使用するための定義
516 sil.h システムインタフェースレイヤを使用するための定義
517 t_stddef.h TOPPERS共通ヘッダファイル
518 itron.h ITRON仕様共通規定のデータ型・定数・マクロ
519 t_syslog.h システムログ出力を行うための定義
520 t_stdlib.h 基本的なライブラリ関数を使用するための定義
521 queue.h キュー操作ライブラリを使用するための定義
522 test_lib.h テストプログラム用ライブラリを使用するための定義
523 histogram.h 実行時間分布集計モジュールを使用するための定義
524 log_output.h システムログのフォーマット出力を使用するための定義
525
526 kernel/
527 Makefile.kernel カーネルのファイル構成の定義
528 kernel_impl.h カーネル実装用標準ヘッダファイル
529 kernel_int.h kernel_cfg.c用のヘッダファイル
530 kernel_rename.def カーネルの内部識別名のリネーム定義
531 kernel_rename.h カーネルの内部識別名のリネーム
532 kernel_unrename.h カーネルの内部識別名のリネーム解除
533 kernel_api.csv コンフィギュレータの静的APIテーブル
534 kernel_def.csv コンフィギュレータの値取得シンボルテーブル
535 kernel.tf コンフィギュレータのパス2のテンプレートファイル
536 kernel_check.tf コンフィギュレータのパス3のテンプレートファイル
537 genoffset.tf オフセットファイル生成用のテンプレートファイル
538 allfunc.h すべての関数をコンパイルするための定義
539 check.h エラーチェック用マクロ
540 startup.c カーネルの初期化と終了処理
541 task.h タスク操作ルーチン関連の定義
542 task.c タスク操作ルーチン
543 wait.h 待ち状態操作ルーチン関連の定義
544 wait.c 待ち状態操作ルーチン
545 time_event.h タイムイベント管理関連の定義
546 time_event.c タイムイベント管理
547 task_manage.c タスク管理機能
548 task_refer.c タスク状態参照機能
549 task_sync.c タスク付属同期機能
550 task_except.c タスク例外処理機能
551 semaphore.h セマフォ機能関連の定義
552 semaphore.c セマフォ機能
553 eventflag.h イベントフラグ機能関連の定義
554 eventflag.c イベントフラグ機能
555 dataqueue.h データキュー機能関連の定義
556 dataqueue.c データキュー機能
557 pridataq.h 優先度データキュー機能関連の定義
558 pridataq.c 優先度データキュー機能
559 mailbox.h メールボックス機能関連の定義
560 mailbox.c メールボックス機能
561 mempfix.h 固定長メモリプール機能関連の定義
562 mempfix.c 固定長メモリプール機能
563 time_manage.c システム時刻管理機能
564 cyclic.h 周期ハンドラ機能関連の定義
565 cyclic.c 周期ハンドラ機能
566 alarm.h アラームハンドラ機能関連の定義
567 alarm.c アラームハンドラ機能
568 sys_manage.c システム状態管理機能
569 interrupt.h 割込み管理機能関連の定義
570 interrupt.c 割込み管理機能
571 exception.h CPU例外管理機能関連の定義
572 exception.c CPU例外管理機能
573
574 syssvc/
575 banner.h カーネル起動メッセージの出力のための定義
576 banner.c カーネル起動メッセージの出力
577 banner.cfg カーネル起動メッセージの出力のコンフィギュレー
578 ションファイル
579 logtask.h システムログタスクを使用するための定義
580 logtask.c システムログタスク
581 logtask.cfg システムログタスクのコンフィギュレーションファイル
582 serial.h シリアルインタフェースドライバを使用するための定義
583 serial.c シリアルインタフェースドライバ
584 serial.cfg シリアルドライバのコンフィギュレーションファイル
585 syslog.h システムログ機能を使用するための定義
586 syslog.c システムログ機能
587 syslog.cfg システムログ機能のコンフィギュレーションファイル
588
589 library/
590 histogram.c 実行時間分布集計モジュール
591 log_output.c システムログのフォーマット出力
592 strerror.c エラーメッセージ文字列を返す関数
593 t_perror.c エラーメッセージの出力
594 test_lib.c テストプログラム用ライブラリ
595 vasyslog.c 可変数引数のシステムログライブラリ
596
597 arch/gcc/
598 MANIFEST 個別パッケージのファイルリスト
599 tool_stddef.h t_stddef.hの開発環境依存部(GCC用)
600
601 arch/logtrace/
602 MANIFEST 個別パッケージのファイルリスト
603 trace_config.h トレースログに関する設定
604 trace_config.c トレースログ機能
605 trace_dump.c トレースログのダンプ
606
607 utils/
608 applyrename ファイルにリネームを適用
609 genoffset offset.hの生成(GNU開発環境用)
610 genrename リネームヘッダファイルの生成
611 gentest テストプログラムの生成
612 makedep 依存関係リストの生成(GNU開発環境用)
613 makerelease リリースパッケージの生成
614
615 sample/
616 Makefile サンプルのMakefile(GNU開発環境用)
617 sample1.h サンプルプログラム(1)に関する定義
618 sample1.c サンプルプログラム(1)
619 sample1.cfg サンプルプログラム(1)のコンフィギュレーションファイル
620
621 doc/
622 user.txt ユーザーズマニュアル
623 asp_spec.txt TOPPERS/ASPカーネルの仕様概要
624 extension.txt 機能拡張・チューニングガイド
625 porting.txt ターゲット依存部 ポーティングガイド
626 configurator.txt コンフィギュレータ仕様
627 design.txt 設計メモ
628 version.txt 変更履歴
629
630
6315.コンフィギュレーションスクリプトの使い方
632
633コンフィギュレーションスクリプト(configure)は,ASPカーネルおよびアプ
634リケーションプログラムを構築するために必要な基本的なコンフィギュレーショ
635ンを行うためのプログラムである.
636
637ASPカーネルを用いてアプリケーションを作成する場合には,まずオブジェクト
638ファイルを置くディレクトリを作成し,そのディレクトリでコンフィギュレー
639ションスクリプトを実行する.オブジェクトファイルを置くディレクトリの場
640所と名称は,任意に決めてよい.
641
642コンフィギュレーションスクリプトに対するオプションは次の通り.
643
644 -T <ターゲット略称>
645 ターゲットシステムの名称を,targetディレクトリの下に置かれてい
646 るターゲット依存部ディレクトリの名称で指定する(必須).
647
648 -A <アプリケーションプログラム名>
649 アプリケーションプログラムの名称を指定する.省略した場合には,
650 サンプルプログラム(sample1)となる.
651
652 -a <アプリケーションのディレクトリ名>
653 アプリケーションプログラムのソースファイル(システムコンフィギュ
654 レーションファイルを除く)を置いたディレクトリ名を指定する.省
655 略した場合には,オブジェクトファイルを置くディレクトリに置かれ
656 ていることを仮定する.システムコンフィギュレーションファイルは,
657 オブジェクトファイルを置くディレクトリに置くこと.
658
659 -U <オブジェクトファイル名>
660 アプリケーションプログラムのメインのオブジェクトファイル(-A
661 で指定したアプリケーションプログラム名に".o"を付加したもの)以
662 外に,リンクすべきオブジェクトファイルの名称を,".o"を付加した
663 形で指定する.""で囲むことによって,複数のファイルを指定するこ
664 とも可能である(-Uオプションを複数使ってはならない).
665
666 -L <カーネルライブラリのディレクトリ名>
667 事前に構築したカーネルライブラリ(libkernel.a)を用いて,アプリ
668 ケーションのみを構築する場合には,このオプションにカーネルライ
669 ブラリの置かれたディレクトリ名を指定する.このオプションの使用
670 例については,「3.5 アプリケーションとカーネルを別々に構築する
671 方法」の節を参照すること.
672
673 -f
674 カーネルを関数単位でコンパイルしライブラリ化する場合に,このオ
675 プションを指定する.このオプションの使用例については,「3.4 カー
676 ネルを関数単位でライブラリ化する方法」の節を参照すること.
677
678 -D <ASPカーネルのソースディレクトリ名>
679 ASPカーネルのソースファイルを置いたディレクトリ名を指定する.省
680 略した場合には,configureの置かれているディレクトリとなる.
681
682 -l <プログラミング言語>
683 アプリケーションプログラムのプログラミング言語を指定する.現時
684 点では,cとc++のみをサポートしている.
685
686 -t <テンプレートディレクトリ名>
687 Makefileやサンプルプログラムのテンプレートの置かれたディレクト
688 リ名を指定する.省略した場合には,ASPカーネルのソースファイルを
689 置いたディレクトリの下のsampleディレクトリとなる.
690
691 -m <テンプレートMakefile名>
692 Makefileのテンプレートとするファイル名を指定する.省略した場合
693 には,Makefileとなる.
694
695 -d <実行環境名>
696 ターゲットシステム上でのプログラムの実行環境(ないしは,デバッ
697 グ環境)の名称を指定する.このオプションを指定すると,実行環境
698 を指定するシンボル(TOPPERS_<デバッグ環境名>)がマクロ定義され
699 る.省略した場合には,実行環境を指定するシンボルはマクロ定義さ
700 れない.
701
702 -r
703 トレースログ記録のサンプルコードを有効にする場合に,このオプショ
704 ンを指定する.このオプションの使用例については,「11.6 トレース
705 ログ記録のサンプルコードの使用方法」の節を参照すること.
706
707 -p <perlのパス名>
708 perlのパス名を指定する.省略した場合には,/usr/local/binと
709 /usr/binを探索し,perlのパス名を決定する.
710
711 -g <コンフィギュレータのパス名>
712 コンフィギュレータ(cfg)のパス名を指定する.省略した場合には,
713 デフォルトのパス名(ASPカーネルのソースディレクトリの下の
714 cfg/cfg/cfg)となる.
715
716 -o <オプション文字列>
717 コンパイラに与えるオプション文字列で,シンボル定義以外のもの.
718 シンボル定義のオプションは,-Oオプションを使用する.オプション
719 文字列にスペースが含まれる場合には,"-O2 -Wall"のように,""で囲
720 んで記述する必要がある.
721
722 -O <オプション文字列>
723 コンパイラに与えるシンボル定義のためのオプション文字列.オプショ
724 ン文字列にスペースが含まれる場合には,"-DTEST -DPERF"のように,
725 ""で囲んで記述する必要がある.
726
727 -k <オプション文字列>
728 リンカに与えるオプション文字列.オプション文字列にスペースが含
729 まれる場合には,""で囲んで記述する必要がある.
730
731コンフィギュレーションスクリプトが行う処理は次の通りである.
732
733(1) Makefileの生成
734
735テンプレートディレクトリ(デフォルトでは,sample)から適切なMakefileを
736選択し,必要な箇所を書き換えて,Makefileを生成する.
737
738(2) サンプルプログラムの生成
739
740指定したアプリケーションプログラムがテンプレートディレクトリにある場合,
741適切なアプリケーションプログラムのソースファイルを選択し,必要な箇所を
742書き換えて,アプリケーションプログラムのソースファイル(例えば,
743sample1.h,sample1.c,sample1.cfg)を生成する.
744
745(3) コンフィギュレータが用意できているかのチェック
746
747コンフィギュレータ(cfg)の実行ファイルがあるかチェックし,ファイルがな
748い場合には,その旨を出力する.
749
750
7516.Makefileの修正方法
752
753前の章で説明したように,コンフィギュレーションスクリプトに与えるオプショ
754ン等からMakefileが生成されるが,コンフィギュレーションスクリプトで対応
755できない場合には,Makefileを直接修正する必要がある.ここでは,Makefile
756の中で,修正が必要となる可能性の高い箇所について説明する.
757
758なお,Makefileを修正した後にコンフィギュレーションスクリプトを再実行す
759ると,修正したMakefileが上書きされてしまうので注意すること(古いものが
760Makefile.bakに保存される).
761
7626.1 Makefileの変数定義
763
764(A) ターゲット略称
765
766TARGETには,ターゲットシステムの名称を,targetディレクトリの下に置かれ
767ているターゲット依存部ディレクトリの名称で指定する.この定義は,通常は,
768コンフィギュレーションスクリプトに対する-Tオプションにより行う.
769
770(B) オブジェクトファイルの拡張子
771
772Cygwin環境でコンパイルする時には,OBJEXTを"exe"に定義する必要がある.こ
773れは,Cygwin環境では,ロードモジュールのファイル名に拡張子".exe"が付加
774されるのに対応するためのものである.Cygwin環境であることを判定できれば,
775コンフィギュレーションスクリプトがこの定義を行う.
776
777(C) 実行環境(ターゲット依存)
778
779ターゲットによっては,実行環境に対応してターゲット依存部のコードを差し
780換える場合がある.これを可能にするために,実行環境の名称をDBGENVに定義
781している.この定義は,通常は,コンフィギュレーションスクリプトに対す
782る-Dオプションにより行う.どのターゲットがどの実行環境に対応しているか
783は,ターゲット依存部のユーザーズマニュアルを参照すること.
784
785(D) カーネルライブラリのディレクトリ名
786
787KERNEL_LIBには,カーネルライブラリの置かれたディレクトリ名を定義する.
788この定義は,通常は,コンフィギュレーションスクリプトに対する-Lオプショ
789ンにより行う.
790
791(E) カーネルを関数単位でコンパイルするかどうか
792
793KERNEL_FUNCOBJSは,カーネルを関数単位でコンパイルする場合にはtrueに定義
794し,ファイル単位でコンパイルする場合には未定義とする.この定義は,通常
795は,コンフィギュレーションスクリプトに対する-fオプションにより行う.
796
797(F) 共通コンパイルオプション
798
799すべてのプログラムに共通するコンパイルオプションの追加が必要な場合には,
800下の変数の定義を変更する.そのコンパイルオプションが,特定のターゲット
801で常に必要な場合には,ターゲット依存の定義を入れたMakefile.target等を修
802正すべきである.
803
804 CDEFS コンパイラに対する-Dオプションを記述する.
805 INCLUDES コンパイラに対する-Iオプションを記述する.
806 COPTS コンパイラに対するその他のオプションを記述する.
807 LDFLAGS リンカに対するオプションを記述する.
808 LIBS ライブラリリンクのためのオプションを記述する.
809
810追加の可能性のあるコンパイルオプションについては,「6.2 コンパイルオプ
811ション」の節を参照のこと.
812
813(G) アプリケーションプログラム名
814
815APPLNAMEには,アプリケーションプログラム名を定義する.システムコンフィ
816ギュレーションファイル名は,APPLNAMEに定義した名前に拡張子".cfg"を付加
817した名前とする.また,アプリケーションのメインファイルは,APPLNAMEに定
818義した名前に拡張子".c"を付加した名前とする.この定義は,通常は,コンフィ
819ギュレーションスクリプトに対する-Aオプションにより行う.
820
821(H) アプリケーションのディレクトリ名
822
823アプリケーションのソースファイルを,オブジェクトファイルを置くのとは別
824のディレクトリに置く場合には,APPLDIRにそのディレクトリ名を定義する.こ
825の定義は,通常は,コンフィギュレーションスクリプトに対する-aオプション
826により行う.アプリケーションのソースファイルを置くディレクトリが複数あ
827る場合には,APPL_DIRの定義を変更することで対応する.
828
829(I) アプリケーションのプログラムファイル名
830
831アプリケーションが複数のソースファイルで構成される場合には,そのオブジェ
832クトファイル名を,APPL_ASMOBJS,APPL_COBJS,APPL_CXXOBJSに列挙する.
833
834(J) アプリケーションのコンパイルオプション
835
836アプリケーションのコンパイルに必要なコンパイルオプションや,アプリケー
837ションがライブラリを必要とする場合には,APPL_CFLAGSおよびAPPL_LIBSに定
838義する.
839
840(K) ロードモジュールのファイル名
841
842標準のロードモジュールのファイル名をOBJNAMEに定義する.デフォルトはasp
843である.
844
845(L) ターゲットファイルの定義
846
847ターゲット"all"の依存ファイルとして,ロードモジュールの形式を指定する.
848具体的には,ELF形式の時は$(OBJFILE),バイナリ形式の時は$(OBJNAME).bin,
849モトローラ S形式の時は$(OBJNAME).srecを指定する.$(OBJFILE)は,Cygwin
850環境でOBJEXTを"exe"に定義した時には$(OBJNAME).exe,そうでない場合には
851$(OBJNAME)となる.
852
853(M) makedepのオプションの定義
854
855Cygwin環境でルートディレクトリが"cygdrive"でない場合には,makedepの-Rオ
856プションでルートディレクトリ名を与える必要がある.また,Makefileのター
857ゲット部(":"の左側)に複数のファイル名を記述すると(カーネルを関数単位
858でライブラリ化する場合に,このような記述が生成される)正しく動作しない
859場合には(Cygwin環境のGNU Makeでこのような制限があるという報告がある),
860makedepに-Sオプションを付与する必要がある.
861
862makedepのオプションは,次の例のように,MAKEDEP_OPTSに定義する.
863
864MAKEDEP_OPTS = -R cygdrive -S
865
8666.2 コンパイルオプション
867
868ASPカーネルのコード中には,assertマクロが使われている.assertマクロは,
869NDEBUGを定義することで,オブジェクトコード中から消すことができる.カー
870ネルのデバッグが終了すれば,-DNDEBUGを指定してコンパイルした方が効率が
871よくなる.
872
873ターゲット依存部において,コンパイルオプションに-Werror(警告をエラー扱
874いする)を指定している場合がある.そのようなターゲットにおいて,アプリ
875ケーションで警告が避けられない場合には,ターゲット依存部を修正してコン
876パイルオプションを削除する必要がある.
877
878また,TOPPERS_OMIT_SYSLOGを定義してコンパイルすることで,システムログ出
879力を抑止することができる.
880
881
8827.コンフィギュレータの使い方
883
884コンフィギュレータ(cfg)は,TOPPERS新世代カーネル統合仕様書の2.12.5節
885の記述の通り,3つのパスで構成される.
886
887コンフィギュレータは,システムコンフィギュレーションファイル名をパラメー
888タに取り,以下のオプションを持つ(重要なもののみ).
889
890 --help
891 オプションのリストと説明を表示する.
892
893 -v[--version]
894 コンフィギュレータのバージョンを表示する.
895
896 -k[--kernel]<カーネル名>
897 カーネルの名称を指定する.デフォルトはasp.
898
899 -p[--pass]<パス番号>
900 パス番号を指定する.1~3のいずれか.
901
902 -I[--include-path]<インクルードパス名>
903 INCLUDEディレクティブにおいて,インクルードするコンフィギュレー
904 ションファイルを探すパス名を指定する.
905
906 -T[--template-file]<テンプレートファイル名>
907 テンプレートファイルの名称を指定する.パス2とパス3で有効.
908
909 --api-table <静的APIテーブルファイル名>
910 静的APIテーブルのファイル名を指定する.
911
912 --cfg1-def-table <値取得シンボルテーブルファイル名>
913 値取得シンボルテーブルのファイル名を指定する.
914
915 -r[--rom-image]<ロードモジュール名>
916 ロードモジュールをSレコードフォーマットの形に変換したファイルの
917 名称を指定する.パス3でのみ有効.
918
919 -s [--symbol-table] <シンボルファイル名>
920 ロードモジュール中の各シンボルとアドレスの対応表を含むシンボル
921 ファイルの名称を指定する.パス3でのみ有効.
922
923 --id-output-file <ID番号出力ファイル名>
924 オブジェクトのID番号の割付け結果を,指定した名前のファイルに書
925 き出す.パス2でのみ有効.
926
927 --id-input-file <ID番号入力ファイル名>
928 オブジェクトのID番号の割付けを,指定した名前のファイルから取り
929 込む.パス2でのみ有効.
930
931 --external-id
932 オブジェクトのID番号を保持する変数の定義を生成する.パス2でのみ
933 有効.
934
935 -M[--print-dependencies]<ターゲットシンボル>
936 システムコンフィギュレーションファイルの依存関係を出力する.
937 Makefile中の依存関係を生成する際に用いる.
938
939コンフィギュレータの詳細仕様については,別途PDFファイルの形で配布してい
940る「TOPPERS新世代カーネル用コンフィギュレータ仕様」を参照すること.
941
942
9438.システムサービス
944
9458.1 システムログ機能
946
947システムログ機能は,カーネル内で発生した異常事象やカーネルのトレースロ
948グ,システムサービスやアプリケーションで発生した異常事象やトレースログ
949を,ログ情報として記録するための機能である.また,記録したログ情報を取
950り出す機能も持つ.
951
952システムログ機能は,システムコンフィギュレーションファイルでsyslog.cfg
953をインクルードすることで,システムに組み込むことができる.システムログ
954出力を行うソースファイルでは,t_syslog.hをインクルードする.また,シス
955テムログ機能のその他のサービスコールを呼び出すソースファイルでは,
956syslog.hをインクルードする.
957
9588.1.1 システムログ機能の位置付け
959
960システムログ機能は,カーネル内からも呼び出すことができるため,カーネル
961より下の階層のモジュールと位置付けることができる.この意味では,他のシ
962ステムサービスとは位置付けが異なる.
963
964一方,ログ情報をシステム外部に出力するためには,シリアルインタフェース
965ドライバなど,カーネル上で動作するシステムサービスを用いる必要がある.
966そこで,ログ情報をシステム外部に出力するためのサービス(これを,システ
967ムログタスクと呼ぶ)は,システムログ機能とは分離して実装することとし,
968システムログ機能はログ情報の記録・取出しのための機能に絞っている.
969
970以上のように,システムログ機能はカーネルより下の階層のモジュールである
971が,システムログ機能の中でログ時刻を取り出すために,カーネルの機能を必
972要とする.実装上は,カーネルの内部変数を直接参照している.そのため,カー
973ネルの実行開始前や終了後は,ログ時刻は正しく記録されない.
974
9758.1.2 ログバッファへの記録と低レベル出力
976
977上述したように,ログ情報をシステムの外部に出力するためには,カーネル上
978で動作するシステムサービスを用いる必要があるため,カーネルの動作を継続
979できないような重大な異常事象が起こった場合には,ログ情報を出力できなく
980なる.また,これらのシステムサービス自身をデバッグする場合にも,ログ情
981報の出力ができない.
982
983そこで,カーネル上で動作するシステムサービスが使えない場合にでもログ情
984報を出力するために,低レベル出力機能を用意する.低レベル出力機能は,ター
985ゲット依存に用意する低レベルの文字出力関数(target_fput_log)を用いてロ
986グ情報を出力する機能である.低レベルの文字出力関数は,ターゲット依存部
987で用意することとしているが,最終製品に組み込まれる場合などでは,文字を
988出力する方法がない状況も考えられる.そのような場合,低レベルの文字出力
989関数に送られた文字は,メモリ上に残しておくか,捨ててしまうしかない.
990
991ログ情報を,ログバッファへ記録するか低レベル出力機能を用いて出力するか
992の設定は,システムログ機能のサービスコール(syslog_msk_log)によって行
993うことができる.syslog_msk_logの使い方については後述する.デフォルトで
994は(システムログタスクを動作させず,syslog_msk_logも呼び出さない場合),
995すべてのログ情報を低レベル出力機能を用いて出力し,ログバッファには記録
996しない.
997
998低レベル出力機能を用いると,ログメッセージの作成処理(printf相当の処理)
999と低レベルの文字出力処理をカーネル内で行うために,カーネルの応答性が悪
1000くなることに注意しなければならない.特に,低レベルの文字出力処理はデバ
1001イスをポーリングする形で実装するのが通常で,その場合には,カーネルの応
1002答性は実用的と言えない程に悪くなる.
1003
10048.1.3 ログ情報の種別
1005
1006システムログ機能は,ログ情報に以下の種別を設けている.
1007
1008 LOG_TYPE_COMMENT コメント
1009 LOG_TYPE_ASSERT アサーションの失敗
1010 LOG_TYPE_INH 割込みハンドラ
1011 LOG_TYPE_ISR 割込みサービスルーチン
1012 LOG_TYPE_CYC 周期ハンドラ
1013 LOG_TYPE_ALM アラームハンドラ
1014 LOG_TYPE_OVR オーバランハンドラ
1015 LOG_TYPE_EXC CPU例外ハンドラ
1016 LOG_TYPE_TEX タスク例外処理ルーチン
1017 LOG_TYPE_TSKSTAT タスク状態変化
1018 LOG_TYPE_DSP ディスパッチャ
1019 LOG_TYPE_SVC サービスコール
1020
1021ログ情報の種別の中で,LOG_TYPE_COMMENTとLOG_TYPE_ASSERT以外は,カーネル
1022のトレースログに用いるためのものであるが,使用するかどうかはターゲット
1023依存部に任されている.
1024
10258.1.4 ログ情報の重要度
1026
1027システムログ機能は,ログ情報を出力する際に指定する重要度に基づいて,実
1028際に出力するログ情報を動的に設定することができる.これは,UNIXのシステ
1029ムログ機能をまねたもので,ログの重要度の種類や指定方法もUNIXのAPIを参考
1030にしている.また,低レベル出力機能を用いて出力するログ情報も,重要度に
1031基づいて動的に設定することができる.
1032
1033具体的には,ログの重要度として次の8段階を用意している.
1034
1035 LOG_EMERG カーネルの動作を継続できないエラー
1036 LOG_ALERT
1037 LOG_CRIT
1038 LOG_ERROR 重要性の低いシステムエラー
1039 LOG_WARNING 警告メッセージ.システムは安全に継続動作できる
1040 LOG_NOTICE
1041 LOG_INFO
1042 LOG_DEBUG デバッグのためのメッセージ
1043
1044どの重要度のログ情報をログバッファに記録するかと,どの重要度のログ情報
1045を低レベル出力機能を用いて出力するかは,システムログ機能のサービスコー
1046ル(syslog_msk_log)によって設定することができる.
1047
10488.1.5 ログ情報のデータ構造
1049
1050ログ情報を格納するためのデータ型として,SYSLOG構造体を用意している.
1051SYSLOG構造体には,ログ情報の種別(logtypeフィールド),ログ時刻
1052(logtimフィールド),その他のログ情報(loginfoフィールド)が含まれる.
1053
1054SYSLOG構造体に格納されたログ情報を出力する場合には,ログ時刻は出力関数
1055(syslog_wri_log)によって書き込まれるため,出力関数を呼ぶ側で書き込む
1056必要はない.
1057
10588.1.6 システムログ機能のサービスコール
1059
1060システムログ機能の提供するサービスコールは次の通りである.これらのサー
1061ビスコールを呼び出すソースファイルでは,syslog.hをインクルードする必要
1062がある.
1063
1064(1) ER syslog_wri_log(uint_t prio, const SYSLOG *p_syslog)
1065
1066システムログ機能に,p_syslogで指定されるログ情報を,prioで指定される重
1067要度で出力する(ログバッファへ記録するか低レベル出力機能を用いて出力す
1068る).
1069
1070プロトタイプ宣言において,*p_syslogにconst指定がされているが,実際には,
1071この関数の中で,*p_syslogのlogtimフィールドにシステム時刻を書き込んでい
1072る.
1073
1074(2) ER_UINT syslog_rea_log(SYSLOG *p_syslog)
1075
1076ログバッファからログ情報を1つ取り出す.ログバッファが空の時はE_OBJ,そ
1077うでない場合は,ログバッファのオーバフローにより失われたログ情報の数
1078(ログ情報が失われていない場合は0)を返す.システムログタスクが用いるこ
1079とを想定している.
1080
1081(3) ER syslog_msk_log(uint_t logmask, uint_t lowmask)
1082
1083ログバッファに記録すべきログ情報の重要度の示すビットマップ(logmask)と,
1084低レベル出力機能を用いて出力すべきログ情報の重要度を示すビットマップ
1085(lowmask)を設定する.ビットマップを作るためのマクロとして,LOG_MASKと
1086LOG_UPTOを用意している.
1087
1088(4) ER syslog_ref_log(T_SYSLOG_RLOG *pk_rlog)
1089
1090システムログ機能の状態を参照する.具体的には,ログバッファに記録されて
1091いるログ情報の数(T_SYSLOG_RLOG構造体のcountフィールド),ログバッファ
1092のオーバフローにより失われたログ情報の数(lostフィールド),ログバッファ
1093に記録すべきログ情報の重要度の示すビットマップ(logmaskフィールド),低
1094レベル出力機能を用いて出力すべきログ情報の重要度を示すビットマップ
1095(lowmaskフィールド)を参照することができる.
1096
10978.1.7 システムログ機能のためのライブラリ関数とマクロ
1098
1099システムログ出力のためのライブラリ関数とマクロは次の通りである.これら
1100だけを呼び出すソースファイルでは,t_syslog.hをインクルードすればよい.
1101
1102(1) void _syslog_n(uint_t prio, uint_t type, intptr_t arg1, ..., intptr_t argn)
1103 ※ nは0~6のいずれか.
1104
1105ログ種別がtype,パラメータがarg1~argnのログ情報を,重要度prioで出力す
1106るための関数.
1107
1108(2) void syslog_n(uint_t prio, const char *format, arg1, ..., argn)
1109 ※ nは0~5のいずれか.
1110
1111format文字列およびそれに続く引数から作成されるメッセージを,ログ種別が
1112LOG_TYPE_COMMENTのログ情報として,重要度prioで出力するためのマクロ.
1113
1114formatはメッセージのフォーマット記述,arg1~argnはフォーマット記述中で
1115参照される値で,printfのフォーマット記述のサブセットとなっている.arg1~
1116argnは,このマクロ中でintptr_t型にキャストされるため,intptr_t型に型変
1117換できる任意の型を渡すことができ,型チェックはされない.formatおよび
1118arg1~argnには,次の制限がある.
1119
1120・formatのフォーマット記述は,定数文字列を渡すことを想定しており,この
1121マクロ処理を終えた後も変化してはならない.
1122
1123・format中に使えるフォーマット指定は次の通り.
1124
1125 %d 引数をint_t型とみなし,10進数で表示
1126 %u 引数をuint_t型とみなし,10進数で表示
1127 %x 引数をuint_t型とみなし,16進数(英文字は小文字)で表示
1128 %X 引数をuint_t型とみなし,16進数(英文字は大文字)で表示
1129 %p 引数をポインタとみなし,16進数(英文字は小文字)で表示
1130 %c 引数を文字コードとみなし,文字を表示
1131 %s 引数を文字列を示すポインタとみなし,文字列を表示
1132 %% '%'を表示(引数は取らない)
1133
1134%d, %u, %x, %Xにおいては,'%'の直後に表示桁数を指定する10進数値を記述す
1135ることができる.その場合,表示すべき文字列が指定した桁数に満たない場合
1136には,指定した桁数内に右詰めで表示する.10進数値が'0'で始まる場合には,
1137その間に'0'を埋める.
1138
1139また,intptr_t型のサイズがlong型のサイズ以上である環境においては,次の
1140フォーマット指定も使用することができる.この他のフォーマット指定に'l'
1141を付加した場合には無視する(%lcと%lsには対応していない).
1142
1143 %ld 引数をlong_t型とみなし,10進数で表示
1144 %lu 引数をulong_t型とみなし,10進数で表示
1145 %lx 引数をulong_t型とみなし,16進数(英文字は小文字)で表示
1146 %lX 引数をulong_t型とみなし,16進数(英文字は大文字)で表示
1147
1148・arg1~argnにポインタを渡す場合(%sに対応する引数の場合)に,ポインタ
1149の指すデータは,このマクロ処理を終えた後も変化してはならない.定数文字
1150列を渡すことを想定している.
1151
1152(3) void syslog(uint_t prio, const char *format, ...)
1153
1154format文字列およびそれに続く引数から作成されるメッセージを,ログ種別が
1155LOG_TYPE_COMMENTのログ情報として,重要度prioで出力するための関数で,引
1156数の数を可変にしたもの.formatに続く引数は最大5個まで.formatおよびそれ
1157に続く引数には,syslog_nと同様の制限がある.
1158
1159このライブラリ関数は,可変数引数を処理するために内部で文字列をスキャン
1160する.そのため,実行時間が長くなる可能性があり,割込み禁止状態で呼び出
1161すべきではない.主にアプリケーションプログラムが用いることを想定してい
1162る.
1163
1164(4) UINT LOG_MASK(UINT prio)
1165
1166重要度prioのみセットされたビットマップを作るマクロ.syslog_msk_logに渡
1167す引数を作るために用いる.
1168
1169(5) UINT LOG_UPTO(UINT prio)
1170
1171重要度prio以上の重要度がすべてセットされたビットマップを作るマクロ.
1172syslog_msk_logに渡す引数を作るために用いる.
1173
11748.1.8 システムログ機能のその他のサービス
1175
1176システムログ機能は,前記のサービスコール等に加えて,初期化処理のための
1177関数を持つ.
1178
1179(1) void syslog_initialize(intptr_t exinf)
1180
1181システムログ機能を初期化する.ログバッファにログ情報が記録されている場
1182合には,消去される.syslog.cfgによって,カーネルに初期化ルーチンとして
1183登録される.exinfは無視される.
1184
11858.2 シリアルインタフェースドライバ
1186
1187シリアルインタフェースドライバは,シリアルポートを扱うためのドライバで
1188ある.
1189
1190シリアルインタフェースドライバは,システムコンフィギュレーションファイ
1191ルでserial.cfgをインクルードすることで,システムに組み込むことができる.
1192シリアルインタフェースドライバを呼び出すソースファイルでは,serial.hを
1193インクルードする.
1194
1195シリアルインタフェースドライバは,ポート毎にセマフォを2個ずつ使用する.
1196セマフォを生成する静的APIは,serial.cfgに含まれている.
1197
11988.2.1 シリアルインタフェースドライバのサービスコール
1199
1200シリアルインタフェースドライバを呼び出すサービスコールの仕様は次の通り
1201である.この中で,シリアルポートのID番号(portid)の解釈はターゲット依
1202存となる.
1203
1204これらのサービスコールは,非タスクコンテキストから呼び出すことはできな
1205い.また,serial_rea_datとserial_wri_datは,ディスパッチ保留状態で呼び
1206出すことはできない.いずれも,呼び出した場合にはE_CTXエラーとなる.
1207
1208(1) ER serial_opn_por(ID portid)
1209
1210portidで指定されたシリアルポートをオープンし,受信/送信が可能な状態に
1211する.
1212
1213(2) ER serial_cls_por(ID portid)
1214
1215portidで指定されたシリアルポートをクローズする.
1216
1217(3) ER_UINT serial_rea_dat(ID portid, char *buf, uint_t len)
1218
1219portidで指定されたシリアルポートから,lenバイトの文字列を受信し,bufか
1220らの領域に入れる.lenバイト受信するまで,待ち状態となる.受信した文字数
1221またはエラーコードを返す.
1222
1223(4) ER_UINT serial_wri_dat(ID portid, const char *buf, uint_t len)
1224
1225portidで指定されたシリアルポートに,bufからのlenバイトの文字列を送信す
1226る.lenバイト送信バッファに入れるまで,待ち状態となる.送信した文字数ま
1227たはエラーコードを返す.
1228
1229(5) ER serial_ctl_por(ID portid, uint_t ioctl)
1230
1231portidで指定されたシリアルポートの制御情報を,ioctlで示される値に設定す
1232る.
1233
1234ioctlには,以下の制御情報を表す定数を,ビット毎に論理和をとったものを
1235指定する.
1236
1237 IOCTL_ECHO(エコーバックモード)
1238 このビットを設定すると,シリアルインタフェースドライバがエコー
1239 バックを行う.具体的には,バッファから文字を取り出す度に,その
1240 文字を書き出す.
1241
1242 IOCTL_CRLF(改行モード)
1243 LF(line feed)を書き出すと,CR(carriage return)+LFに変換し
1244 て書き出す.
1245
1246 IOCTL_FCSND(送信フロー制御)
1247 文字を送信する処理に対して,XON/XOFFによるフロー制御を行う.
1248 すなわち,STOP(コントロール-S)を受信すると送信を停止し,
1249 START(コントロール-Q)を受信すると送信を再開する.
1250
1251 IOCTL_FCANY(送信フロー制御で任意の文字で送信再開)
1252 IOCTL_FCSNDを指定している時に,送信停止中に受信した任意の文字
1253 で送信を再開する.
1254
1255 IOCTL_FCRCV(受信フロー制御)
1256 文字を受信する処理に対して,XON/XOFFによるフロー制御を行う.
1257 すなわち,受信バッファの残り領域が少なくなるとSTOP(コントロー
1258 ル-S)を送出し,残り領域が増えればSTART(コントロール-Q)を送
1259 出する.
1260
1261なお,オープン直後のデフォルトの設定値は(IOCTL_ECHO | IOCTL_CRLF |
1262IOCTL_FCSND | IOCTL_FCRCV)である.
1263
1264(6) ER serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor)
1265
1266portidで指定されたシリアルポートの状態を参照し,pk_rporで指定されるパケッ
1267トに返す.パケット中のreacntには受信バッファ中の文字数を,wricntには送
1268信バッファ中の文字数を返す.
1269
12708.2.2 シリアルインタフェースドライバのその他のサービス
1271
1272シリアルインタフェースドライバは,前記のサービスコールに加えて,初期化
1273処理と未送信文字の取出し処理を持つ.初期化処理は,カーネルに初期化ルー
1274チンとして登録する.また,ターゲット依存で,初期化処理,終了処理,割込
1275みサービスルーチンを持つ.これらの登録処理はserial.cfgに含まれる.
1276
1277(1) void serial_initialize(intptr_t exinf)
1278
1279シリアルインタフェースドライバを初期化する.カーネルに初期化ルーチンと
1280して登録する.exinfは無視する.
1281
1282(2) bool_t serial_get_chr(ID portid, char *p_c)
1283
1284portidで指定されたシリアルポートの送信バッファ中の文字を,p_cの指す番地
1285に取り出し,trueを返す関数.文字がなかった時には,falseを返す.終了処理
1286ルーチン中で呼び出すことを想定している.
1287
12888.3 システムログタスク
1289
1290システムログタスクは,システムログ機能からログ情報を取り出し,それをシ
1291ステムの外部に出力するためのサービスである.
1292
1293ASPカーネルのリリースパッケージに含まれるシステムログタスクは,シリアル
1294ポートにログ情報を文字列の形で出力するもので,システムログタスクの一例
1295という位置付けで提供している.
1296
1297このシステムログタスクは,システムコンフィギュレーションファイルで
1298logtask.cfgをインクルードすることで,システムに組み込むことができる.シ
1299ステムログタスクのサービスを呼び出すソースファイルでは,logtask.hをイン
1300クルードする.
1301
1302システムログタスクが実行開始されると,重要度がLOG_EMERGのログ情報を低レ
1303ベル出力機能を用いて出力し,重要度がLOG_NOTICEかそれより高いログ情報を
1304ログバッファに記録するように,システムログ機能の設定が変更される.
1305
13068.3.1 システムログタスクのサービスコール
1307
1308システムログタスクのサービスを呼び出すサービスコールの仕様は次の通りで
1309ある.
1310
1311(1) ER logtask_flush(uint_t count)
1312
1313システムログ機能のログバッファ中のログ情報の数がcount以下になるまで待つ.
1314countが0の場合には,シリアルインタフェースドライバの送信バッファが空に
1315なるのも待つ.
1316
13178.3.2 システムログタスクのその他のサービス
1318
1319システムログタスクは,前記のサービスコールに加えて,メイン処理と終了処
1320理を持つ.メイン処理はタスクとして,終了処理は終了処理ルーチンとして登
1321録する.これらの登録処理はlogtask.cfgに含まれる.
1322
1323(1) void logtask_main(intptr_t exinf)
1324
1325システムログタスクのメイン処理.exinfには,ログ情報を出力するシリアルポー
1326トのID番号を渡す.
1327
1328(2) void logtask_terminate(intptr_t exinf)
1329
1330システムログタスクの終了処理.シリアルインタフェースドライバの送信バッ
1331ファに蓄積されたデータと,ログバッファに記録されたログ情報を,低レベル
1332出力機能を用いて出力する.出力すべきログ情報がある場合には,それを出力
1333する前に,"-- buffered messages --"という文字列を出力する.exinfは無視
1334する.
1335
1336この関数を終了処理ルーチンとして登録することで,カーネル終了時点で未出
1337力のログ情報のほとんどを出力することができる.ただし,未出力のログ情報
1338の内,システムログタスクのメイン処理が,ログバッファから取り出したが,
1339まだシリアルインタフェースドライバに送信していない情報は,この関数では
1340出力できない.
1341
13428.4 カーネル起動メッセージの出力
1343
1344カーネル起動メッセージの出力は,カーネルの起動時に,カーネルの名称やバー
1345ジョン番号,著作権表示などを出力するための機能である.
1346
1347カーネル起動メッセージの出力は,システムコンフィギュレーションファイル
1348でbanner.cfgをインクルードすることで,システムに組み込むことができる.
1349
1350カーネル起動メッセージの出力は,次の関数で構成される.
1351
1352(1) void print_banner(intptr_t exinf)
1353
1354システムログ機能を用いて,カーネル起動メッセージを出力する.banner.cfg
1355によって,カーネルに初期化ルーチンとして登録される.exinfは無視される.
1356
1357
13589.サポートライブラリ
1359
1360サポートライブラリは,アプリケーションやシステムサービスを作成するため
1361に利用できるライブラリ関数群である.
1362
13639.1 基本的なライブラリ関数
1364
1365基本的なライブラリ関数を用いる場合には,t_stdlib.hをインクルードし,必
1366要に応じてstrerror.cとt_perror.cをコンパイル・リンクする.
1367
1368(1) const char *itron_strerror(ER ercd)
1369
1370ercdで示されるエラーコードに対応するメインエラーコードの文字列を返す.
1371
1372(2) void t_perror(uint_t prio, const char *file, int_t line,
1373 const char *expr, ER ercd);
1374
1375サービスコールがエラーを返した場合に用いることを想定した関数で,ファイ
1376ル名,行番号,メインエラーコード等を,重要度prioで,システムログ機能を
1377用いて出力する.
1378
13799.2 キュー操作ライブラリ関数
1380
1381キュー操作ライブラリは,キューヘッダを含むリング構造のダブルリンクキュー
1382を扱うライブラリである.キューヘッダの次エントリはキューの先頭のエント
1383リ,前エントリはキューの末尾のエントリとする.また,キューの先頭のエン
1384トリの前エントリと,キューの末尾のエントリの次エントリは,キューヘッダ
1385とする.空のキューは,次エントリ,前エントリとも自分自身を指すキューヘッ
1386ダであらわす.
1387
1388キュー操作ライブラリ関数を用いる場合には,queue.hをインクルードする.
1389
1390キューヘッダとエントリのためのデータ構造として,QUEUE構造体を用いる.
1391QUEUE構造体の定義は次の通り.
1392
1393 typedef struct queue {
1394 struct queue *p_next; /* 次エントリへのポインタ */
1395 struct queue *p_prev; /* 前エントリへのポインタ */
1396 } QUEUE;
1397
1398キュー操作のために用意している関数は次の通り.
1399
1400(1) void queue_initialize(QUEUE *p_queue);
1401
1402キューを初期化する.p_queueにはキューヘッダを指定する.
1403
1404(2) void queue_insert_prev(QUEUE *p_queue, QUEUE *p_entry);
1405
1406p_queueで指定するエントリの前に,p_entryで指定するエントリを挿入する.
1407p_queueにキューヘッダを指定した場合には,キューの末尾にp_entryで指定す
1408るエントリを挿入することになる.
1409
1410(3) void queue_insert_next(QUEUE *p_queue, QUEUE *p_entry);
1411
1412p_queueで指定するエントリの次に,p_entryで指定するエントリを挿入する.
1413p_queueにキューヘッダを指定した場合には,キューの先頭にp_entryで指定す
1414るエントリを挿入することになる.
1415
1416(4) void queue_delete(QUEUE *p_entry);
1417
1418p_entryで指定するエントリを,キューから削除する.
1419
1420(5) QUEUE *queue_delete_next(QUEUE *p_queue);
1421
1422p_queueで指定するエントリの次のエントリをキューから削除し,削除したエン
1423トリを返す.p_queueにキューヘッダを指定した場合には,キューの先頭のエン
1424トリを取り出すことになる.p_queueに空のキューを指定して呼び出してはなら
1425ない.
1426
1427(6) bool_t queue_empty(QUEUE *p_queue);
1428
1429キューが空の場合にはtrue,そうでない場合にはfalseを返す.p_queueには
1430キューヘッダを指定する.
1431
14329.3 システムログ出力用ライブラリ関数
1433
1434システムログ出力用ライブラリ関数は,ログ情報をフォーマット出力するため
1435に,システムログタスクおよびシステムログ機能で用いるための関数群である.
1436
1437システムログ出力用ライブラリ関数を用いる場合には,log_output.hをインク
1438ルードし,log_output.cをコンパイル・リンクする.
1439
1440(1) void syslog_printf(const char *format, const intptr_t *p_args,
1441 void (*putc)(char))
1442
1443formatで指定されるフォーマット記述とp_argsで指定される引数列から作成し
1444たメッセージを,1文字出力関数putcを用いて出力する.
1445
1446(2) void syslog_print(const SYSLOG *p_syslog, void (*putc)(char))
1447
1448p_syslogで指定されるログ情報を文字列に直し,1文字出力関数putcを用いて出
1449力する.
1450
1451(3) void syslog_lostmsg(uint_t lost, void (*putc)(char))
1452
1453lost個のログ情報が失われた旨のメッセージを,1文字出力関数putcを用いて出
1454力する.
1455
14569.4 実行時間分布集計モジュール
1457
1458実行時間分布集計モジュールは,システムのリアルタイム性能を評価するため
1459に,プログラム区間の実行時間を計測し,その分布を集計・表示するためのラ
1460イブラリ関数群である.
1461
1462実行時間分布集計モジュールを用いる場合には,histogram.hをインクルードし,
1463histogram.cをコンパイル・リンクする.
1464
1465実行時間分布集計モジュールは,複数のプログラム区間の実行時間を計測・集
1466計・表示することができる.プログラム区間毎に,実行時間分布を記録するた
1467めのデータ構造を持つ.どのデータ構造を用いるかを,ID番号(histid)で指
1468定する.使用できるデータ構造の数は,TNUM_HISTで定義される.すなわち,
1469ID番号として,1~TNUM_HISTを指定することができる.TNUM_HISTは,デフォル
1470ト値がhistgram.cの中で定義されており,コンパイルオプションやターゲット
1471依存部(target_test.hまたはそこからインクルードされるファイル)により変
1472更することができる.
1473
1474ターゲット依存部で設定を変更していない場合,実行時間分布集計モジュール
1475は,カーネルの性能評価用システム時刻を参照する機能(get_utm)を用いて実
1476行時間を計測する.そのため,実行時間はマイクロ秒単位で記録される(精度
1477はターゲット依存).また,記録される時間には,計測のためのオーバヘッド
1478(get_utmの実行時間+α)が含まれる.
1479
1480ターゲット依存部で設定を変更している場合の仕様については,ターゲット依
1481存部のユーザーズマニュアルを参照すること.
1482
1483(1) void init_hist(ID histid, uint_t maxval, uint_t histarea[])
1484
1485histidで指定されたデータ構造を初期化する.maxvalには記録する最大時間を,
1486histareaには記録領域の先頭番地を指定する.histareaで始まる記憶領域は,
1487要素数がmaxvalに指定した値+1のuint_t型の配列として確保する.例えば,
1488maxvalに1000を指定する場合には,histareaには要素数が1001のuint_t型の配
1489列の先頭番地を渡す.
1490
1491(2) void begin_measure(ID histid)
1492
1493実行時間を計測するプログラム区間の直前に呼び出す関数.histidで指定され
1494たデータ構造に,現在のシステム時刻を記録する.
1495
1496(3) void end_measure(ID histid)
1497
1498実行時間を計測するプログラム区間の直後に呼び出す関数.現在のシステム時
1499刻と,histidで指定されたデータ構造に記録された開始時刻から,プログラム
1500区間の実行時間を求め,その結果を記録する.
1501
1502(4) void print_hist(ID histid)
1503
1504システムログ機能を用いて,実行時間分布の計測結果を出力する.
1505
1506
150710.テストプログラム
1508
1509テストプログラムは,カーネルの機能テストおよび性能評価を行うためのプロ
1510グラム群である.
1511
151210.1 テストプログラム用ライブラリ
1513
1514テストプログラム用ライブラリは,プログラム中のチェックポイントが正しい
1515順序で実行されたことなど,プログラムが正しく動作していることをチェック
1516するための関数群である.プログラムが正しく動作していないことを検出した
1517場合には,プログラムを終了させる.
1518
1519テストプログラム用ライブラリ関数を用いる場合には,test_lib.hをインクルー
1520ドし,test_lib.cをコンパイル・リンクする.
1521
1522(1) void check_point(uint_t count)
1523
1524チェックポイントを通過する際に呼び出す関数.countには,何番目のチェック
1525ポイントであるかを指定する(最初のチェックポイントでは1を指定する).
1526countの値が,最初のチェックポイントにおいては1でない場合に,それ以降の
1527チェックポイントにおいては,前のチェックポイント通過時にcountに指定した
1528値に1を加えた値でない場合に,プログラムが正しく動作していないと見なし,
1529プログラムを終了させる.
1530
1531(2) void check_finish(uint_t count)
1532
1533最後のチェックポイントに到達した際に呼び出す関数.countには,何番目の
1534チェックポイントであるかを指定する(最初のチェックポイントでは1を指定す
1535る).countの値が,前のチェックポイント通過時にcountに指定した値に1を加
1536えた値でない場合に,プログラムが正しく動作していないと見なす.この関数
1537は,プログラムが正しく動作している/いないに関わらず,プログラムを終了
1538させる.
1539
1540(3) void check_assert(bool_t exp)
1541
1542expが真であることをチェックしたい場合に呼び出す関数.expが偽である場合
1543に,プログラムが正しく動作していないと見なし,プログラムを終了させる.
1544
1545(4) void check_ercd(ER ercd, ER expected_ercd)
1546
1547ercdがexpected_ercdに一致していることをチェックしたい場合に呼び出す関数.
1548ercdがexpected_ercdに一致していない場合に,プログラムが正しく動作してい
1549ないと見なし,プログラムを終了させる.
1550
1551(5) void check_state(bool_t ctx, bool_t loc, PRI ipm,
1552 bool_t dsp, bool_t dpn, bool_t tex)
1553
1554タスクコンテキストにおいて,システム状態が期待したものになっているか
1555チェックしたい時に呼び出す関数.ctx,loc,dsp,dpn,texにはそれぞれ
1556sns_ctx(),sns_loc(),sns_dsp(),sns_dpn(),sns_tex()の返値として期待さ
1557れる値を,ipmにはget_ipm()で参照できる割込み優先度マスクとして期待され
1558る値を指定する.この内のいずれかが期待される値と一致していない場合に,
1559プログラムが正しく動作していないと見なし,プログラムを終了させる.
1560
1561(6) void check_state_i(bool_t ctx, bool_t loc,
1562 bool_t dsp, bool_t dpn, bool_t tex)
1563
1564非タスクコンテキストにおいて,システム状態が期待したものになっているか
1565チェックしたい時に呼び出す関数.ctx,loc,dsp,dpn,texにはそれぞれ
1566sns_ctx(),sns_loc(),sns_dsp(),sns_dpn(),sns_tex()の返値として期待さ
1567れる値を指定する.この内のいずれかが期待される値と一致していない場合に,
1568プログラムが正しく動作していないと見なし,プログラムを終了させる.
1569
1570(7) void set_bit_func(BIT_FUNC bit_func)
1571
1572チェックポイントにおいて呼び出す自己診断関数を設定するための関数.
1573
1574(8) void test_start(char *progname)
1575
1576テスト開始時に,テストプログラム名を出力するための関数.
1577
1578(9) void syslog_flush(void)
1579
1580システムログ機能に記録されたログ情報を,低レベル出力機能に用いる文字出
1581力関数により出力する.
1582
1583(10) void test_finish(void)
1584
1585プログラムを終了させる関数.チェックポイントを使用しない場合に,この関
1586数を用いる.
1587
158810.2 カーネルの整合性検査
1589
1590チェックポイントにおいて呼び出す自己診断に使うためのプログラムとして,
1591カーネルの整合性検査を用意している.カーネルの整合性検査は,カーネル内
1592の各データ構造の一貫性を検査する(現時点では未完成).
1593
1594カーネルの整合性検査を用いる場合には,bit_kernel.cをコンパイル・リンク
1595する.
1596
1597(1) ER bit_kernel(void)
1598
1599カーネル内の各データ構造の一貫性を検査し,一貫性が確認できた場合にE_OK,
1600できなかった場合にE_SYSエラーを返す関数.E_SYSエラーを返す際のサブエラー
1601コードとして,一貫性が確認できなかった項目を示すコードを返す.
1602
160310.3 機能テストプログラム
1604
1605testディレクトリに置かれた"test"で始まるプログラムは,カーネルの機能テ
1606ストを行うためのプログラムである.
1607
1608機能テストプログラムはテストプログラム用ライブラリを使用しているため,
1609構築する場合には,MakefileのAPPL_COBJSに,test_lib.oを追加する必要があ
1610る.コンフィギュレーションスクリプトを使用する場合には,-Uオプションで
1611test_lib.oを指定する.具体的には,次のコマンドを実行すればよい(構築用
1612のディレクトリが,ASPカーネルのソースファイルを展開したディレクトリの直
1613下にあると仮定している).
1614
1615 % perl ../configure -T <ターゲット略称> -A <機能テストプログラム名> \
1616 -a ../test -U test_lib.o
1617
1618ただし,CPU例外処理のテスト(1)~(13)は,同一のシステムコンフィギュレー
1619ションを共用しているため,test_cpuexc.cfgを次のようにコピーしておく必要
1620がある.
1621
1622 % cp ../test/test_cpuexc.cfg test_cpuexc<テスト番号>.cfg
1623
1624現バージョンで用意している機能テストプログラムは次の通り.
1625
1626(1) test_cpuexc1 CPU例外処理のテスト(1)
1627(2) test_cpuexc2 CPU例外処理のテスト(2)
1628(3) test_cpuexc3 CPU例外処理のテスト(3)
1629(4) test_cpuexc4 CPU例外処理のテスト(4)
1630(5) test_cpuexc5 CPU例外処理のテスト(5)
1631(6) test_cpuexc6 CPU例外処理のテスト(6)
1632(7) test_cpuexc7 CPU例外処理のテスト(7)
1633(8) test_cpuexc8 CPU例外処理のテスト(8)
1634(9) test_cpuexc9 CPU例外処理のテスト(9)
1635(10) test_cpuexc10 CPU例外処理のテスト(10)
1636(11) test_cpuexc11 CPU例外処理のテスト(11)
1637(12) test_cpuexc12 CPU例外処理のテスト(12)
1638(13) test_cpuexc13 CPU例外処理のテスト(13)
1639(14) test_dlynse sil_dly_nseに関するテスト
1640(15) test_sem1 セマフォ機能のテスト(1)
1641(16) test_sem2 セマフォ機能のテスト(2)
1642(17) test_sysstat1 システム状態に関するテスト(1)
1643(18) test_task1 タスク管理モジュールのテスト(1)
1644(19) test_tex1 タスク例外処理に関するテスト(1)
1645(20) test_tex2 タスク例外処理に関するテスト(2)
1646(21) test_utm1 get_utmに関するテスト(1)
1647
1648CPU例外処理のテストプログラムの一部は,CPU例外ハンドラからリターンした
1649場合に,CPU例外を発生させた命令の次から実行が継続されることを前提に作成
1650されている.この前提が成り立たない場合には,テストプログラムのターゲッ
1651ト依存定義において,CANNOT_RETURN_CPUEXCをマクロ定義することが必要であ
1652る.詳しくは,「ターゲット依存部 ポーティングガイド」を参照すること.
1653
165410.4 性能評価プログラム
1655
1656testディレクトリに置かれた"perf"で始まるプログラムは,カーネルの性能評
1657価を行うためのプログラムである.
1658
1659性能評価プログラムは,計測対象となる処理を繰り返し実行し,その実行時間
1660を計測して,実行時間分布を表示する.
1661
1662計測した実行時間には,時間計測のオーバヘッド(時間計測処理の実行にかか
1663る時間)が含まれる.計測対象の処理の正味の実行時間を求めるためには,計
1664測された時間から,時間計測のオーバヘッドを計測するためのプログラム
1665(perf0)で計測された時間を減算する必要がある.
1666
1667また,実行時間の計測は,別に記述がない限り割込みを許可したまま行うため,
1668割込みハンドラ(少なくとも,タイマ割込みハンドラ)の処理時間が含まれた
1669実行結果が計測される.
1670
1671カーネルの性能評価にあたっては,ハードウェア(特にキャッシュ)の設定に
1672留意する必要がある.
1673
1674性能評価プログラムはテストプログラム用ライブラリと実行時間分布集計モ
1675ジュールを使用しているため,構築する場合には,MakefileのAPPL_COBJSに,
1676test_lib.oとhistogram.oを追加する必要がある.コンフィギュレーションスク
1677リプトを使用する場合には,-Uオプションでtest_lib.oとhistgram.oを指定す
1678る.具体的には,次のコマンドを実行すればよい(構築用のディレクトリが,
1679ASPカーネルのソースファイルを展開したディレクトリの直下にあると仮定して
1680いる).
1681
1682 % perl ../configure -T <ターゲット略称> -A <性能評価プログラム名> \
1683 -a ../test -U "test_lib.o histogram.o"
1684
1685現バージョンで用意している性能評価プログラムは次の通り.
1686
1687(1) perf0 時間計測のオーバヘッドの評価
1688
1689時間計測のオーバヘッドを計測するためのプログラム.具体的には,空のプロ
1690グラム(begin_mearsureとend_measureを続けて呼び出すプログラム)の実行時
1691間を計測する.
1692
1693他の性能評価プログラムで計測された時間から,このプログラムで計測された
1694時間を減算した時間が,計測対象の処理の正味の実行時間である.
1695
1696(2) perf1 slp_tsk,wup_tskによるタスク切換え時間の評価
1697
1698slp_tsk,wup_tskによるタスク切換え時間を計測するためのプログラム.具体
1699的には,高い優先度のタスクが起床待ち状態である時に,低い優先度のタスク
1700がwup_tskにより高い優先度のタスクを起床し,高い優先度のタスクに切り換わ
1701るまでの時間と,高い優先度のタスクがslp_tskにより起床待ち状態となり,低
1702い優先度のタスクに切り換わるまでの時間を計測する.
1703
1704(3) perf2 snd_pdqの処理時間の評価
1705
1706優先度データキューに蓄積されているデータの数により,snd_pdqの処理時間が
1707どのように変化するかを計測するためのプログラム.具体的には,優先度デー
1708タキュー中に高い優先度のデータがn個蓄積されている時に,snd_dtqにより低
1709い優先度のデータを入れるのにかかる時間を計測する.nを0,10,20,30,40,
171050,100,200,300と変化させて計測する.
1711
1712(4) perf3 set_flgの処理時間の評価
1713
1714待ち解除するタスクの数により,set_flgの処理時間がどのように変化するかを
1715計測するためのプログラム.具体的には,TA_WMUL属性のイベントフラグに対し
1716て,n個のタスクが待っている時に,set_flgによりそのすべてを待ち解除する
1717のにかかる時間を計測する.nを0,1,2,3,4,5,10,20と変化させて計測す
1718る.
1719
1720(5) perf4 act_tsk,iact_tskの処理時間とタスク切換え時間の評価
1721
1722act_tsk,iact_tskの処理時間とタスク切換え時間を計測するためのプログラム.
1723具体的には,(1) タスク切換えを起こさないact_tskの処理時間,(2) タスク切
1724換えを起こすact_tskの処理時間(タスク切換え時間を含む),(3) タスク切換
1725えを起こすiact_tskの処理時間(タスク切換え時間とタイマ割込み中で実行さ
1726れるシステム時刻の更新処理時間を含む)の3つの時間を計測する.
1727
172811.使用上の注意とヒント
1729
173011.1 タイマドライバの組込み
1731
1732タイマドライバをシステムに組み込むために,システムコンフィギュレーショ
1733ンファイルの先頭でtarget_timer.cfgをインクルードする必要がある.
1734
173511.2 assertマクロの処理
1736
1737ASPカーネルのコード中には,assertマクロが使われている.assertマクロの定
1738義はt_stddef.hに含まれ,assertが失敗した場合の最後の処理(通常は,プロ
1739グラムを停止させる処理)は,ターゲット依存部のTOPPERS_assert_abortで決
1740定される.
1741
1742assertが失敗した場合,システム開発中はデバッガに落とすのが望ましいが,
1743システム稼働時の対処法は,システムに対する要件に依存する.そこで,ター
1744ゲット依存部のTOPPERS_assert_abortを,システム要件に合致した適切な処理
1745に置き換える必要がある.システム要件によっては,NDEBUGを定義してassert
1746マクロの処理をオブジェクトコード中から消す(「6.2 コンパイルオプション」
1747の節を参照)方法も考えられる.
1748
174911.3 システムログ機能の扱い
1750
1751TOPPERS/ASPカーネルでは,システム開発時の利便性を考慮し,システムログ機
1752能を組み込む設定をデフォルトとしている.
1753
1754それに対して,TOPPERS/ASPカーネルを用いたシステムを機器に組み込む場合は,
1755システムログ機能が意味がない場合も多い.機器への組込みに際してのシステ
1756ムログ機能の設定方法には,以下の方法が考えられる.
1757
1758(1) システムログ機能を用いない
1759
1760システムログ機能を一切使用しない場合には,システムログ機能をシステムに
1761組み込まず(システムコンフィギュレーションファイルでsyslog.cfgをインク
1762ルードしない),システムログ機能のサービスコールを呼び出すソースファイ
1763ルをTOPPERS_OMIT_SYSLOGを定義してコンパイルすればよい.
1764
1765(2) ログ情報の蓄積のみを行う
1766
1767機器に組み込んだ状態で,シリアルポート等を介してシステムを外部と接続す
1768ることができる場合には,システム稼働時にはログ情報の蓄積のみを行い,シ
1769ステムに障害が起きた時などにログ情報を取り出すことで,障害の原因分析の
1770助けとすることができる.
1771
1772具体的な設定方法として,次の2つの方法が考えられる.
1773
1774(2-1) 低レベル出力をメモリに蓄積する
1775
1776必要なログ情報を低レベル出力機能を用いて出力するように設定し,低レベル
1777の文字出力関数(target_fput_log)に送られた文字をメモリ(典型的にはリン
1778グバッファ)に蓄積するようにする.システムの障害時には,そのメモリ領域
1779を読み出す.
1780
1781(2-2) システムログ機能のログバッファに蓄積する
1782
1783必要なログ情報をシステムログ機能のログバッファに記録するように設定する.
1784システムログタスクを動作させないと,ログ情報はログバッファに蓄積されて
1785いく.システムの障害時には,ログバッファの領域を読み出すか,システムロ
1786グタスクを動作させてログ情報を出力させる.
1787
1788(3) 開発時の設定のままとする
1789
1790システムログ機能の設定を,システム開発時のまま変更せず,シリアルポート
1791等にログ情報を垂れ流す方法も考えられる.
1792
179311.4 オブジェクトIDの管理
1794
1795TOPPERS/ASPカーネルでは,オブジェクトのID番号を,コンフィギュレータが割
1796り付ける方法が基本となっている.
1797
1798アプリケーションプログラム中でオブジェクトのID番号を参照する場合には,
1799次の2つの方法が考えられる.
1800
1801(1) オブジェクト識別名を用いる
1802
1803オブジェクト生成のための静的API(CRE_YYY)の第1パラメータに記述したオブ
1804ジェクト識別名を,アプリケーションプログラム中でも用いる方法.
1805
1806コンフィギュレータは,オブジェクト識別名を,割り付けたID番号にマクロ定
1807義するC言語プリプロセッサのディレクティブ(#define)をkernel_cfg.hに生
1808成するため,アプリケーションプログラムからkernel_cfg.hをインクルードす
1809る必要がある.
1810
1811この方法は,オブジェクトコード中にID番号が直接埋め込まれるために実行効
1812率が良い一方で,コンフィギュレータが実行されてkernel_cfg.hが書き換わる
1813度に,アプリケーションプログラムの再コンパイルが必要になるという欠点が
1814ある.そのため,アプリケーションプログラムを構成するファイルの中で,一
1815部のファイルのみでオブジェクト識別名を参照する構成にするといった工夫を
1816することが望ましい.
1817
1818(2) オブジェクトのID番号を保持する変数を用いる
1819
1820オブジェクトのID番号を保持するconst属性を付加した変数を用意し,アプリケー
1821ションプログラム中では,その変数を用いる方法.
1822
1823例えば,TASK1というオブジェクト識別名のタスクに対して,次のような変数を
1824用意する.
1825
1826const ID TASK1_id = TASK1;
1827
1828アプリケーションプログラム中では,この変数(TASK1_id)を用いることで,
1829コンフィギュレータが実行されてkernel_cfg.hが書き換わる度に,上記の変数
1830定義を含んだファイルのみを再コンパイルすればよいことになる.
1831
1832この方法は,アプリケーションプログラムの再コンパイルを最小限にできる利
1833点がある一方で,変数のためのメモリ領域が必要になることに加えて,(プロ
1834セッサによっては)変数アクセスのためのオーバヘッドが生じるという欠点が
1835ある.また,定数ではなく変数であることから,他の変数の初期化には使えな
1836いという制限がある.
1837
1838なお,TOPPERS/ASPカーネルのコンフィギュレータは,--external-idオプショ
1839ンを付加することにより,上記の変数定義をkernel_cfg.c中に生成する機能を
1840持っているので,すべてのオブジェクトIDをこの方法で参照する場合には,こ
1841の機能を用いることを推奨する.
1842
1843コンフィギュレータによるID番号割付けのもう1つの課題として,コンフィギュ
1844レーションファイルの修正により,オブジェクトIDの割付けが変わってしまう
1845ことが挙げられる.これは,アプリケーションソフトウェアの設計仕様書にID
1846番号が記載されている場合や,デバッグ作業においてID番号を直接扱っている
1847場合に,作業効率を低下させる可能性が考えられる.
1848
1849この問題に対応するために,TOPPERS/ASPカーネルのコンフィギュレータに,
1850ID番号の割付け結果をファイルに書き出す機能(--id-output-fileオプション)
1851と,ID番号の割付けをファイルから取り込む機能(--id-input-fileオプション)
1852を用意している.これらの機能を用いて,コンフィギュレータを実行する度に,
1853前回に実行した時にファイルに書き出したID番号の割付けを取り込むことで,
1854前回実行時と同じ割付けを行うことができる.ただし,TOPPERS/ASPカーネルで
1855は,ID番号に抜けがあるのは許されないため,オブジェクトの数が減った場合
1856には(ID番号が大きい方のオブジェクトが減った場合を除いて)エラーとなる.
1857この場合には,ダミーのオブジェクトを生成する方法で回避するしかない.
1858
185911.5 カーネルの内部シンボルのリネーム
1860
1861ASPカーネルでは,モジュール内部の名称が他のモジュール内部の名称と衝突す
1862ることを避けるために,カーネルの内部シンボルは,C言語レベルで,先頭が
1863"_kernel_"または"_KERNEL_"である名称としている.
1864
1865これをソースコードの可読性と両立させるために,ASPカーネルでは,ソースコー
1866ドは自然な名前を用いて記述し,C言語プリプロセッサのマクロ定義(#define)
1867を用いて,それを"_kernel_"または"_KERNEL_"で始まる名前(自然な名前が
1868yyyyyの場合には,_kernel_yyyyy)にリネームする仕組みを用いている.
1869
1870具体的には,関連するディレクトリにxxx_rename.defを置き,そこからリネー
1871ムのためのヘッダファイル(xxx_rename.hおよびxxx_unrename.h)を生成する
1872ツール(utils/genrename)を用意している.
1873
1874この仕組みは,ソースコードの可読性向上に役立つ一方で,弊害もある.例え
1875ば,多くのデバッガで,ソースコード中の名称とオブジェクトコード中の名称
1876が異なるために,ソースコード中の変数名を指定して値を読んだり,関数名を
1877指定してブレークポイントを置くといったことができない.
1878
1879この状況に対応するために,ASPカーネルでは,ソースコード中の該当する名称
1880をリネームするためのユーティリティ(utils/applyrename)を用意している.
1881applyrenameユーティリティに,リネーム定義ファイル(xxx_rename.def)のプ
1882リフィックス(xxxの部分)と,リネームしたいファイルリストを与えると,リ
1883ネーム処理を行なう.例えば,kernelディレクトリのすべてのファイルに対し
1884て,カーネルの内部シンボルをリネームするには,次のコマンドを実行すれば
1885よい.
1886
1887 % cd kernel
1888 % ../utils/applyrename kernel *
1889
1890また,ターゲット依存部のディレクトリのすべてのファイルに対して,カーネ
1891ルの内部シンボルをリネームするには,次のようなコマンドを実行すればよい.
1892
1893 % cd target/dve68k_gcc/
1894 % ../../utils/applyrename target *
1895 % ../../utils/applyrename ../../kernel/kernel *
1896
189711.6 トレースログ記録のサンプルコードの使用方法
1898
1899トレースログ記録のサンプルコードがターゲット依存部に組み込まれている場
1900合には,コンフィギュレーションスクリプトにそれを使用することを指示する
1901オプション(-r)を付加することで,メモリ上にトレースログを記録する機能
1902が有効になる.
1903
1904トレースログ記録の使用方法の一例として,システム起動時にトレースログの
1905記録を開始し,システム終了時に記録したトレースログをダンプするためには,
1906システムコンフィギュレーションファイルに次のような記述を追加する.
1907
1908 #include "logtrace/trace_config.h"
1909 ATT_INI({ TA_NULL, TRACE_AUTOSTOP, trace_initialize });
1910 ATT_TER({ TA_NULL, target_fput_log, trace_dump });
1911
1912ここで,初期化ルーチン(trace_initialize)への引数は,初期化直後のトレー
1913スログの動作モードを指定するものである.指定できる動作モードについては,
1914arch/logtrace/trace_config.h中のコメントに説明がある.
1915
1916終了処理ルーチン(trace_dump)は,記録されたトレースログをターゲット依
1917存の低レベル出力機能(target_fput_log)を利用してダンプするためのもので
1918ある.トレースログを別の方法で取り出す場合には,終了処理ルーチンを登録
1919する必要はない.
1920
1921以上の方法では,trace_initializeを初期化ルーチンで,trace_dumpを終了処
1922理ルーチンで呼び出しているため,初期化ルーチンを呼び出す前や終了処理ルー
1923チンを呼び出した後には,トレースログ記録の機能を利用できない.初期化ルー
1924チンを呼び出す前や終了処理ルーチンを呼び出した後に実行される処理(例え
1925ば,カーネルオブジェクトの初期化処理や,trace_initializeよりも先に登録
1926した初期化ルーチン,trace_dumpよりも先に登録した終了処理ルーチン)でト
1927レースログ記録の機能を利用するためには,trace_initializeとtrace_dumpを
1928適切な場所で呼ぶように修正することが必要である.
1929
193011.7 システムの起動時の初期化処理
1931
1932システムの起動時にアプリケーションで必要となる初期化処理を行うための機
1933能として初期化ルーチンが用意されているが,初期化ルーチンが実行されるよ
1934りも早いタイミングで実行することが必要な初期化処理がある場合がある.
1935
1936このような場合に用いるために,標準的なスタートアップモジュールから,ター
1937ゲットシステム依存の初期化フック(hardware_init_hook)を呼び出すことと
1938している.hardware_init_hookは,カーネルのターゲット依存部で用意されて
1939いるのが標準であるが,これをアプリケーションで用意したものに置き換え,
1940その中でアプリケーションで必要となる初期化処理を行うことができる.
1941
1942ただし,hardware_init_hookの作成する場合には,bssセクションとdataセクショ
1943ンが初期化されていないことや,ライブラリが初期化されていないこと,C言語
1944で記述できるとは限らないことなどに注意が必要である.作成にあたっては,
1945「ターゲット依存部 ポーティングガイド」を参照すること.
1946
1947カーネルのスタートアップモジュールがhardware_init_hookを呼び出すように
1948実装されていない場合には,スタートアップモジュールをアプリケーションで
1949用意したものに置き換える方法を推奨する.
1950
195111.8 rodataセクションをRAMに置く場合
1952
1953何らかの理由でrodataセクションをRAMに置く場合,dataセクションと同様に,
1954その初期値はROMに置き,スタートアップモジュールでRAMにコピーするのが素
1955直である.これを実現するには,dataセクションの取扱いを参考に,リンカス
1956クリプトとスタートアップモジュールを修正する必要があるが,それに加えて,
1957以下の措置が必要である.
1958
1959コンフィギュレータは,パス1とパス3において,ロードモジュールのシンボル
1960ファイルを用いて,ロードモジュール内のrodataセクションを読み込むことで,
1961各種の定数値を取得する.そのため,rodataセクションをdataセクションと同
1962様に扱うと,そのアクセスアドレス(RAM内のアドレス,VMAと呼ぶ)と配置ア
1963ドレス(ROM内のアドレス,LMAと呼ぶ)が一致しなくなるために,定数値を取
1964得することができず,エラーとなる.
1965
1966パス1でのエラーを回避するためには,パス1のリンク時(cfg1_outをリンクす
1967る時)には,rodataセクションのアクセスアドレスと配置アドレスを一致させ
1968るリンカスクリプト(標準のリンカスクリプトはこのようになっている)を用
1969いる.サンプルのMakefileでは,LDSCRIPTによりリンカスクリプトを指定する
1970のではなく,LDFLAGSとCFG1_OUT_LDFLAGSに異なるリンカスクリプトを用いるオ
1971プションを設定すればよい.
1972
1973パス3でのエラーを回避するためには,コンフィギュレータのパス3のテンプレー
1974トファイルにおいて,rodataセクションの内容を,配置アドレスからアクセス
1975アドレスにコピーする.そのためには,パス3のテンプレートファイルのターゲッ
1976ト依存部で,LMA.ORDER_LIST等のテンプレートファイル変数を設定すればよい.
1977具体的な方法は,「ターゲット依存部 ポーティングガイド」を参照すること.
1978
1979
198012.参考情報
1981
198212.1 利用条件と利用報告
1983
1984ASPカーネルの利用条件は,各ファイルの先頭に表示されている.著作権は,各
1985ファイルの先頭に表示されている著作権者が保有している.
1986
1987利用条件の(3)の(b)において,利用の形態をTOPPERSプロジェクトに報告する方
1988法としては,ASPカーネルを利用した製品の名称と応用分野,製品化した会社名
1989と業種等の情報を,以下のURLのページから報告するものとする.
1990
1991 http://www.toppers.jp/report.html
1992
1993またその際に,ASPカーネルを使用してのコメントやご意見もいただけると幸い
1994である.
1995
199612.2 保証・適用性・サポート
1997
1998ASPカーネルは無保証で提供されているものである.開発者およびTOPPERSプロ
1999ジェクトは,ASPカーネルに関して,特定の使用目的に対する適合性も含めて,
2000いかなる保証も行わない.また,ASPカーネルの利用により直接的または間接的
2001に生じたいかなる損害に関しても,その責任を負わない.
2002
2003開発者およびTOPPERSプロジェクトは,ASPカーネルに関するサポートの約束は
2004していない.ASPカーネルに関して質問がある場合は,後述のTOPPERSユーザー
2005ズメーリングリストを利用していただけると幸いである.確実なサポートが必
2006要な場合には,有償でサポートサービスを提供している会社に相談されたい.
2007
200812.3 バグレポート
2009
2010ASPカーネルにバグや問題点を発見された場合には,後述のTOPPERSユーザーズ
2011メーリングリストに報告して欲しい.
2012
2013メーリングリストにバグや問題点などを報告する場合には,必要に応じて次の
2014情報を知らせて欲しい.
2015
2016 使用しているカーネルに関する情報
2017 ・ターゲット非依存部のバージョン
2018 ・使用しているターゲット依存部とそのバージョン
2019 ・TOPPERSプロジェクトからのリリースに対する改造箇所(あれば)
2020
2021 ターゲットシステムに関する情報
2022 ・ターゲットプロセッサの種類
2023 ・ターゲットボード等の種類
2024
2025 ホストに関する情報
2026 ・OSのバージョン(サービスパックの適用状況も)
2027 ・コンパイラなどの開発環境のバージョン(Cygwinのバージョンも)
2028
202912.4 ウェブサイト
2030
2031TOPPERSプロジェクトのウェブサイトは,以下のURLにある.
2032
2033 http://www.toppers.jp/
2034
2035TOPPERSプロジェクトやASPカーネルに関する最新情報は,このウェブサイトか
2036ら得ることができる.また,ASPカーネルの最新版は,このウェブサイトからダ
2037ウンロードすることができる.
2038
203912.5 TOPPERSユーザーズメーリングリスト
2040
2041ASPカーネルを含むTOPPERSプロジェクトの開発成果物のユーザに対する情報提
2042供およびユーザ相互間の情報交換を容易にするために,TOPPERSユーザーズメー
2043リングリスト(users@toppers.jp)を用意している.
2044
2045このメーリングリストには,誰でも自由に登録し,メールを送付することがで
2046きる(登録者以外はメールを送付できない).また,送付されたメールは,誰
2047でも自由にウェブサイトで読むことができる.
2048
2049メーリングリストへの登録方法については,以下のURLのページに説明がある.
2050
2051 http://www.toppers.jp/community.html
2052
205312.6 TOPPERSプロジェクトのメンバ向けのサービス
2054
2055TOPPERSプロジェクトのメンバに対しては,上記に加えて,ASPカーネルに関連
2056して次のサービスを用意している.
2057
2058(1) TOPPERS開発者メーリングリスト
2059
2060TOPPERSプロジェクトのメンバは,ASPカーネルに関する質問,バグや問題点な
2061どの報告に,TOPPERS開発者メーリングリスト(dev@toppers.jp)を利用するこ
2062とができる.
2063
2064(2) ASPカーネルの開発支援サイト
2065
2066ASPカーネルの開発支援のためのTRAC(バグトラッキングシステム)が,以下の
2067URLにある(TRACへのアクセスには,会員パスワードが必要である).
2068
2069 http://dev.toppers.jp/trac/asp/
2070
2071TOPPERSプロジェクトのメンバは,このサイトから,ウェブインタフェースおよ
2072びsubversionサーバにより,ASPカーネルの開発中のバージョンを得ることがで
2073きる.また,バグトラッキングデータベースにアクセスすることができ,過去
2074のバグ履歴へのアクセスや,バグの登録をすることができる.
2075
207612.7 TOPPERSプロジェクトへの参加
2077
2078TOPPERSプロジェクトでは,何からの形でプロジェクトに貢献していただける方,
2079プロジェクトで開発したソフトウェアをお使いの方,プロジェクトに興味をお
2080持ちの方の参加を求めている.TOPPERSプロジェクトへの参加方法については,
2081以下のページに説明がある.
2082
2083 http://www.toppers.jp/joinus.html
2084
2085
208613.リファレンス
2087
208813.1 サービスコール一覧
2089
2090(1) タスク管理機能
2091
2092 ER ercd = act_tsk(ID tskid)
2093 ER ercd = iact_tsk(ID tskid)
2094 ER_UINT actcnt = can_act(ID tskid)
2095 ER ercd = ext_tsk(void)
2096 ER ercd = ter_tsk(ID tskid)
2097 ER ercd = chg_pri(ID tskid, PRI tskpri)
2098 ER ercd = get_pri(ID tskid, PRI *p_tskpri)
2099 ER ercd = get_inf(intptr_t *p_exinf)
2100 ER ercd = ref_tsk(ID tskid, T_RTSK *pk_rtsk)
2101
2102(2) タスク付属同期機能
2103
2104 ER ercd = slp_tsk(void)
2105 ER ercd = tslp_tsk(TMO tmout)
2106 ER ercd = wup_tsk(ID tskid)
2107 ER ercd = iwup_tsk(ID tskid)
2108 ER_UINT wupcnt = can_wup(ID tskid)
2109 ER ercd = rel_wai(ID tskid)
2110 ER ercd = irel_wai(ID tskid)
2111 ER ercd = sus_tsk(ID tskid)
2112 ER ercd = rsm_tsk(ID tskid)
2113 ER ercd = dly_tsk(RELTIM dlytim)
2114
2115(3) タスク例外処理機能
2116
2117 ER ercd = ras_tex(ID tskid, TEXPTN rasptn)
2118 ER ercd = iras_tex(ID tskid, TEXPTN rasptn)
2119 ER ercd = dis_tex(void)
2120 ER ercd = ena_tex(void)
2121 bool_t state = sns_tex(void)
2122 ER ercd = ref_tex(ID tskid, T_RTEX *pk_rtex)
2123
2124(4) 同期・通信機能
2125
2126 ER ercd = sig_sem(ID semid)
2127 ER ercd = isig_sem(ID semid)
2128 ER ercd = wai_sem(ID semid)
2129 ER ercd = pol_sem(ID semid)
2130 ER ercd = twai_sem(ID semid, TMO tmout)
2131 ER ercd = ini_sem(ID semid)
2132 ER ercd = ref_sem(ID semid, T_RSEM *pk_rsem)
2133
2134 ER ercd = set_flg(ID flgid, FLGPTN setptn)
2135 ER ercd = iset_flg(ID flgid, FLGPTN setptn)
2136 ER ercd = clr_flg(ID flgid, FLGPTN clrptn)
2137 ER ercd = wai_flg(ID flgid, FLGPTN waiptn,
2138 MODE wfmode, FLGPTN *p_flgptn)
2139 ER ercd = pol_flg(ID flgid, FLGPTN waiptn,
2140 MODE wfmode, FLGPTN *p_flgptn)
2141 ER ercd = twai_flg(ID flgid, FLGPTN waiptn,
2142 MODE wfmode, FLGPTN *p_flgptn, TMO tmout)
2143 ER ercd = ini_flg(ID flgid)
2144 ER ercd = ref_flg(ID flgid, T_RFLG *pk_rflg)
2145
2146 ER ercd = snd_dtq(ID dtqid, intptr_t data)
2147 ER ercd = psnd_dtq(ID dtqid, intptr_t data)
2148 ER ercd = ipsnd_dtq(ID dtqid, intptr_t data)
2149 ER ercd = tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
2150 ER ercd = fsnd_dtq(ID dtqid, intptr_t data)
2151 ER ercd = ifsnd_dtq(ID dtqid, intptr_t data)
2152 ER ercd = rcv_dtq(ID dtqid, intptr_t *p_data)
2153 ER ercd = prcv_dtq(ID dtqid, intptr_t *p_data)
2154 ER ercd = trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
2155 ER ercd = ini_dtq(ID dtqid)
2156 ER ercd = ref_dtq(ID dtqid, T_RDTQ *pk_rdtq)
2157
2158 ER ercd = snd_pdq(ID pdqid, intptr_t data, PRI datapri)
2159 ER ercd = psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
2160 ER ercd = ipsnd_pdq(ID pdqid, intptr_t data, PRI datapri)
2161 ER ercd = tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
2162 ER ercd = rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
2163 ER ercd = prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
2164 ER ercd = trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
2165 ER ercd = ini_pdq(ID pdqid)
2166 ER ercd = ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
2167
2168 ER ercd = snd_mbx(ID mbxid, T_MSG *pk_msg)
2169 ER ercd = rcv_mbx(ID mbxid, T_MSG **ppk_msg)
2170 ER ercd = prcv_mbx(ID mbxid, T_MSG **ppk_msg)
2171 ER ercd = trcv_mbx(ID mbxid, T_MSG **ppk_msg, TMO tmout)
2172 ER ercd = ini_mbx(ID mbxid)
2173 ER ercd = ref_mbx(ID mbxid, T_RMBX *pk_rmbx)
2174
2175(5) メモリプール管理機能
2176
2177 ER ercd = get_mpf(ID mpfid, void **p_blk)
2178 ER ercd = pget_mpf(ID mpfid, void **p_blk)
2179 ER ercd = tget_mpf(ID mpfid, void **p_blk, TMO tmout)
2180 ER ercd = rel_mpf(ID mpfid, void *blk)
2181 ER ercd = ini_mpf(ID mpfid)
2182 ER ercd = ref_mpf(ID mpfid, T_RMPF *pk_rmpf)
2183
2184(6) 時間管理機能
2185
2186 ER ercd = get_tim(SYSTIM *p_systim)
2187 ER ercd = get_utm(SYSUTM *p_sysutm)
2188
2189 ER ercd = sta_cyc(ID cycid)
2190 ER ercd = stp_cyc(ID cycid)
2191 ER ercd = ref_cyc(ID cycid, T_RCYC *pk_rcyc)
2192
2193 ER ercd = sta_alm(ID almid, RELTIM almtim)
2194 ER ercd = ista_alm(ID almid, RELTIM almtim)
2195 ER ercd = stp_alm(ID almid)
2196 ER ercd = istp_alm(ID almid)
2197 ER ercd = ref_alm(ID almid, T_RALM *pk_ralm)
2198
2199(7) システム状態管理機能
2200
2201 ER ercd = rot_rdq(PRI tskpri)
2202 ER ercd = irot_rdq(PRI tskpri)
2203 ER ercd = get_tid(ID *p_tskid)
2204 ER ercd = iget_tid(ID *p_tskid)
2205 ER ercd = loc_cpu(void)
2206 ER ercd = iloc_cpu(void)
2207 ER ercd = unl_cpu(void)
2208 ER ercd = iunl_cpu(void)
2209 ER ercd = dis_dsp(void)
2210 ER ercd = ena_dsp(void)
2211 bool_t state = sns_ctx(void)
2212 bool_t state = sns_loc(void)
2213 bool_t state = sns_dsp(void)
2214 bool_t state = sns_dpn(void)
2215 bool_t state = sns_ker(void)
2216 ER ercd = ext_ker(void)
2217
2218(8) 割込み管理機能
2219
2220 ER ercd = dis_int(INTNO intno)
2221 ER ercd = ena_int(INTNO intno)
2222 ER ercd = chg_ipm(PRI intpri)
2223 ER ercd = get_ipm(PRI *p_intpri)
2224
2225(9) CPU例外管理機能
2226
2227 bool_t stat = xsns_dpn(void *p_excinf)
2228 bool_t stat = xsns_xpn(void *p_excinf)
2229
223013.2 静的API一覧
2231
2232(1) タスク管理機能
2233
2234 CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
2235 PRI itskpri, SIZE stksz, STK_T *stk })
2236
2237(3) タスク例外処理機能
2238
2239 DEF_TEX(ID tskid, { ATR texatr, TEXRTN texrtn })
2240
2241(4) 同期・通信機能
2242
2243 CRE_SEM(ID semid, { ATR sematr, uint_t isemcnt, uint_t maxsem })
2244 CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })
2245 CRE_DTQ(ID dtqid, { ATR dtqatr, uint_t dtqcnt, void *dtqmb })
2246 CRE_PDQ(ID pdqid, { ATR pdqatr, uint_t pdqcnt, PRI maxdpri, void *pdqmb })
2247 CRE_MBX(ID mbxid, { ATR mbxatr, PRI maxmpri, void *mprihd })
2248
2249(5) メモリプール管理機能
2250
2251 CRE_MPF(ID mpfid, { ATR mpfatr, uint_t blkcnt, uint_t blksz,
2252 MPF_T *mpf, void *mpfmb })
2253
2254(6) 時間管理機能
2255
2256 CRE_CYC(ID cycid, { ATR cycatr, intptr_t exinf, CYCHDR cychdr,
2257 RELTIM cyctim, RELTIM cycphs })
2258 CRE_ALM(ID almid, { ATR almatr, intptr_t exinf, ALMHDR almhdr })
2259
2260(8) 割込み管理機能
2261
2262 CFG_INT(INTNO intno, { ATR intatr, PRI intpri })
2263 ATT_ISR({ ATR isratr, intptr_t exinf, INTNO intno, ISR isr, PRI isrpri })
2264 DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })
2265
2266(9) CPU例外管理機能
2267
2268 DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })
2269
2270(10) システム構成管理機能
2271
2272 DEF_ICS({ SIZE istksz, STK_T *istk })
2273 ATT_INI({ ATR iniatr, intptr_t exinf, INIRTN inirtn })
2274 ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn })
2275
227613.3 バージョン履歴
2277
2278 2006年10月29日 Release 1.A.0 最初のリリース
2279 2007年2月20日 Release 1.A.1
2280 2007年2月20日 Release 1.A.2
2281 2007年7月12日 Release 1.B.0 コンフィギュレータを新バージョンに
2282 2007年7月12日 Release 1.B.1 ライセンス条件の入れ換え
2283 2007年7月16日 Release 1.B.2
2284 2007年7月21日 Release 1.B.3 ディレクトリ構成の変更
2285 2007年8月20日 Release 1.B.4 拡張パッケージの追加
2286 2007年10月16日 Release 1.B.5
2287 2007年11月15日 Release 1.0.0 正式版のリリース
2288 2007年12月23日 Release 1.1.0
2289 2008年3月19日 Release 1.2.0
2290 2008年3月21日 Release 1.2.1
2291 2008年4月12日 Release 1.3.0 一般公開に向けての最終修正
2292 2008年5月13日 Release 1.3.1 最初の一般公開版
2293 2008年8月21日 Release 1.3.2
2294 2009年5月11日 Release 1.4.0
2295 2010年6月28日 Release 1.5.0 拡張パッケージを一般公開
2296 2010年8月1日 Release 1.6.0 cfg-1.6に対応
2297 2011年5月8日 Release 1.7.0 動的生成機能拡張パッケージ等の追加
2298 2012年12月26日 Release 1.8.0
2299 2014年1月6日 Release 1.9.0 メッセージバッファ機能拡張の追加
2300 2014年11月17日 Release 1.9.1
2301 2015年5月30日 Release 1.9.2
2302 2017年4月29日 Release 1.9.3
2303
2304以上
Note: See TracBrowser for help on using the repository browser.