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

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

3.1.0を反映

File size: 140.9 KB
Line 
1
2 TOPPERS/ASP3カーネル
3 ユーザーズマニュアル
4
5 対応バージョン: Release 3.1
6 最終更新: 2016年5月13日
7
8このドキュメントは,TOPPERS/ASP3カーネルを使用するために必
9要な事項
10を説
11明するものである.
12
13このドキュメントでは,TOPPERS組込みコンポーネントシステム(TECS)をシス
14テムサービスの構築にのみ用い,アプリケーションプログラムはC言語により記
15述することを想定している.アプリケーションプログラムを含むシステムå…
16¨ä½“
17をTECSを用いて構築する方法については,以下のURLにあるTECSリファレンスマ
18ニュアルを参考にすること.
19
20 http://dev.toppers.jp/trac_user/tecs/wiki/WikiStart
21
22----------------------------------------------------------------------
23 TOPPERS/ASP Kernel
24 Toyohashi Open Platform for Embedded Real-Time Systems/
25 Advanced Standard Profile Kernel
26
27 Copyright (C) 2005-2016 by Embedded and Real-Time Systems Laboratory
28 Graduate School of Information Science, Nagoya Univ., JAPAN
29
30 上記著作権者
31は,以下の(1)〜(4)の条件を満たす場合に限り,本ソフトウェ
32 ア(本ソフトウェアを改変したものを含む.以下同じ)を使用・複製・改
33 変・再é…
34å¸ƒï¼ˆä»¥ä¸‹ï¼Œåˆ©ç”¨ã¨å‘¼ã¶ï¼‰ã™ã‚‹ã“とを無償で許諾する.
35 (1) 本ソフトウェアをソースコードの形で利用する場合には,上記の著作
36 権表示,この利用条件および下記の無保証規定が,そのままの形でソー
37 スコード中に含まれていること.
38 (2) 本ソフトウェアを,ライブラリ形式など,他のソフトウェア開発に使
39 用できる形で再é…
40å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œå†é…
41å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨
42 者
43マニュアルなど)に,上記の著作権表示,この利用条件および下記
44 の無保証規定を掲載すること.
45 (3) 本ソフトウェアを,機器に組み込むなど,他のソフトウェア開発に使
46 用できない形で再é…
47å¸ƒã™ã‚‹å ´åˆã«ã¯ï¼Œæ¬¡ã®ã„ずれかの条件を満たすこ
48 と.
49 (a) 再é…
50å¸ƒã«ä¼´ã†ãƒ‰ã‚­ãƒ¥ãƒ¡ãƒ³ãƒˆï¼ˆåˆ©ç”¨è€…
51マニュアルなど)に,上記の著
52 作権表示,この利用条件および下記の無保証規定を掲載すること.
53 (b) 再é…
54å¸ƒã®å½¢æ…
55‹ã‚’,別に定める方法によって,TOPPERSプロジェクトに
56 報告すること.
57 (4) 本ソフトウェアの利用により直接的または間接的に生じるいかなる損
58 害からも,上記著作権者
59およびTOPPERSプロジェクトをå…
60è²¬ã™ã‚‹ã“と.
61 また,本ソフトウェアのユーザまたはエンドユーザからのいかなる理
62 由に基づく請求からも,上記著作権者
63およびTOPPERSプロジェクトを
64 å…
65è²¬ã™ã‚‹ã“と.
66
67 本ソフトウェアは,無保証で提供されているものである.上記著作権者
68お
69 よびTOPPERSプロジェクトは,本ソフトウェアに関して,特定の使用目的
70 に対する適合性も含めて,いかなる保証も行わない.また,本ソフトウェ
71 アの利用により直接的または間接的に生じたいかなる損害に関しても,そ
72 の責任を負わない.
73
74 $Id: user.txt 752 2016-05-14 15:06:22Z ertl-hiro $
75----------------------------------------------------------------------
76
77○目次
78
791.TOPPERS/ASP3カーネルの概要
80 1.1 TOPPERS/ASP3カーネルの位置付け
81 1.2 TOPPERS/ASP3カーネルの仕様
82 1.3 マイグレーションガイド
83 1.4 機能拡張・チューニングガイド
84 1.5 既知の問題
85 1.6 Cygwin環境における注意事項
86
872.ターゲット依存部
88 2.1 ターゲット依存部の概要
89 2.2 簡易パッケージ
90 2.3 個別パッケージ
913.クイックスタートガイド
92 3.1 開発環境の準備
93 3.2 TECSジェネレータの準備
94 3.3 サンプルプログラムの構築と実行
95 3.4 カーネルを関数単位でライブラリ化する方法
96 3.5 アプリケーションとカーネルを別々
97に構築する方法
984.ディレクトリ構成・ファイル構成
99 4.1 é…
100å¸ƒãƒ‘ッケージのディレクトリ構成
101 4.2 ターゲット非依存部のファイル構成
1025.コンフィギュレーションスクリプトの使い方
1036.標準のMakefileの修正方法
104 6.1 Makefileの変数定義
105 6.2 コンパイルオプション
1067.コンフィギュレータの使い方
107 7.1 コンフィギュレータの起動
108 7.2 タイマドライバの組込み
1098.システムサービス
110 8.1 システムログ機能
111 8.1.1 システムログ機能の位置付け
112 8.1.2 ログバッファへの記録と低レベル出力
113 8.1.3 ログ情
114報の種別
115 8.1.4 ログ情
116報の重要度
117 8.1.5 ログ情
118報のデータ構造
119 8.1.6 システムログ機能のサービスコール
120 8.1.7 システムログ機能のためのライブラリ関数とマクロ
121 8.1.8 システムログ機能の組込みと取外し
122 8.2 シリアルインタフェースドライバ
123 8.2.1 シリアルインタフェースドライバのサービスコール
124 8.2.2 シリアルインタフェースドライバのその他のサービス
125 8.2.3 シリアルインタフェースドライバの組込みと取外し
126 8.3 システムログタスク
127 8.3.1 システムログタスクの機能
128 8.3.2 システムログタスクのその他のサービス
129 8.3.3 システムログタスクの組込みと取外し
130 8.4 実行時間分布集計サービス
131 8.4.1 実行時間分布集計サービスの概要
132 8.4.2 実行時間分布集計サービスのサービスコール
133 8.4.3 実行時間分布集計サービスの組込みと取外し
134 8.5 カーネル起動メッセージ出力
1359.サポートライブラリ
136 9.1 基本的なライブラリ関数
137 9.2 キュー操作ライブラリ関数
138 9.3 システムログ出力用ライブラリ関数
13910.テストプログラム
140 10.1 テストプログラム用サービス
141 10.1.1 テストプログラム用サービスのサービスコール
142 10.1.2 テストプログラム用サービスの組込みと取外し
143 10.2 カーネルの整合性検査
144 10.3 機能テストプログラム
145 10.4 システム時刻管理機能テストプログラム
146 10.5 性能評価プログラム
14711.使用上の注意とヒント
148 11.1 実行時間と割込み禁止時間に関する注意事項
149
150 11.2 assertマクロの処理
151 11.3 システムログ機能の扱い
152 11.4 オブジェクトIDの管理
153 11.5 カーネルの内
154部シンボルのリネーム
155 11.6 トレースログ記録のサンプルコードの使用方法
156 11.7 システムの起動時の初期化処理
157 11.8 rodataセクションをRAMに置く場合
15812.参考情
159å ±
160 12.1 利用条件と利用報告
161 12.2 保証・適用性・サポート
162 12.3 バグレポート
163 12.4 ウェブサイト
164 12.5 TOPPERSユーザーズメーリングリスト
165 12.6 TOPPERSプロジェクトのメンバ向けのサービス
166 12.7 TOPPERSプロジェクトへの参加
16713.リファレンス
168 13.1 サービスコール一覧
169 13.2 静的API一覧
170 13.3 バージョン履歴
171
172
1731.TOPPERS/ASP3カーネルの概要
174
1751.1 TOPPERS/ASP3カーネルの位置付け
176
177TOPPERS/ASP3カーネル(以下,ASP3カーネル)は,TOPPERS/ASPカーネルを拡張・
178改良したもので,TOPPERS第3世代カーネル(ITRON系)の基盤となるものとして
179開発したリアルタイムカーネルである.
180
181TOPPERS/ASPカーネルは,μITRON4.0仕様のスタンダードプロファイル準拠のリ
182アルタイムカーネルであるTOPPERS/JSPカーネルを拡張・改良する形で開発した
183ものである.
184
1851.2 TOPPERS/ASP3カーネルの仕様
186
187ASP3カーネルの仕様の概要については,「TOPPERS/ASP3カーネルの仕様概要」
188を参ç…
189§ã™ã‚‹ã“と.また,ASP3カーネルを含むTOPPERS第3世代カーネル(ITRON系)
190の仕様の詳細については,別途PDFファイルの形でé…
191å¸ƒã—ている「TOPPERS第3世
192代カーネル(ITRON系)統合仕様書(Release 3.1.0)」を参ç…
193§ã™ã‚‹ã“と.
194
195カーネル仕様の中で,ターゲット定義事項
196については,ターゲット依存部ディ
197レクトリにあるターゲット依存部のユーザーズマニュアルを参ç…
198§ã™ã‚‹ã“と.
199
2001.3 マイグレーションガイド
201
202従来のTOPPERSカーネルや他のμITRON4.0仕様準拠のカーネルから,ASP3カーネ
203ルに移行するための方法(またはヒント)を説明した「TOPPERS/ASP3カーネル
204へのマイグレーションガイド」を用意している.必
205要に応じて参ç…
206§ã™ã‚‹ã“と.
207
2081.4 機能拡張・チューニングガイド
209
210ASP3カーネルを,機能拡張・チューニングするための方法(またはヒント)を
211説明した「機能拡張・チューニングガイド」を用意している.拡張パッケージ
212の使用方法は,「機能拡張・チューニングガイド」に含まれている.必
213要に応
214じて参ç…
215§ã™ã‚‹ã“と.
216
2171.5 既知の問題
218
219割込みサービスルーチンのå…
220ˆé ­ç•ªåœ°ï¼ˆCRE_ISRのisr),割込みハンドラのå…
221ˆé ­
222番地(DEF_INHのinthdr),CPU例外ハンドラのå…
223ˆé ­ç•ªåœ°ï¼ˆDEF_EXCのexchdr),
224初期化ルーチンのå…
225ˆé ­ç•ªåœ°ï¼ˆATT_INIのinirtn),終了処理ルーチンのå…
226ˆé ­ç•ªåœ°
227(ATT_TERのterrtn)がプログラムの開始番地として正しくない場合のエラーは,
228コンフィギュレータによって検出されない場合がある(ターゲットにも依存).
229
230kernel_cfg.c(およびcfg1_out.c)は,カーネル,システムサービス,アプリ
231ケーションのいずれのインクルードファイルもインクルードし,いずれのシン
232ボルも参ç…
233§ã™ã‚‹å¯èƒ½æ€§ãŒã‚る.そのため,カーネル,システムサービス,アプ
234リケーションでシンボル等が衝突している場合や,コンパイルオプションが食
235い違っている場合に,kernel_cfg.c(およびcfg1_out.c)が正しくコンパイル
236できなくなる場合が考えられる.カーネルのシンボルをリネームするなどの方
237法で軽減されてはいるが,問題がなくなっているわけではない.
238
239システムコンフィギュレーションファイルから,コンフィギュレータに対する
240INCLUDEディレクティブにより他のコンフィギュレーションファイルをインクルー
241ドしている場合に,その中に含まれるC言語プリプロセッサのインクルードディ
242レクティブ(#include)で,コンフィギュレーションファイルの置かれている
243ディレクトリが,ファイルを検索するパスにå…
244¥ã‚‰ãªã„という問題がある.
245
246現時点では,アドレスが64ビットの環境には対応していない.64ビットアドレ
247ス環境をサポートするための最大の課題は,モトローラSレコードフォーマット
248が64ビットアドレスに対応していないことである.
249
2501.6 Cygwin環境における注意事項
251
252
253Cygwin環境においては,ディレクトリの指定を相対パスで行うことを推奨する.
254これは,Cygwin環境の絶対パスは,Windowsネイティブでビルドされたツールは
255解釈できないためである.
256
257
2582.ターゲット依存部
259
2602.1 ターゲット依存部の概要
261
262ASP3カーネルのターゲット非依存部と,各種のターゲットシステムに対応する
263ためのターゲット依存部は,別々
264に開発されている.そのため,ASP3カーネル
265が対応しているすべてのターゲット依存部を,バージョンを整合させてパッケー
266ジ化することは困難である.そこで,主に初級のユーザを対象にした簡易パッ
267ケージと,上級のユーザやカーネル開発者
268を対象にした個別パッケージを用意
269している.
270
271ASP3カーネルを未サポートのターゲットシステムへポーティングするために必
272
273要な作業は,開発環境の構築と標準の開発環境との差異の吸収,カーネル自身
274のポーティング,システムサービスのポーティングなどからなる.詳しくは,
275「ターゲット依存部 ポーティングガイド」を参ç…
276§ã™ã‚‹ã“と.
277
2782.2 簡易パッケージ
279
280簡易パッケージは,ASP3カーネルが対応しているターゲットシステム毎に用意
281され,そのターゲットシステム上でASP3カーネルを動作させるために必
282要なファ
283イル一式をパッケージ化したものである.簡易パッケージに含まれるファイル
284は,バージョンが整合していることが確認されている.
285
286簡易パッケージのバージョン番号は,パッケージ化した日付とすることを原則
287とするが,ターゲットシステム毎の事情
288によりこの原則に従わない場合がある.
289
290簡易パッケージは,基本的には,次に説明する個別パッケージを複数まとめた
291ものである.そのため,対象ターゲットシステムに必
292要のないファイルも含ま
293れている.また,簡易パッケージに含まれている個別パッケージのバージョン
294は,個別パッケージのMANIFESTファイルを参ç…
295§ã™ã‚‹ã“とで知ることができる.
296
2972.3 個別パッケージ
298
299個別パッケージは,ASP3カーネルの開発単位毎に,その開発単位で開発を担
300当
301しているファイル一式をパッケージ化したものである.ASP3カーネルのターゲッ
302ト非依存部も,一つの個別パッケージとしてé…
303å¸ƒã•ã‚Œã‚‹ï¼Žã‚る個別パッケージ
304を使用するためには,一般には,他の個別パッケージが必
305要となる.ターゲッ
306ト依存部の個別パッケージを使用するために必
307要となる個別パッケージとその
308バージョンについては,ターゲット依存部のユーザーズマニュアルを参ç…
309§ã™ã‚‹
310こと.使用する個別パッケージのバージョンを整合させることは,ユーザの責
311任である.
312
313個別パッケージのバージョン番号は,X.Y.Zの形で表現される.ターゲット非依
314存部のバージョン番号を,ASP3カーネルå…
315¨ä½“のリリース番号とする.ターゲッ
316ト依存部のバージョン番号は,XとYが,それが依存するターゲット非依存部と
317一致している.それに対して,Zは一致しているとは限らない.例えば,ターゲッ
318ト非依存部のバージョン3.1.0に対応するターゲット依存部は,バージョン
3193.1.Zの形となる.ターゲット依存部のみがバージョンアップした場合には,Z
320が変更される.
321
322使用する個別パッケージは,次の例のように,ターゲット非依存部の個別パッ
323ケージを展開したのと同じディレクトリで展開する.
324
325 % tar xvfz asp3-3.1.0.tar.gz
326 % tar xvfz asp3_arch_arm_gcc_3.1.2.tar.gz
327
328ターゲット非依存部の個別パッケージには,以下のターゲット依存部が含まれ
329ているが,これは,ASP3カーネルを新しいターゲットシステムにポーティング
330する際の出発点とするために用意したものである.
331
332 target/dummy_gcc ダミー(GNU開発環境)のターゲット依存部
333
334まずはこれをターゲットシステム向けの開発環境でビルドし,その後,各ファ
335イルの内
336容をターゲットシステム向けに修正していくことを想定している.
337
338
3393.クイックスタートガイド
340
341ここでは,ターゲット依存部が用意されているターゲットシステム上で,ASP3
342カーネル上で動作するサンプルプログラムを構築・動作させるまでの手順を示
343す.
344
3453.1 開発環境の準備
346
347ASP3カーネルを用いたシステム構築には,以下のツールが必
348要である.
349
350 ホストシステム用のツール
351 GNU Make 動作確認:3.81
352 ruby 動作確認:2.0.0
353
354 TOPPERS第3世代カーネル向け Ruby版コンフィギュレータ
355 cfg 動作確認:1.2.1
356
357 TOPPERS組込みコンポーネントシステム(TECS)ジェネレータ
358 tecsgen 動作確認:1.3.1.7
359
360 ターゲットシステム用のツール(クロス開発環境)
361 標準規格に準拠したCコンパイラ
362 アセンブラ,リンカ,ライブラリアン
363 シンボルファイル出力ツール,ヘキサファイル出力ツール
364 標準Cライブラリ(必
365須ではない)
366
367ASP3カーネルでは,文字コードをUTF-8に統一しているが,Windows環境でruby
368を用いると,デフォルトの文字コードがWindows-31Jになり,エラーとなる場合
369がある.このような環境では,rubyの起動時オプションに「-Eutf-8」を指定す
370る必
371要がある.よりå…
372·ä½“的には,「set RUBYOPT=-Eutf-8」により,rubyのデフォ
373ルトのオプションを指定する方法を推奨する.
374
375ターゲットシステム用のツールにGNU開発環境を用いる場合には,以下のツール
376が必
377要である.
378
379 ターゲットシステム用のGNU開発環境ツール
380 BINUTILS(as,ld,ar,nm,ranlib,objcopy,objdump)
381 GCCまたはGCC-CORE(gccおよびそこから呼び出されるツール)
382 NEWLIB(標準Cライブラリ,必
383須ではない)
384
385動作確認されているターゲットシステム用のツールについては,ターゲット依
386存部のユーザーズマニュアルを参ç…
387§ã™ã‚‹ã“と.
388
389ターゲットシステム用の標準Cライブラリは,アプリケーションが標準Cライブ
390ラリを使用しない場合には,必
391要ない.ただし,コンパイラが標準Cライブラリ
392関数(memcpy,memsetなど)を呼び出すコードを生成する場合があり,その場
393合には標準Cライブラリが必
394要である.標準Cライブラリを用意する代わりに,
395生成したコードが呼び出す関数のみを自分で用意してもよい.
396
397以下では,これらのツールが用意できていることを前提に,UNIXマシン上での
398構築手順を説明する.また以下の説明では,makeコマンドがGNU Makeであるも
399のとする(ASP3カーネルの標準のMakefileは,GNU Makeの拡張機能を用いてい
400る).
401
402なお,TOPPERS第3世代カーネル向け Ruby版コンフィギュレータは,ASP3カーネ
403ルのパッケージに含まれているため,特別な準備は必
404要ない.
405
4063.2 TECSジェネレータの準備
407
408まず,TOPPERS組込みコンポーネントシステム(TECS)のジェネレータを準備す
409る必
410要がある.TECSジェネレータが,ASP3カーネルの簡易パッケージに含まれ
411ていた場合には,このステップは省略することができる.
412
413TECSジェネレータは,TECSジェネレータの個別パッケージに含まれている.
414TECSジェネレータの個別パッケージを任意の場所に展開し,その下のtecsgenディ
415レクトリを,ASP3カーネルのソースファイルを展開したディレクトリからシン
416ボリックリンクをはる(コピーしてもよい).つまり,ASP3カーネルのソース
417ファイルのディレクトリからtecsgen.rbへの相対パスが,tecsgen/tecsgen.rb
418となればよい.下の手順は,TECSジェネレータのパッケージを,asp3の親ディ
419レクトリに展開する場合の例である.
420
421 % tar xvfz tecsgen-1.3.1.7.tgz
422 % cd asp3
423 % ln -s ../tecsgen/tecsgen .
424 % file tecsgen/tecsgen.rb
425 tecsgen/tecsgen.rb: a ruby script text executable
426
427以下で説明する標準の手順では,TECSジェネレータをRubyスクリプト(テキス
428トファイル形式)のまま実行するが,Windows環境では,Exerbを用いて実行形
429式ファイルに変換して実行する方法もある.
430
431TECSジェネレータを上記以外の場所に置いた場合や,Windows実行形式のTECSジェ
432ネレータを用いる場合には,コンフィギュレーションスクリプトの-Gオプショ
433ンで,TECSジェネレータのパス名を指定すればよい.
434
435なお,TECSジェネレータのバージョンを確認したい場合には,tecsgenを
436--versionオプションをつけて実行すればよい.
437
4383.3 サンプルプログラムの構築と実行
439
440次に,ASP3カーネル上で動作するサンプルプログラムを構築する方法を説明す
441る.
442
443まず,サンプルプログラムのオブジェクトファイルを置くディレクトリを作成
444し,コンフィギュレーションスクリプトを実行する.例えば,オブジェクトファ
445イルを置くディレクトリを,ASP3カーネルのソースファイルを展開したディレ
446クトリの下のOBJという名称のディレクトリにする場合には,次のコマンドを実
447行する(ディレクトリの場所と名称は任意に決めてよい.ただし,場所を変え
448る場合には,configure.rbの相対パスも変更が必
449要である.以下同様).
450
451 % mkdir OBJ
452 % cd OBJ
453 % ruby ../configure.rb -T <ターゲット略称>
454
455ここで,<ターゲット略称>は,targetディレクトリの下に置かれているターゲッ
456ト依存部ディレクトリの名称である.コンフィギュレーションスクリプトのオ
457プションについては,「5.コンフィギュレーションスクリプトの使い方」の
458章で説明する.
459
460コンフィギュレーションスクリプトの実行により,カレントディレクトリには,
461サンプルプログラムを構築するためのMakefileが生成される.
462
463コンフィギュレーションスクリプトの実行後,必
464要であればMakefileを修正す
465る.Makefileの修正方法については,「6.標準のMakefileの修正方法」の章
466で説明する.
467
468その後,makeコマンドによりサンプルプログラムのロードモジュール(aspまた
469はasp.exe)が生成できる.
470
471 % make
472
473ここで構築したサンプルプログラム(sampleディレクトリのsample1.h,
474sample1.c,sample1.cfg,sample1.cdl)は,ASP3カーネルの基本的な動作を確
475認するためのものである.このプログラムの概要説明は,sample1.cのå…
476ˆé ­ã®ã‚³
477メントにある.
478
4793.4 カーネルを関数単位でライブラリ化する方法
480
481前節の手順では,カーネルをファイル単位でコンパイルし,ライブラリ化して
482いたが,カーネルのコードサイズを縮小するためには,使用しないサービスコー
483ルはリンクしない方が望ましい.そこでASP3カーネルでは,カーネルを関数単
484位でコンパイルし,ライブラリ化する方法を用意している.
485
486この方法でサンプルプログラムを構築するには,コンフィギュレーションスク
487リプトに,それを指示するオプション(-f)を付加するだけでよい.例えば,
488オブジェクトファイルを置くディレクトリを,ASP3カーネルのソースファイル
489を展開したディレクトリの下のOBJという名称のディレクトリにする場合には,
490次のコマンドを実行する.
491
492 % mkdir OBJ
493 % cd OBJ
494 % ruby ../configure.rb -T <ターゲット略称> -f
495 % make
496
4973.5 アプリケーションとカーネルを別々
498に構築する方法
499
500前節で説明した方法では,アプリケーションとカーネルを同時に生成するため,
501オブジェクトファイルを置くディレクトリに非常に多くのファイルが作成され
502て,扱いにくくなる.そこで,カーネルを修正する頻度が低い場合には,カー
503ネルは事前に構築しておき,後でアプリケーションだけを構築する方法を用意
504している.以下では,サンプルプログラムを構築を例に,その手順について説
505明する.
506
507まず,カーネルを構築するディレクトリを作成し,コンフィギュレーションス
508クリプトを実行する.例えば,カーネルを構築するディレクトリを,ASP3カー
509ネルのソースファイルを展開したディレクトリの下のKERNEL_LIBという名称の
510ディレクトリにする場合には,次のコマンドを実行する.
511
512 % mkdir KERNEL_LIB
513 % cd KERNEL_LIB
514 % ruby ../configure.rb -T <ターゲット略称> -f
515 % make libkernel.a
516
517これにより,カーネルを構築するディレクトリに,カーネルライブラリ
518(libkernel.a)が生成される.
519
520次に,アプリケーションを構築するディレクトリを作成し,コンフィギュレー
521ションスクリプトを実行する.例えば,アプリケーションを構築するディレク
522トリを,ASP3カーネルのソースファイルを展開したディレクトリの下のAPLとい
523う名称のディレクトリにする場合には,次のコマンドを実行する.
524
525 % cd ..
526 % mkdir APL
527 % cd APL
528 % ruby ../configure.rb -T <ターゲット略称> -L ../KERNEL_LIB
529 % make
530
531ここで-Lオプションには,カーネルを構築したディレクトリのパスを指定する.
532
533この手順では,アプリケーション構築時にはカーネルの再構築が必
534要かチェッ
535クしないため,カーネルのソースコードを修正した場合には,カーネルを構築
536したディレクトリでmake libkernel.aを再実行する必
537要がある.
538
539以上では,カーネルとアプリケーションを別々
540のディレクトリで構築したが,
541-Lオプションにカレントディレクトリ(ただし,"."という記述では不可)を指
542定することで,カーネルとアプリケーションを同じディレクトリで別々
543に構築
544することもできる.å…
545·ä½“的には,次の手順となる.
546
547 % mkdir OBJ
548 % cd OBJ
549 % ruby ../configure.rb -T <ターゲット略称> -L ../OBJ
550 % make libkernel.a
551 % make cleankernel
552 % make
553
554ここで,make cleankernelは,カーネルライブラリを生成するための中間ファ
555イルを削除するものである.この手順では,カーネルライブラリに関する依存
556関係をインクルードしないため,カーネルのソースコードを修正した場合には,
557必
558ずmake cleankernel(または,make clean)してから,make libkernel.aす
559る必
560要があるので注意すること.
561
562
5634.ディレクトリ構成・ファイル構成
564
5654.1 é…
566å¸ƒãƒ‘ッケージのディレクトリ構成
567
568 doc/ ドキュメント
569 include/ アプリケーション向けヘッダファイル
570 kernel/ カーネルのソースファイル
571 tecs_kernel/ TECSからカーネルを呼び出すためのソースファイル
572 syssvc/ システムサービスのヘッダファイル,ソースファイル
573 library/ サポートライブラリのソースファイル
574 target/ ターゲット依存部
575 arch/ ターゲット依存部のå…
576±é€šéƒ¨åˆ†
577 gcc/ GCC開発環境依存部
578 logtrace/ トレースログ記録のサンプルコード
579 cfg/ コンフィギュレータ
580 doc/ コンフィギュレータのドキュメント
581 utils/ ユーティリティプログラム
582 sample/ サンプルプログラムとMakefile
583 test/ テストプログラム
584 extension/ 拡張パッケージ
585
5864.2 ターゲット非依存部のファイル構成
587
588ターゲット非依存部(テストプログラムと拡張パッケージは除く)の各ファイ
589ルの概要は次の通り.
590
591 README.txt TOPPERS/ASP3カーネルの簡単な紹介
592 configure.rb コンフィギュレーションスクリプト(GNU開発環境用)
593 MANIFEST 個別パッケージのファイルリスト
594
595 doc/
596 user.txt ユーザーズマニュアル
597 asp_spec.txt TOPPERS/ASP3カーネルの仕様概要
598 migration.txt TOPPERS/ASP3カーネルへのマイグレーションガイド
599 extension.txt 機能拡張・チューニングガイド
600 porting.txt ターゲット依存部 ポーティングガイド
601 configurator.txt コンフィギュレータ仕様
602 design.txt 設計メモ
603 version.txt 変更履歴
604
605 include/
606 kernel.h ASP3カーネルを使用するための定義
607 sil.h システムインタフェースレイヤを使用するための定義
608 t_stddef.h TOPPERSå…
609±é€šãƒ˜ãƒƒãƒ€ãƒ•ã‚¡ã‚¤ãƒ«
610 itron.h ITRON仕様å…
611±é€šè¦å®šã®ãƒ‡ãƒ¼ã‚¿åž‹ãƒ»å®šæ•°ãƒ»ãƒžã‚¯ãƒ­
612 t_syslog.h システムログ出力を行うための定義
613 t_stdlib.h 基本的なライブラリ関数を使用するための定義
614 queue.h キュー操作ライブラリを使用するための定義
615 log_output.h システムログのフォーマット出力を使用するための定義
616
617 kernel/
618 Makefile.kernel カーネルのファイル構成の定義
619 kernel_impl.h カーネル実装
620用標準ヘッダファイル
621 kernel_int.h kernel_cfg.c用のヘッダファイル
622 kernel_rename.def カーネルの内
623部識別名のリネーム定義
624 kernel_rename.h カーネルの内
625部識別名のリネーム
626 kernel_unrename.h カーネルの内
627部識別名のリネーム解除
628 kernel_api.def コンフィギュレータの静的APIテーブル
629 kernel_sym.def コンフィギュレータの値取得シンボルテーブル
630 kernel.trb コンフィギュレータのパス2の生成スクリプト
631 kernel_check.trb コンフィギュレータのパス3の生成スクリプト
632 genoffset.trb オフセットファイル生成用の生成スクリプト
633 allfunc.h すべての関数をコンパイルするための定義
634 check.h エラーチェック用マクロ
635 startup.c カーネルの初期化と終了処理
636 task.h タスク管理モジュール関連の定義
637 task.c タスク管理モジュール
638 task.trb タスク管理モジュールの生成スクリプト
639 taskhook.h タスク管理に関連するフックルーチン関連の定義
640 taskhook.c タスク管理に関連するフックルーチン
641 wait.h 待
642ち状æ…
643‹ç®¡ç†ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«é–¢é€£ã®å®šç¾©
644 wait.c 待
645ち状æ…
646‹ç®¡ç†ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«
647 time_event.h タイムイベント管理モジュール関連の定義
648 time_event.c タイムイベント管理モジュール
649 task_manage.c タスク管理機能
650 task_refer.c タスクの状æ…
651‹å‚ç…
652§æ©Ÿèƒ½
653 task_sync.c タスク付属同期機能
654 task_term.c タスク終了機能
655 semaphore.h セマフォ機能関連の定義
656 semaphore.c セマフォ機能
657 semaphore.trb セマフォ機能の生成スクリプト
658 eventflag.h イベントフラグ機能関連の定義
659 eventflag.c イベントフラグ機能
660 eventflag.trb イベントフラグ機能の生成スクリプト
661 dataqueue.h データキュー機能関連の定義
662 dataqueue.c データキュー機能
663 dataqueue.trb データキュー機能の生成スクリプト
664 pridataq.h 優å…
665ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½é–¢é€£ã®å®šç¾©
666 pridataq.c 優å…
667ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½
668 pridataq.trb 優å…
669ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ©Ÿèƒ½ã®ç”Ÿæˆã‚¹ã‚¯ãƒªãƒ—ト
670 mutex.h ミューテックス機能関連の定義
671 mutex.c ミューテックス機能
672 mutex.trb ミューテックス機能の生成スクリプト
673 mempfix.h 固定長メモリプール機能関連の定義
674 mempfix.c 固定長メモリプール機能
675 mempfix.trb 固定長メモリプール機能の生成スクリプト
676 time_manage.c システム時刻管理機能
677 cyclic.h 周期通知機能関連の定義
678 cyclic.c 周期通知機能
679 cyclic.trb 周期通知機能の生成スクリプト
680 alarm.h アラーム通知機能関連の定義
681 alarm.c アラーム通知機能
682 alarm.trb アラーム通知機能の生成スクリプト
683 sys_manage.c システム状æ…
684‹ç®¡ç†æ©Ÿèƒ½
685 interrupt.h 割込み管理機能関連の定義
686 interrupt.c 割込み管理機能
687 interrupt.trb 割込み管理機能の生成スクリプト
688 exception.h CPU例外管理機能関連の定義
689 exception.c CPU例外管理機能
690 exception.trb CPU例外管理機能の生成スクリプト
691
692 tecs_kernel/
693 kernel.cdl カーネルオブジェクトのコンポーネント
694 記述ファイル
695 tecs_kernel.h カーネルオブジェクトのコンポーネント
696 化のためのヘッダファイル
697 init_tecs.c TECSの初期化処理
698 tKernel_inline.h カーネル操作のインライン関数
699 tTask.c タスク操作
700 tTask_inline.h タスク操作のインライン関数
701 tSemaphore_inline.h セマフォ操作のインライン関数
702 tEventflag_inline.h イベントフラグ操作のインライン関数
703 tDataqueue_inline.h データキュー操作のインライン関数
704 tPriorityDataqueue_inline.h 優å…
705ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼æ“ä½œã®ã‚¤ãƒ³ãƒ©ã‚¤ãƒ³é–¢æ•°
706 tFixedSizeMemoryPool_inline.h 固定長メモリプール操作のインライン関数
707 tMutex_inline.h ミューテックス操作のインライン関数
708 tCyclicNotifier.c 周期通知操作
709 tCyclicNotifier_inline.h 周期通知操作のインライン関数
710 tAlarmNotifier.c アラーム通知操作
711 tAlarmNotifier_inline.h アラーム通知操作のインライン関数
712 tInterruptRequest_inline.h 割込み要求ライン操作のインライン関数
713 tISR.c 割込みサービスルーチン操作
714 tInterruptHandler.c 割込みハンドラ操作
715 tCpuExceptionHandler.c CPU例外管理操作
716 tInitializeRoutine.c 初期化ルーチン操作
717 tTerminateRoutine.c 終了処理ルーチン操作
718
719 syssvc/
720 syslog.h システムログ機能を使用するための定義
721 tSysLog.cdl システムログ機能のコンポーネント記述ファイル
722 tSysLog.c システムログ機能
723 tSysLogAdapter.cdl システムログ機能のアダプタのコンポーネント記
724 述ファイル
725 tSysLogAdapter.c システムログ機能のアダプタ
726 serial.h シリアルインタフェースドライバを使用するため
727 の定義
728 tSerialPort.cdl シリアルインタフェースドライバのコンポーネン
729 ト記述ファイル
730 tSerialPortMain.c シリアルインタフェースドライバの本体
731 tSerialAdapter.cdl シリアルインタフェースドライバのアダプタのコ
732 ンポーネント記述ファイル
733 tSerialAdapter.c シリアルインタフェースドライバのアダプタ
734 tLogTask.cdl システムログタスクのコンポーネント記述ファイル
735 tLogTaskMain.c システムログタスクの本体
736 test_svc.h テストプログラム用サービスを使用するための定義
737 tTestService.cdl テストプログラム用サービスのコンポーネント記
738 述ファイル
739 tTestService.c テストプログラム用サービス
740 histogram.h 実行時間分布集計サービスを使用するための定義
741 tHistogram.cdl 実行時間分布集計サービスのコンポーネント記述
742 ファイル
743 tHistogram.h 実行時間分布集計サービスのヘッダファイル
744 tHistogram.c 実行時間分布集計サービス
745 tHistogramAdapter.cdl 実行時間分布集計サービスのアダプタのコンポー
746 ネント記述ファイル
747 tHistogramAdapter.c 実行時間分布集計サービスのアダプタ
748 tBanner.cdl カーネル起動メッセージ出力のコンポーネント記
749 述ファイル
750 tBannerMain.c カーネル起動メッセージ出力の本体
751
752 library/
753 log_output.c システムログのフォーマット出力
754 strerror.c エラーメッセージ文字列を返す関数
755 t_perror.c エラーメッセージの出力
756 vasyslog.c 可変数引数のシステムログライブラリ
757
758 arch/gcc/
759 tool_stddef.h t_stddef.hの開発環境依存部(GCC用)
760
761 arch/tracelog/
762 trace_log.h トレースログに関する設定
763 tTraceLog.cdl トレースログ機能のコンポーネント記述ファイル
764 tTraceLog.c トレースログ機能
765
766 cfg/
767 MANIFEST 個別パッケージのファイルリスト
768 cfg.rb コンフィギュレータ本体
769 pass1.rb コンフィギュレータのパス1の処理
770 pass2.rb コンフィギュレータのパス2の処理
771 GenFile.rb GenFileクラスの定義
772 SRecord.rb SRecordクラスの定義
773
774 cfg/doc/
775 cfg_user.txt コンフィギュレータ ユーザーズマニュアル
776
777 utils/
778 applyrename.rb ファイルにリネームを適用
779 genrename.rb リネームヘッダファイルの生成
780 gentest.rb テストプログラムの生成
781 makerelease.rb é…
782å¸ƒãƒ‘ッケージの生成
783
784 sample/
785 Makefile 標準のMakefile(GNU開発環境用)のテンプレート
786 sample1.h サンプルプログラム(1)に関する定義
787 sample1.c サンプルプログラム(1)
788 sample1.cfg サンプルプログラム(1)のコンフィギュレーションファイル
789 sample1.cdl サンプルプログラム(1)のコンポーネント記述ファイル
790 tSample2.h サンプルプログラム(2)に関する定義
791 tSample2.c サンプルプログラム(2)
792 tSample2.cfg サンプルプログラム(2)のコンフィギュレーションファイル
793 tSample2.cdl サンプルプログラム(2)のコンポーネント記述ファイル
794
795
7965.コンフィギュレーションスクリプトの使い方
797
798コンフィギュレーションスクリプト(configure.rb)は,ASP3カーネルおよび
799アプリケーションプログラムを構築するために必
800要な基本的なコンフィギュレー
801ションを行うためのプログラムである.
802
803ASP3カーネルを用いてアプリケーションを作成する場合には,まずオブジェク
804トファイルを置くディレクトリを作成し,そのディレクトリでコンフィギュレー
805ションスクリプトを実行する.オブジェクトファイルを置くディレクトリの場
806所と名称は,任意に決めてよい.
807
808コンフィギュレーションスクリプトに対するオプションは次の通り.
809
810 -T <ターゲット略称>
811 ターゲットシステムの名称を,targetディレクトリの下に置かれてい
812 るターゲット依存部ディレクトリの名称で指定する(必
813須).
814
815 -a <アプリケーションのディレクトリ名>
816 アプリケーションプログラムのソースファイルを置いたディレクトリ
817 名を指定する.省略した場合には,sampleディレクトリ(ASP3カーネ
818 ルのソースファイルを置いたディレクトリの下の"sample")となる.
819 このオプションを複数記述するか,""で囲むことによって,複数のディ
820 レクトリを指定することも可能である.
821
822 -A <アプリケーションプログラム名>
823 アプリケーションプログラムの名称を指定する.省略した場合には,
824 サンプルプログラム(sample1)となる.
825
826 -t
827 アプリケーションプログラムのメインのオブジェクトファイル(アプ
828 リケーションプログラム名に".o"を付加したもの)をリンク対象に含
829 めない.アプリケーションプログラムå…
830¨ä½“ã‚’TECSを用いて開発する場
831 合に使用する.
832
833 -c <システムコンフィギュレーションファイル名>
834 システムコンフィギュレーションファイル(.cfg)の名称を指定する.
835 省略した場合には,アプリケーションプログラム名に".cfg"を付加し
836 た名称とする.
837
838 -C <コンポーネント記述ファイル名>
839 コンポーネント記述ファイル(.cdl)の名称を指定する.省略した場
840 合には,アプリケーションプログラム名に".cdl"を付加した名称とす
841 る.
842
843 -U <オブジェクトファイル名>
844 アプリケーションプログラムのメインのオブジェクトファイル(アプ
845 リケーションプログラム名に".o"を付加したもの)以外に,リンクす
846 べきオブジェクトファイルの名称を,".o"を付加した形で指定する.
847 このオプションを複数記述するか,""で囲むことによって,複数のファ
848 イルを指定することも可能である.
849
850 -S <オブジェクトファイル名>
851 システムサービスのオブジェクトファイルの名称を,".o"を付加した
852 形で指定する.このオプションを複数記述するか,""で囲むことによっ
853 て,複数のファイルを指定することも可能である.
854
855 -L <カーネルライブラリのディレクトリ名>
856 事前に構築したカーネルライブラリ(libkernel.a)を用いて,アプリ
857 ケーションのみを構築する場合には,このオプションにカーネルライ
858 ブラリの置かれたディレクトリ名を指定する.このオプションの使用
859 例については,「3.5 アプリケーションとカーネルを別々
860に構築する
861 方法」の節を参ç…
862§ã™ã‚‹ã“と.
863
864 -f
865 カーネルを関数単位でコンパイルしライブラリ化する場合に,このオ
866 プションを指定する.このオプションの使用例については,「3.4 カー
867 ネルを関数単位でライブラリ化する方法」の節を参ç…
868§ã™ã‚‹ã“と.
869
870 -D <ASP3カーネルのソースディレクトリ名>
871 ASP3カーネルのソースファイルを置いたディレクトリ名を指定する.
872 省略した場合には,configure.rbの置かれているディレクトリとなる.
873
874 -l <プログラミング言語>
875 アプリケーションプログラムの記述に用いるプログラミング言語を指
876 定する.現時点では,cとc++のみをサポートしている.
877
878 -m <テンプレートMakefile名>
879 Makefileのテンプレートとするファイル名を指定する.省略した場合
880 には,sampleディレクトリのMakefileとなる.
881
882 -d <依存環境ファイルのディレクトリ名>
883 依存関係ファイルを置くディレクトリ名を指定する.省略した場合に
884 は,"deps"となる.
885
886 -w
887 TECSを使用しない場合に,このオプションを指定する.
888
889 -r
890 トレースログ記録のサンプルコードを有効にする場合に,このオプショ
891 ンを指定する.このオプションの使用例については,「11.6 トレース
892 ログ記録のサンプルコードの使用方法」の節を参ç…
893§ã™ã‚‹ã“と.
894
895 -V <開発ツールのディレクトリ名>
896 開発ツールが置かれているディレクトリを指定する.開発ツール(コ
897 ンパイラ等)を絶対パスで指定する場合に用いる.
898
899 -R <rubyのパス名>
900 rubyのパス名を指定する.省略した場合には,単に"ruby"となる.
901
902 -g <コンフィギュレータのパス名>
903 コンフィギュレータ(cfg)のパス名を指定する.省略した場合には,
904 "ruby $(SRCDIR)/cfg/cfg.rb"となる.
905
906 -G <TECSジェネレータのパス名>
907 TECSジェネレータ(tecsgen)のパス名を指定する.省略した場合に
908 は,"ruby $(SRCDIR)/tecsgen/tecsgen.rb"となる.
909
910 -o <オプション文字列>
911 コンパイラに与えるオプション文字列で,シンボル定義以外のもの.
912 シンボル定義のオプションは,-Oオプションで指定する.オプション
913 文字列にスペースが含まれる場合には,このオプションを複数記述す
914 るか,"-O2 -Wall"のように,""で囲んで記述する必
915要がある.
916
917 -O <オプション文字列>
918 コンパイラに与えるシンボル定義のためのオプション文字列.オプショ
919 ン文字列にスペースが含まれる場合には,このオプションを複数記述
920 するか,"-DTEST -DPERF"のように,""で囲んで記述する必
921要がある.
922
923 -k <オプション文字列>
924 リンカに与えるオプション文字列.オプション文字列にスペースが含
925 まれる場合には,このオプションを複数記述するか,""で囲んで記述
926 する必
927要がある.
928
929また,コンフィギュレーションスクリプトに対するパラメータにより,追加の
930定義を行うことができる.例えば,マルチプロセッサ対応カーネルでプロセッ
931サ数を指定する場合には,「PRC_NUM=<プロセッサ数>」をパラメータに指定す
932る.
933
934コンフィギュレーションスクリプトが行う処理は次の通りである.
935
936(1) ターゲット依存部ディレクトリのチェック
937
938ターゲット依存部ディレクトリ(-Tオプションで指定)があるかチェックし,
939ない場合にはエラーとする.
940
941(2) Makefileの生成
942
943Makefileのテンプレート(デフォルトでは,sampleディレクトリにある
944Makefile)をå…
945ƒã«ï¼Œå¿…
946要な箇所を書き換えて,Makefileを生成する.
947
948(3) 依存関係ファイルのディレクトリの作成
949
950依存関係ファイルのディレクトリ(デフォルトでは,"deps")を作成する.
951
952
9536.標準のMakefileの修正方法
954
955前の章で説明したように,コンフィギュレーションスクリプトに与えるオプショ
956ン等からMakefileが生成されるが,コンフィギュレーションスクリプトで対応
957できない場合には,Makefileを直接修正する必
958要がある.ここでは,Makefile
959の中で,修正が必
960要となる可能性の高い箇所について説明する.
961
962なお,Makefileを修正した後にコンフィギュレーションスクリプトを再実行す
963ると,修正したMakefileが上書きされてしまうので注意すること(古いものが
964Makefile.bakに保存される).
965
9666.1 Makefileの変数定義
967
968(A) オブジェクトファイルの拡張子
969
970ロードモジュールのファイル名に拡張子が付加される場合には,OBJEXTに拡張
971子を定義する必
972要がある.コンフィギュレーションスクリプトは,Cygwin環境
973であると判定した場合に,OBJEXTを"exe"に定義する.
974
975(B) ロードモジュールのファイル名
976
977標準のロードモジュールのファイル名をOBJNAMEに定義する.デフォルトはasp
978である.
979
980(C) å…
981±é€šã‚³ãƒ³ãƒ‘イルオプション
982
983すべてのプログラムにå…
984±é€šã™ã‚‹ã‚³ãƒ³ãƒ‘イルオプションの追加が必
985要な場合には,
986下の変数の定義を変更する.そのコンパイルオプションが,特定のターゲット
987で常に必
988要な場合には,ターゲット依存の定義をå…
989¥ã‚ŒãŸMakefile.target等を修
990正すべきである.
991
992 CDEFS コンパイラに対する-Dオプションを記述する.
993 INCLUDES コンパイラに対する-Iオプションを記述する.
994 COPTS コンパイラに対するその他のオプションを記述する.
995 LDFLAGS リンカに対するオプションを記述する.
996 LIBS ライブラリリンクのためのオプションを記述する.
997
998この内
999,CDEFS,COPTS,LDFLAGSは,それぞれ,コンフィギュレーションスクリ
1000プトの-Oオプション,-oオプション,-kオプションで追加設定することができ
1001る.
1002
1003追加の可能性のあるコンパイルオプションについては,「6.2 コンパイルオプ
1004ション」の節を参ç…
1005§ã®ã“と.
1006
1007(D) アプリケーションのオブジェクトファイル名
1008
1009アプリケーションを構成するオブジェクトファイル名を,記述言語に応じて,
1010APPL_ASMOBJS,APPL_COBJS,APPL_CXXOBJSに列挙する.この内
1011,APPL_COBJSか
1012APPL_CXXOBJSは,コンフィギュレーションスクリプトの-Aオプションで設定し,
1013-Uオプションで追加設定することができる.
1014
1015(E) アプリケーションのコンパイルオプション
1016
1017アプリケーションのコンパイルに必
1018要なコンパイルオプションがある場合には,
1019APPL_CFLAGSに定義する.なお,APPL_CFLAGSに定義したオプションは,コンフィ
1020ギュレータが生成したファイルをコンパイルする場合には適用されないため,
1021注意すること.
1022
1023(F) システムサービスのディレクトリ
1024
1025システムサービスのソースファイルを置いたディレクトリを,SYSSVC_DIRSに定
1026義する.
1027
1028(G) システムサービスのオブジェクトファイル名
1029
1030システムサービスを構成するオブジェクトファイル名を,記述言語に応じて,
1031SYSSVC_ASMOBJSとSYSSV_COBJSに列挙する.この内
1032,SYSSVC_COBJは,コンフィ
1033ギュレーションスクリプトの-Sオプションで追加設定することができる.
1034
1035(H) システムサービスのコンパイルオプション
1036
1037システムサービスのコンパイルに必
1038要なコンパイルオプションがある場合には,
1039SYSSVC_CFLAGSに定義する.なお,SYSSVC_CFLAGSに定義したオプションは,コ
1040ンフィギュレータが生成したファイルをコンパイルする場合には適用されない
1041ため,注意すること.
1042
1043(I) ターゲットファイルの定義
1044
1045make allにより,ELF形式以外のロードモジュールを作りたい場合には,作りた
1046いロードモジュールの形式を,allに対する$(MAKE)コマンドのパラメータまた
1047は依存関係に追加指定する.å…
1048·ä½“的には,バイナリ形式の時は$(OBJNAME).bin,
1049モトローラ S形式の時は$(OBJNAME).srecを追加指定する.なお,$(OBJFILE)は,
1050OBJEXTを定義した場合には$(OBJNAME).$(OBJEXT),そうでない場合には
1051$(OBJNAME)となる.
1052
10536.2 コンパイルオプション
1054
1055ASP3カーネルのコード中には,assertマクロが使われている.assertマクロは,
1056NDEBUGを定義することで,オブジェクトコード中から消すことができる.カー
1057ネルのデバッグが終了すれば,-DNDEBUGを指定してコンパイルした方が効率が
1058よくなる.
1059
1060ASP3カーネルは,標準Cライブラリを使用せずに記述してあるが,アプリケーショ
1061ンで標準Cライブラリを使用する場合には,カーネルも標準Cライブラリを使っ
1062た方が効率が良い場合がある.カーネルが標準Cライブラリを使ってよい場合に
1063は,コンパイルオプションに-DTOPPERS_USE_STDLIBを指定する(効果があるか
1064どうかはターゲット依存).
1065
1066ターゲット依存部において,コンパイルオプションに-Werror(警告をエラー扱
1067いする)を指定している場合がある.そのようなターゲットにおいて,アプリ
1068ケーションで警告が避けられない場合には,ターゲット依存部を修正してコン
1069パイルオプションを削除する必
1070要がある.
1071
1072TOPPERS_OMIT_SYSLOGを定義してコンパイルすることで,システムログ出力を抑
1073止することができる.
1074
1075
10767.コンフィギュレータの使い方
1077
1078コンフィギュレータ(cfg)による処理は,「TOPPERS第3世代カーネル(ITRON
1079系)統合仕様書」の「2.12.5 コンフィギュレータの処理モデル」の節の記述の
1080通り,3つのパスで構成される.
1081
1082コンフィギュレータの使い方について,標準のMakefileを使用している場合に
1083はほとんど知る必
1084要がない.この章では,標準のMakefileを修正する場合や独
1085自のMakefileを用いる場合のために,ASP3カーネルを使用する上で必
1086要となる
1087コンフィギュレータの使い方について説明する.
1088
1089なお,コンフィギュレータの使用方法に関する詳細は,「TOPPERS第3世代カー
1090ネル向け Ruby版コンフィギュレータ ユーザーズマニュアル」を参ç…
1091§ã™ã‚‹ã“と.
1092
10937.1 コンフィギュレータの起動
1094
1095コンフィギュレータは,システムコンフィギュレーションファイル名(パス1で
1096のみ有効)をパラメータに取り,以下のオプションを持つ(主なもの).
1097
1098 -k[--kernel]<カーネル名>
1099 カーネルの名称を指定する.ASP3カーネルでは,aspを指定する.
1100
1101 -p[--pass]<パス番号>
1102 パス番号を指定する.1〜3のいずれか.
1103
1104 -I[--include-directory]<インクルードディレクトリ名>
1105 INCLUDEディレクティブによりインクルードするコンフィギュレーショ
1106 ンファイルを探すディレクトリ名を指定する.生成スクリプト(trbファ
1107 イル)を探す場合にも用いる.
1108
1109 -T[--trb-file]<生成スクリプト名>
1110 生成スクリプト(trbファイル)の名称を指定する.パス2とパス3で有
1111 効.
1112
1113 --api-table <静的APIテーブルファイル名>
1114 静的APIテーブルのファイル名を指定する.パス1でのみ有効.
1115
1116 --symval-table <値取得シンボルテーブルファイル名>
1117 値取得シンボルテーブルのファイル名を指定する.パス1でのみ有効.
1118
1119 -r[--rom-image]<ロードモジュールのSレコードファイル名>
1120 ロードモジュールをSレコードフォーマットの形に変換したファイルの
1121 名称を指定する.パス2とパス3で有効.
1122
1123 -s [--rom-symbol] <ロードモジュールのシンボルファイル名>
1124 ロードモジュール中の各シンボルとアドレスの対応表を含むシンボル
1125 ファイルの名称を指定する.パス2とパス3で有効.
1126
1127 --id-output-file <ID番号出力ファイル名>
1128 オブジェクトのID番号の割付け結果を,指定した名前のファイルに書
1129 き出す.パス2でのみ有効.
1130
1131 --id-input-file <ID番号å…
1132¥åŠ›ãƒ•ã‚¡ã‚¤ãƒ«å>
1133 オブジェクトのID番号の割付けを,指定した名前のファイルから取り
1134 込む.パス2でのみ有効.
1135
1136 -M[--print-dependencies]<依存関係ファイル名>
1137 システムコンフィギュレーションファイルの依存関係を出力する.パ
1138 ス1でのみ有効.GCCの-Mオプションと異なり,-Mオプションを付けた
1139 場合も,コンフィギュレータは通常の処理を行う(依存関係を出力す
1140 るだけという使い方はできない).依存関係ファイル名を指定しない
1141 場合,標準出力に出力する.
1142
1143 -O [--omit-output-db]
1144 次のパスに情
1145報を引き渡すためのデータファイルを作成しない.
1146
11477.2 タイマドライバの組込み
1148
1149カーネルが内
1150部的に使用する割込みハンドラ(高分解能タイマドライバの割込
1151みハンドラなど)を登録するために,コンフィギュレータのパス1に,カーネル
1152実装
1153のコンフィギュレーションファイル(target_kernel.cfg)を読み込ませる
1154必
1155要がある.
1156
1157
11588.システムサービス
1159
1160ASP3カーネルのé…
1161å¸ƒãƒ‘ッケージには,以下のシステムサービスが含まれている.
1162
1163 ・システムログ機能
1164 ・シリアルインタフェースドライバ
1165 - ターゲット非依存部
1166 - ターゲット依存部
1167 ・システムログタスク
1168 ・低レベル出力(ターゲット依存部のみ)
1169 ・テストプログラム用サービス
1170 ・実行時間分布集計サービス
1171 ・カーネル起動メッセージ出力
1172
1173これらのシステムサービスは,TOPPERS組込みコンポーネントシステム(TECS)
1174を用いて実装
1175している.
1176
1177参考のために,システムログ機能,シリアルインタフェースドライバ(ターゲッ
1178ト非依存部およびターゲット依存部),システムログタスク,低レベル出力の
1179間の結合関係を下の図に示す.
1180
1181 +----------------------+ +------------------------+
1182 | TECSアプリケーション | | 非TECSアプリケーション |
1183 +----------------------+ +------------------------+
1184 |cSysLog |cSerialPort .
1185 | | . アプリケーション
1186 - - - | - - - - - | - - - - - - - - - - - - . - - - - - - - - - - - - -
1187 | +----------------------+ . システムサービス
1188 | . . . . . . . . .|. . . . . .
1189 | . | .
1190 | +----------------+ | +----------------+
1191 | cSysLog| tSysLogAdapter | | | tSysLogAdapter |
1192 +--------| SysLogAdapter | | | SysLogAdapter |
1193 | +----------------+ | +----------------+
1194 | | |cSerialPort
1195 | +----------+ cSerialPort | |
1196 | | |--------------+----------+
1197 | cSysLog| tLogTask | |
1198 +--------| LogTask |-------------------+ |
1199 | | |cnSerialPortManage | |
1200 | +----------+ | |
1201 | |cPutLog | |
1202 | | | |
1203 |eSysLog | enSerialPortManage| |eSerialPort
1204 +----v----+ | +---v-----v---+
1205 | tSysLog | | | tSerialPort |
1206 | SysLog | | | SerialPort1 |
1207 +---------+ | +---------^---+
1208 |cPutLog | cSIOPort| |eiSIOCBR
1209 | | | |
1210 +-------+-------+ | | ターゲット非依存部
1211 - - - - - - -|- - - - - - - - - - - - - - - - | - - | - - - - - - - - -
1212 | | | ターゲット依存部
1213 | | |
1214 |ePutLog eSIOPort| |ciSIOCBR
1215 +---------v--------+ +-----------v----------------+
1216 | 低レベル出力 | | シリアルインタフェース |
1217 | PutLogTarget | | ドライバのターゲット依存部 |
1218 +------------------+ | SIOPortTarget1 |
1219 +----------------------------+
1220
1221以下では,これらのシステムサービスを,C言語で記述されたアプリケーション
1222から使用する方法について説明する.ただし,テストプログラム用サービスに
1223ついては,「10.1 テストプログラム用サービス」の節で述べる.
1224
1225また,ターゲット依存の低レベル出力は,アプリケーションから直接呼び出す
1226ことを想定していないため,このマニュアルでは説明しない.低レベル出力は,
1227コンポーネント記述ファイルで,ターゲット依存部のtarget.cdlをインポート
1228することで,システムに組み込むことができる.
1229
12308.1 システムログ機能
1231
1232システムログ機能は,システム内
1233で発生した異常事象等を,ログ情
1234報として記
1235録するための機能である.また,記録したログ情
1236報を取り出す機能も持つ.
1237
1238システムログ出力を行うソースファイルでは,t_syslog.hをインクルードする.
1239また,システムログ機能のその他のサービスコールを呼び出すソースファイル
1240では,syslog.hをインクルードする.
1241
12428.1.1 システムログ機能の位置付け
1243
1244システムログ機能は,カーネル内
1245からも呼び出すことができるため,カーネル
1246より下の階層のモジュールと位置付けることができる.この意味では,他のシ
1247ステムサービスとは位置付けが異なる.
1248
1249一方,ログ情
1250報をシステム外部に出力するためには,シリアルインタフェース
1251ドライバなど,カーネル上で動作するシステムサービスを用いる必
1252要がある.
1253そこで,ログ情
1254報をシステム外部に出力するためのサービス(これを,システ
1255ムログタスクと呼ぶ)は,システムログ機能とは分離して実装
1256することとし,
1257システムログ機能はログ情
1258報の記録・取出しのための機能に絞っている.
1259
1260以上のように,システムログ機能はカーネルより下の階層のモジュールである
1261が,システムログ機能の中でログ時刻を取り出すために,標準(ターゲット依
1262存部で変更しない場合)では,カーネルの機能を用いている.そのため,カー
1263ネルの実行開始前や終了後は,ログ時刻は正しく記録されない.
1264
12658.1.2 ログバッファへの記録と低レベル出力
1266
1267上述したように,ログ情
1268報をシステムの外部に出力するためには,カーネル上
1269で動作するシステムサービスを用いる必
1270要があるため,カーネルの動作を継続
1271できないような重大な異常事象が起こった場合には,ログ情
1272報を出力できなく
1273なる.また,これらのシステムサービス自身をデバッグする場合にも,ログ情
1274
1275報の出力ができない.
1276
1277そこで,カーネル上で動作するシステムサービスが使えない場合にでもログ情
1278
1279報を出力するために,低レベル出力機能を用意する.低レベル出力機能は,ター
1280ゲット依存に用意する低レベルの文字出力関数を用いてログ情
1281報を出力する機
1282能である.最終製品に組み込む場合などで,文字を出力する方法がない場合の
1283対応方法については,「11.3 システムログ機能の扱い」の節を参ç…
1284§ã™ã‚‹ã“と.
1285
1286ログ情
1287報を,ログバッファへ記録するか低レベル出力機能を用いて出力するか
1288は,システムログ機能のセルの組上げ記述で設定し,システムログ機能のサー
1289ビスコール(syslog_msk_log)でシステム動作中に変更することができる.こ
1290れらの方法については後述する.
1291
1292低レベル出力機能を用いると,ログメッセージの作成処理(printf相当の処理)
1293と低レベルの文字出力処理をå…
1294¨å‰²è¾¼ã¿ç¦æ­¢çŠ¶æ…
1295‹ã§è¡Œã†ãŸã‚ã«ï¼Œå‰²è¾¼ã¿å¿œç­”性が
1296悪くなることに注意しなければならない.特に,低レベルの文字出力処理はデ
1297バイスをポーリングする形で実装
1298するのが通常で,その場合には,割込み応答
1299性は実用的と言えない程に悪くなる.
1300
13018.1.3 ログ情
1302報の種別
1303
1304システムログ機能は,ログ情
1305報に以下の種別を設けている.
1306
1307 LOG_TYPE_COMMENT コメント
1308 LOG_TYPE_ASSERT アサーションの失敗
1309 LOG_TYPE_INH 割込みハンドラ
1310 LOG_TYPE_ISR 割込みサービスルーチン
1311 LOG_TYPE_CYC 周期ハンドラ
1312 LOG_TYPE_ALM アラームハンドラ
1313 LOG_TYPE_OVR オーバランハンドラ
1314 LOG_TYPE_EXC CPU例外ハンドラ
1315 LOG_TYPE_TSKSTAT タスク状æ…
1316‹å¤‰åŒ–
1317 LOG_TYPE_DSP ディスパッチャ
1318 LOG_TYPE_SVC サービスコール
1319
1320ログ情
1321報の種別の中で,LOG_TYPE_COMMENTとLOG_TYPE_ASSERT以外は,カーネル
1322のトレースログに用いるためのもので,システムログ機能では用いていない.
1323
13248.1.4 ログ情
1325報の重要度
1326
1327システムログ機能は,ログ情
1328報を出力する際に指定する重要度に基づいて,実
1329際に出力するログ情
1330報を動的に設定することができる.これは,UNIXのシステ
1331ムログ機能をまねたもので,ログの重要度の種類や指定方法もUNIXのAPIを参考
1332にしている.また,低レベル出力機能を用いて出力するログ情
1333報も,重要度に
1334基づいて動的に設定することができる.
1335
1336å…
1337·ä½“的には,ログの重要度として次の8段階を用意している.
1338
1339 LOG_EMERG カーネルの動作を継続できないエラー
1340 LOG_ALERT
1341 LOG_CRIT
1342 LOG_ERROR 重要性の低いシステムエラー
1343 LOG_WARNING 警告メッセージ.システムは安å…
1344¨ã«ç¶™ç¶šå‹•ä½œã§ãã‚‹
1345 LOG_NOTICE
1346 LOG_INFO
1347 LOG_DEBUG デバッグのためのメッセージ
1348
1349どの重要度のログ情
1350報をログバッファに記録するかと,どの重要度のログ情
1351å ±
1352を低レベル出力機能を用いて出力するかは,システムログ機能のセルの組上げ
1353記述で設定し,システムログ機能のサービスコール(syslog_msk_log)でシス
1354テム動作中に変更することができる.
1355
13568.1.5 ログ情
1357報のデータ構造
1358
1359ログ情
1360報を格納するためのデータ型として,SYSLOG構造体を用意している.
1361SYSLOG構造体には,ログ情
1362報の種別(logtypeフィールド),ログ時刻
1363(logtimフィールド)と6つのログパラメータ(logparフィールド)が含まれる.
1364
1365ログ時刻のデータ型(LOGTIM)とログパラメータのデータ型(LOGPAR)は,標
1366準ではそれぞれHRTCNT(高分解能タイマのカウント値のデータ型)とintptr_t
1367に定義されているが,ターゲット依存部(target_stddef.hまたはそこからイン
1368クルードされるファイル)により変更することができる.
1369
1370SYSLOG構造体に格納されたログ情
1371報を出力する場合,ログ時刻(logtimフィー
1372ルド)は出力関数(syslog_wri_log)によって書き込まれるため,出力関数を
1373呼ぶ側で書き込む必
1374要はない.
1375
13768.1.6 システムログ機能のサービスコール
1377
1378システムログ機能の提供するサービスコールは次の通りである.これらのサー
1379ビスコールを呼び出すソースファイルでは,syslog.hをインクルードする.
1380
1381(1) ER syslog_wri_log(uint_t prio, const SYSLOG *p_syslog)
1382
1383システムログ機能に,p_syslogで指定されるログ情
1384報を,prioで指定される重
1385要度で出力する(ログバッファへ記録するか低レベル出力機能を用いて出力す
1386る).
1387
1388プロトタイプ宣言において,*p_syslogにconst指定がされているが,実際には,
1389この関数の中で,*p_syslogのlogtimフィールドにシステム時刻を書き込んでい
1390る.
1391
1392(2) ER_UINT syslog_rea_log(SYSLOG *p_syslog)
1393
1394ログバッファからログ情
1395報を1つ取り出す.ログバッファが空の時はE_OBJ,そ
1396うでない場合は,ログバッファのオーバフローにより失われたログ情
1397報の数
1398(ログ情
1399報が失われていない場合は0)を返す.システムログタスクが用いるこ
1400とを想定している.
1401
1402(3) ER syslog_msk_log(uint_t logmask, uint_t lowmask)
1403
1404ログバッファに記録すべきログ情
1405報の重要度の示すビットマップ(logmask)と,
1406低レベル出力機能を用いて出力すべきログ情
1407報の重要度を示すビットマップ
1408(lowmask)を設定する.ビットマップを作るためのマクロとして,LOG_MASKと
1409LOG_UPTOを用意している.
1410
1411(4) ER syslog_ref_log(T_SYSLOG_RLOG *pk_rlog)
1412
1413システムログ機能の状æ…
1414‹ã‚’参ç…
1415§ã™ã‚‹ï¼Žå…
1416·ä½“的には,ログバッファに記録されて
1417いるログ情
1418報の数(T_SYSLOG_RLOG構造体のcountフィールド),ログバッファ
1419のオーバフローにより失われたログ情
1420報の数(lostフィールド),ログバッファ
1421に記録すべきログ情
1422報の重要度の示すビットマップ(logmaskフィールド),低
1423レベル出力機能を用いて出力すべきログ情
1424報の重要度を示すビットマップ
1425(lowmaskフィールド)を参ç…
1426§ã™ã‚‹ã“とができる.
1427
1428(5) ER syslog_fls_log(void)
1429
1430ログバッファに記録されているログ情
1431報をすべて取り出し,低レベル出力機能
1432を用いて出力する.
1433
14348.1.7 システムログ機能のためのライブラリ関数とマクロ
1435
1436システムログ出力のためのライブラリ関数とマクロは次の通りである.これら
1437だけを呼び出すソースファイルでは,t_syslog.hをインクルードすればよい.
1438
1439(1) void _syslog_n(uint_t prio, uint_t type, LOGPAR arg1, ..., LOGPAR argn)
1440 ※ nは0〜6のいずれか.
1441
1442ログ種別がtype,ログパラメータがarg1〜argnのログ情
1443報を,重要度prioで出
1444力するための関数.
1445
1446(2) void syslog_n(uint_t prio, const char *format, arg1, ..., argn)
1447 ※ nは0〜5のいずれか.
1448
1449format文字列およびそれに続く引数から作成されるメッセージを,ログ種別が
1450LOG_TYPE_COMMENTのログ情
1451報として,重要度prioで出力するためのマクロ.
1452
1453formatはメッセージのフォーマット記述(printfのフォーマット記述と類似),
1454arg1〜argnはフォーマット記述中で参ç…
1455§ã•ã‚Œã‚‹å€¤ã§ã‚る.arg1〜argnは,この
1456マクロ中でLOGPAR型にキャストされるため,LOGPAR型に型変換できる任意の型
1457を渡すことができ,型チェックはされない.formatおよびarg1〜argnには,次
1458の制限がある.
1459
1460・formatのフォーマット記述は,定数文字列を渡すことを想定しており,この
1461マクロ処理を終えた後も変化してはならない.
1462
1463・format中に使えるフォーマット指定は次の通り.
1464
1465 %d 引数をint_t型とみなし,10進数で表示
1466 %u 引数をuint_t型とみなし,10進数で表示
1467 %x 引数をuint_t型とみなし,16進数(英文字は小文字)で表示
1468 %X 引数をuint_t型とみなし,16進数(英文字は大文字)で表示
1469 %p 引数をポインタとみなし,16進数(英文字は小文字)で表示
1470 %c 引数を文字コードとみなし,文字を表示
1471 %s 引数を文字列を示すポインタとみなし,文字列を表示
1472 %% '%'を表示(引数は取らない)
1473
1474%d, %u, %x, %Xにおいては,'%'の直後に表示桁数を指定する10進数値を記述す
1475ることができる.その場合,表示すべき文字列が指定した桁数に満たない場合
1476には,指定した桁数内
1477に右詰めで表示する.10進数値が'0'で始まる場合には,
1478その間に'0'を埋める.
1479
1480また,サイズ指定を付与した次のフォーマット指定も使うことができる.
1481
1482 %ld 引数をlong_t型とみなし,10進数で表示
1483 %lu 引数をulong_t型とみなし,10進数で表示
1484 %lx 引数をulong_t型とみなし,16進数(英文字は小文字)で表示
1485 %lX 引数をulong_t型とみなし,16進数(英文字は大文字)で表示
1486
1487 %td 引数をint32_t型とみなし,10進数で表示
1488 %tu 引数をuint32_t型とみなし,10進数で表示
1489 %tx 引数をuint32_t型とみなし,16進数(英文字は小文字)で表示
1490 %tX 引数をuint32_t型とみなし,16進数(英文字は大文字)で表示
1491
1492 %Tu 引数をSYSTIM型とみなし,10進数で表示
1493 %Tx 引数をSYSTIM型とみなし,16進数(英文字は小文字)で表示
1494 %TX 引数をSYSTIM型とみなし,16進数(英文字は大文字)で表示
1495
1496ただし,引数をログ情
1497報に出力する際には,LOGPAR型にキャストされる.その
1498ため,LOGPAR型(標準ではintptr_tに定義)より大きいサイズのデータは,正
1499しく表示されない.正しく表示したい場合には,ターゲット依存部でLOGPAR型
1500の定義を変更すれば良い.
1501
1502%tu,%tx,%tXは,RELTIM型やTMO型の変数を表示するために使うことを想定し
1503た機能である.
1504
1505・arg1〜argnにポインタを渡す場合(%sに対応する引数の場合),ポインタの
1506の指すデータは,このマクロ処理を終えた後も変化してはならない.定数文字
1507列を渡すことを想定している.
1508
1509(3) void syslog(uint_t prio, const char *format, ...)
1510
1511format文字列およびそれに続く引数から作成されるメッセージを,ログ種別が
1512LOG_TYPE_COMMENTのログ情
1513報として,重要度prioで出力するための関数で,引
1514数の数を可変にしたもの.formatに続く引数は最大5個まで.formatおよびそれ
1515に続く引数には,syslog_nと同様の制限がある.
1516
1517このライブラリ関数は,可変数引数を処理するために内
1518部で文字列をスキャン
1519する.そのため,実行時間が長くなる可能性があり,割込み禁止状æ…
1520‹ã§å‘¼ã³å‡º
1521すべきではない.主にアプリケーションプログラムが用いることを想定してい
1522る.
1523
1524(4) UINT LOG_MASK(UINT prio)
1525
1526重要度prioのみセットされたビットマップを作るマクロ.syslog_msk_logに渡
1527す引数を作るために用いる.
1528
1529(5) UINT LOG_UPTO(UINT prio)
1530
1531重要度prio以上の重要度がすべてセットされたビットマップを作るマクロ.
1532syslog_msk_logに渡す引数を作るために用いる.
1533
15348.1.8 システムログ機能の組込みと取外し
1535
1536システムログ機能は,システムログ機能の本体と,システムログ機能をC言語で
1537記述されたアプリケーションから呼び出すためのアダプタで構成される.
1538
1539システムログ機能の本体は,コンポーネント記述ファイルでtSysLog.cdlをイン
1540ポートし,以下のようなセルの組上げ記述を含めることで,システムに組み込
1541むことができる(sample1.cdlには,この記述が含まれている).
1542
1543----------------------------------------
1544cell tSysLog SysLog {
1545 logBufferSize = 32; /* ログバッファのサイズ */
1546 initLogMask = C_EXP("LOG_UPTO(LOG_NOTICE)");
1547 /* ログバッファに記録すべき重要度 */
1548 initLowMask = C_EXP("LOG_UPTO(LOG_EMERG)");
1549 /* 低レベル出力すべき重要度 */
1550 /* 低レベル出力との結合 */
1551 cPutLog = PutLogTarget.ePutLog;
1552};
1553----------------------------------------
1554
1555この記述を変更することで,システムログ機能のログバッファのサイズ,ログ
1556バッファに記録すべき重要度の初期値,低レベル出力すべき重要度の初期値を
1557変更することができる.
1558
1559システムログ機能のアダプタは,コンポーネント記述ファイルで
1560tSysLogAdapter.cdlをインポートし,以下のセルの組上げ記述を含めることで,
1561システムに組み込むことができる(sample1.cdlには,この記述が含まれてい
1562る).
1563
1564----------------------------------------
1565cell tSysLogAdapter SysLogAdapter {
1566 cSysLog = SysLog.eSysLog;
1567};
1568----------------------------------------
1569
1570システムログ機能を取り外す場合には,上の2つのセルの組上げ記述を削除し,
1571コンパイルオプションに-DTOPPERS_OMIT_SYSLOGを追加すればよい.ただし,シ
1572ステムログタスクはシステムログ機能を使用するため,それも外すことが必
1573要
1574である.
1575
15768.2 シリアルインタフェースドライバ
1577
1578シリアルインタフェースドライバは,シリアルポートを扱うためのドライバで
1579ある.
1580
15818.2.1 シリアルインタフェースドライバのサービスコール
1582
1583シリアルインタフェースドライバを呼び出すサービスコールの仕様は次の通り
1584である.この中で,シリアルポートのID番号(portid)の解釈はターゲット依
1585存となる.これらのサービスコールを呼び出すソースファイルでは,serial.h
1586をインクルードする.
1587
1588シリアルインタフェースドライバのサービスコールは,非タスクコンテキスト
1589から呼び出すことはできない.また,serial_rea_datとserial_wri_datは,ディ
1590スパッチ保留状æ…
1591‹ã§å‘¼ã³å‡ºã™ã“とはできない.いずれも,呼び出した場合には
1592E_CTXエラーとなる.
1593
1594(1) ER serial_opn_por(ID portid)
1595
1596portidで指定されたシリアルポートをオープンし,受信/送信が可能な状æ…
1597‹ã«
1598する.
1599
1600(2) ER serial_cls_por(ID portid)
1601
1602portidで指定されたシリアルポートをクローズする.
1603
1604(3) ER_UINT serial_rea_dat(ID portid, char *buf, uint_t len)
1605
1606portidで指定されたシリアルポートから,lenバイトの文字列を受信し,bufか
1607らの領域にå…
1608¥ã‚Œã‚‹ï¼Žlenバイト受信するまで,待
1609ち状æ…
1610‹ã¨ãªã‚‹ï¼Žå—信した文字数
1611またはエラーコードを返す.
1612
1613(4) ER_UINT serial_wri_dat(ID portid, const char *buf, uint_t len)
1614
1615portidで指定されたシリアルポートに,bufからのlenバイトの文字列を送信す
1616る.lenバイト送信バッファにå…
1617¥ã‚Œã‚‹ã¾ã§ï¼Œå¾…
1618ち状æ…
1619‹ã¨ãªã‚‹ï¼Žé€ä¿¡ã—た文字数ま
1620たはエラーコードを返す.
1621
1622(5) ER serial_ctl_por(ID portid, uint_t ioctl)
1623
1624portidで指定されたシリアルポートの制御情
1625報を,ioctlで示される値に設定す
1626る.
1627
1628ioctlには,以下の制御情
1629報を表す定数を,ビット毎に論理和をとったものを
1630指定する.
1631
1632 IOCTL_ECHO(エコーバックモード)
1633 このビットを設定すると,シリアルインタフェースドライバがエコー
1634 バックを行う.å…
1635·ä½“的には,バッファから文字を取り出す度に,その
1636 文字を書き出す.
1637
1638 IOCTL_CRLF(改行モード)
1639 LF(line feed)を書き出すと,CR(carriage return)+LFに変換し
1640 て書き出す.
1641
1642 IOCTL_FCSND(送信フロー制御)
1643 文字を送信する処理に対して,XON/XOFFによるフロー制御を行う.
1644 すなわち,STOP(コントロール-S)を受信すると送信を停止し,
1645 START(コントロール-Q)を受信すると送信を再開する.
1646
1647 IOCTL_FCANY(送信フロー制御で任意の文字で送信再開)
1648 IOCTL_FCSNDを指定している時に,送信停止中に受信した任意の文字
1649 で送信を再開する.
1650
1651 IOCTL_FCRCV(受信フロー制御)
1652 文字を受信する処理に対して,XON/XOFFによるフロー制御を行う.
1653 すなわち,受信バッファの残り領域が少なくなるとSTOP(コントロー
1654 ル-S)を送出し,残り領域が増えればSTART(コントロール-Q)を送
1655 出する.
1656
1657なお,オープン直後のデフォルトの設定値は(IOCTL_ECHO | IOCTL_CRLF |
1658IOCTL_FCSND | IOCTL_FCRCV)である.
1659
1660(6) ER serial_ref_por(ID portid, T_SERIAL_RPOR *pk_rpor)
1661
1662portidで指定されたシリアルポートの状æ…
1663‹ã‚’参ç…
1664§ã—,pk_rporで指定されるパケッ
1665トに返す.パケット中のreacntには受信バッファ中の文字数を,wricntには送
1666信バッファ中の文字数を返す.
1667
16688.2.2 シリアルインタフェースドライバのその他のサービス
1669
1670シリアルインタフェースドライバは,前節のサービスコールに加えて,システ
1671ムの終了時に未送信の文字を取り出すための機能(終了処理ルーチンから呼び
1672出すことを想定)を持つが,C言語で記述されたアプリケーションから呼び出す
1673ことは想定していない.
1674
16758.2.3 シリアルインタフェースドライバの組込みと取外し
1676
1677シリアルインタフェースドライバは,シリアルインタフェースドライバのター
1678ゲット非依存部,シリアルインタフェースドライバのターゲット依存部と,シ
1679リアルインタフェースドライバをC言語で記述されたアプリケーションから呼び
1680出すためのアダプタで構成される.
1681
1682シリアルインタフェースドライバのターゲット依存部は,コンポーネント記述
1683ファイルで,ターゲット依存部のtarget.cdlをインポートすることで,システ
1684ムに組み込むことができる.
1685
1686シリアルインタフェースドライバのターゲット非依存部は,コンポーネント記
1687述ファイルでtSerialPort.cdlをインポートし,以下のようなセルの組上げ記述
1688を含めることで,システムに組み込むことができる(SIOPortTarget1の組上げ
1689記述が,ターゲット依存部に含まれていることを想定.シリアルポート毎に,
1690セルの組上げ記述が必
1691要.sample1.cdlには,この記述が含まれている).
1692
1693----------------------------------------
1694cell tSerialPort SerialPort1 {
1695 receiveBufferSize = 256; /* 受信バッファのサイズ */
1696 sendBufferSize = 256; /* 送信バッファのサイズ */
1697
1698 /* ターゲット依存部との結合 */
1699 cSIOPort = SIOPortTarget1.eSIOPort;
1700 eiSIOCBR <= SIOPortTarget1.ciSIOCBR; /* コールバック */
1701};
1702----------------------------------------
1703
1704この記述を変更することで,シリアルインタフェースドライバの受信バッファ
1705のサイズと送信バッファのサイズを変更することができる(シリアルポート毎
1706に別々
1707に設定することもできる).
1708
1709シリアルインタフェースドライバのアダプタは,コンポーネント記述ファイル
1710でtSerialAdapter.cdlをインポートし,以下のようなセルの組上げ記述を含め
1711ることで,システムに組み込むことができる(シリアルインタフェースを1ポー
1712トのみサポートする場合.sample1.cdlには,この記述が含まれている).
1713
1714----------------------------------------
1715cell tSerialAdapter SerialAdapter {
1716 cSerialPort[0] = SerialPort1.eSerialPort;
1717};
1718----------------------------------------
1719
1720シリアルインタフェースドライバを取り外す場合には,上の2つのセルの組上げ
1721記述を削除すればよい.ただし,システムログタスクはシリアルインタフェー
1722スドライバを使用するため,それも外すことが必
1723要である.
1724
17258.3 システムログタスク
1726
1727システムログタスクは,システムログ機能からログ情
1728報を取り出し,それをシ
1729ステムの外部に出力するためのサービスである.
1730
1731ASP3カーネルのé…
1732å¸ƒãƒ‘ッケージに含まれるシステムログタスクは,シリアルイ
1733ンタフェースドライバを用いてログ情
1734報を文字列の形で出力するもので,シス
1735テムログタスクの一例という位置付けで提供している.
1736
17378.3.1 システムログタスクの機能
1738
1739システムログタスクは,実行開始されると,まず,結合されたシリアルインタ
1740フェースドライバのシリアルポートをオープンする.
1741
1742その後,システムログ機能を用いてログバッファからログ情
1743報を取り出し,そ
1744れを文字列に変換して,シリアルポートに出力する.ログバッファが空の場合
1745には,一定時間(デフォルトでは1ミリ秒。セルの組上げ記述で変更可能)待
1746つ.
1747これらの処理を,カーネルの終了まで繰り返す.
1748
1749カーネルの終了処理では,シリアルインタフェースドライバの送信バッファに
1750蓄積されたデータと,ログバッファに記録されたログ情
1751報を,低レベル出力機
1752能を用いて出力する.出力すべきログ情
1753報がある場合には,それを出力する前
1754に,"-- buffered messages --"という文字列を出力する.
1755
1756これにより,カーネル終了時点で未出力のログ情
1757報のほとんどを出力すること
1758ができる.ただし,カーネル終了時点で,システムログタスクがログバッファ
1759から取り出したが,まだシリアルポートに送っていないログ情
1760報は,出力され
1761ない.
1762
17638.3.2 システムログタスクのその他のサービス
1764
1765システムログタスクは,前節の機能に加えて,システムログ機能のログバッファ
1766中のログ情
1767報が指定した数以下になるまで待
1768つ(指定した数が0の場合には,シ
1769リアルインタフェースドライバの送信バッファが空になるのも待
1770つ)機能を持
1771つが,C言語で記述されたアプリケーションから呼び出すことは想定していない.
1772
17738.3.3 システムログタスクの組込みと取外し
1774
1775システムログタスクは,コンポーネント記述ファイルでtLogTask.cdlをインポー
1776トし,以下のようなセルの組上げ記述を含めることで,システムに組み込むこ
1777とができる(sample1.cdlには,このような記述が含まれている).
1778
1779----------------------------------------
1780cell tLogTask LogTask {
1781 priority = 3; /* システムログタスクの優å…
1782ˆåº¦ */
1783 stackSize = LogTaskStackSize; /* システムログタスクのスタックサイズ */
1784 interval = 10000; /* システムログタスクの動作間隔 */
1785 flushWait = 1000; /* フラッシュ待
1786ちの単位時間 */
1787
1788 /* シリアルインタフェースドライバとの結合 */
1789 cSerialPort = SerialPort1.eSerialPort;
1790 cnSerialPortManage = SerialPort1.enSerialPortManage;
1791
1792 /* システムログ機能との結合 */
1793 cSysLog = SysLog.eSysLog;
1794
1795 /* 低レベル出力との結合 */
1796 cPutLog = PutLogTarget.ePutLog;
1797};
1798----------------------------------------
1799
1800この記述を変更することで,システムログタスクの優å…
1801ˆåº¦ï¼Œã‚¹ã‚¿ãƒƒã‚¯ã‚µã‚¤ã‚ºï¼Œ
1802動作間隔(ログバッファが空の場合に待
1803つ時間),フラッシュ待
1804ちの単位時間
1805を変更することができる.
1806
1807システムログタスクを取り外す場合には,上のセルの組上げ記述を削除すれば
1808よい.
1809
18108.4 実行時間分布集計サービス
1811
1812実行時間分布集計サービスは,システムのリアルタイム性能を評価するために,
1813プログラム区間の実行時間を計測し,その分布を集計・表示するためのシステ
1814ムサービスである.
1815
18168.4.1 実行時間分布集計サービスの概要
1817
1818実行時間分布集計サービスは,複数のプログラム区間の実行時間を計測・集計・
1819表示することができる.プログラム区間毎に,実行時間分布を記録するための
1820データ構造を持つ.どのデータ構造を用いるかを,ID番号(histid)で指定す
1821る.
1822
1823ターゲット依存部で設定を変更していない場合,実行時間分布集計サービスは,
1824カーネルの高分解能タイマを参ç…
1825§ã™ã‚‹æ©Ÿèƒ½ï¼ˆfch_hrt)を用いて実行時間を計測
1826する.そのため,実行時間はマイクロ秒単位で記録される(精度はターゲット
1827依存).また,記録される時間には,計測のためのオーバヘッド(fch_hrtの実
1828行時間+α)が含まれる.
1829
1830ターゲット依存部で設定を変更している場合の仕様については,ターゲット依
1831存部のユーザーズマニュアルを参ç…
1832§ã™ã‚‹ã“と.
1833
18348.4.2 実行時間分布集計サービスのサービスコール
1835
1836実行時間分布集計サービスを呼び出すサービスコールの仕様は次の通りである.
1837これらのサービスコールを呼び出すソースファイルでは,histogram.hをインク
1838ルードする.
1839
1840(1) void init_hist(ID histid)
1841
1842histidで指定されたデータ構造を初期化する.
1843
1844(2) void begin_measure(ID histid)
1845
1846実行時間を計測するプログラム区間の直前に呼び出す関数.histidで指定され
1847たデータ構造に,現在のシステム時刻を記録する.
1848
1849(3) void end_measure(ID histid)
1850
1851実行時間を計測するプログラム区間の直後に呼び出す関数.現在のシステム時
1852刻と,histidで指定されたデータ構造に記録された開始時刻から,プログラム
1853区間の実行時間を求め,その結果を記録する.
1854
1855(4) void print_hist(ID histid)
1856
1857システムログ機能を用いて,実行時間分布の計測結果を出力する.
1858
18598.4.3 実行時間分布集計サービスの組込みと取外し
1860
1861実行時間分布集計サービスは,実行時間分布集計サービスの本体と,実行時間
1862分布集計サービスをC言語で記述されたアプリケーションから呼び出すためのア
1863ダプタで構成される.
1864
1865実行時間分布集計サービスの本体は,コンポーネント記述ファイルで
1866tHistogram.cdlをインポートし,以下のようなセルの組上げ記述を含めること
1867で,システムに組み込むことができる(perf_pf.cdlには,このような記述が含
1868まれている).セルの組上げ記述は,実行時間分布を記録するためのデータ構
1869造毎に必
1870要である.
1871
1872----------------------------------------
1873cell tHistogram Histogram1 { };
1874cell tHistogram Histogram2 { maxTime = 2000 };
1875----------------------------------------
1876
1877ここで,maxTimeは,集計できる最大実行時間である.上の例のHistogram1のよ
1878うにmaxTimeの指定を省略した場合,デフォルト値として1000が使われる.
1879
1880実行時間分布集計サービスのアダプタは,コンポーネント記述ファイルで
1881tHistogramAdapter.cdlをインポートし,以下のようなセルの組上げ記述を含め
1882ることで,システムに組み込むことができる(実行時間分布を記録するための
1883データ構造を2つサポートする場合.perf_pf.cdlには,このような記述が含ま
1884れている).
1885
1886----------------------------------------
1887cell tHistogramAdapter HistogramAdapter {
1888 cHistogram[0] = Histogram1.eHistogram;
1889 cHistogram[1] = Histogram2.eHistogram;
1890};
1891----------------------------------------
1892
18938.5 カーネル起動メッセージ出力
1894
1895カーネル起動メッセージ出力は,カーネルの起動時に,カーネルの名称やバー
1896ジョン番号,著作権表示などを出力するための機能である.
1897
1898カーネル起動メッセージ出力は,コンポーネント記述ファイルでtBanner.cdlを
1899インポートし,以下のようなセルの組上げ記述を含めることで,システムに組
1900み込むことができる(BannerTargetNameとBannerCopyrightNoticeの定義が,ター
1901ゲット依存部に含まれていることを想定.sample1.cdlには,この記述が含まれ
1902ている).
1903
1904----------------------------------------
1905cell tBanner Banner {
1906 targetName = BannerTargetName;
1907 copyrightNotice = BannerCopyrightNotice;
1908};
1909----------------------------------------
1910
1911
19129.サポートライブラリ
1913
1914サポートライブラリは,アプリケーションやシステムサービスを作成するため
1915に利用できるライブラリ関数群である.
1916
19179.1 基本的なライブラリ関数
1918
1919基本的なライブラリ関数を用いる場合には,t_stdlib.hをインクルードし,必
1920
1921要に応じてstrerror.cとt_perror.cをコンパイル・リンクする.
1922
1923(1) const char *itron_strerror(ER ercd)
1924
1925ercdで示されるエラーコードに対応するメインエラーコードの文字列を返す.
1926
1927(2) void t_perror(uint_t prio, const char *file, int_t line,
1928 const char *expr, ER ercd);
1929
1930サービスコールがエラーを返した場合に用いることを想定した関数で,ファイ
1931ル名,行番号,メインエラーコード等を,重要度prioで,システムログ機能を
1932用いて出力する.
1933
19349.2 キュー操作ライブラリ関数
1935
1936キュー操作ライブラリは,キューヘッダを含むリング構造のダブルリンクキュー
1937を扱うライブラリである.キューヘッダの次エントリはキューのå…
1938ˆé ­ã®ã‚¨ãƒ³ãƒˆ
1939リ,前エントリはキューの末尾のエントリとする.また,キューのå…
1940ˆé ­ã®ã‚¨ãƒ³
1941トリの前エントリと,キューの末尾のエントリの次エントリは,キューヘッダ
1942とする.空のキューは,次エントリ,前エントリとも自分自身を指すキューヘッ
1943ダであらわす.
1944
1945キュー操作ライブラリ関数を用いる場合には,queue.hをインクルードする.
1946
1947キューヘッダとエントリのためのデータ構造として,QUEUE構造体を用いる.
1948QUEUE構造体の定義は次の通り.
1949
1950 typedef struct queue {
1951 struct queue *p_next; /* 次エントリへのポインタ */
1952 struct queue *p_prev; /* 前エントリへのポインタ */
1953 } QUEUE;
1954
1955キュー操作のために用意している関数は次の通り.
1956
1957(1) void queue_initialize(QUEUE *p_queue);
1958
1959キューを初期化する.p_queueにはキューヘッダを指定する.
1960
1961(2) void queue_insert_prev(QUEUE *p_queue, QUEUE *p_entry);
1962
1963p_queueで指定するエントリの前に,p_entryで指定するエントリを挿å…
1964¥ã™ã‚‹ï¼Ž
1965p_queueにキューヘッダを指定した場合には,キューの末尾にp_entryで指定す
1966るエントリを挿å…
1967¥ã™ã‚‹ã“とになる.
1968
1969(3) void queue_insert_next(QUEUE *p_queue, QUEUE *p_entry);
1970
1971p_queueで指定するエントリの次に,p_entryで指定するエントリを挿å…
1972¥ã™ã‚‹ï¼Ž
1973p_queueにキューヘッダを指定した場合には,キューのå…
1974ˆé ­ã«p_entryで指定す
1975るエントリを挿å…
1976¥ã™ã‚‹ã“とになる.
1977
1978(4) void queue_delete(QUEUE *p_entry);
1979
1980p_entryで指定するエントリを,キューから削除する.
1981
1982(5) QUEUE *queue_delete_next(QUEUE *p_queue);
1983
1984p_queueで指定するエントリの次のエントリをキューから削除し,削除したエン
1985トリを返す.p_queueにキューヘッダを指定した場合には,キューのå…
1986ˆé ­ã®ã‚¨ãƒ³
1987トリを取り出すことになる.p_queueに空のキューを指定して呼び出してはなら
1988ない.
1989
1990(6) bool_t queue_empty(QUEUE *p_queue);
1991
1992キューが空の場合にはtrue,そうでない場合にはfalseを返す.p_queueには
1993キューヘッダを指定する.
1994
19959.3 システムログ出力用ライブラリ関数
1996
1997システムログ出力用ライブラリ関数は,ログ情
1998報をフォーマット出力するため
1999に,システムログタスクおよびシステムログ機能で用いるための関数群である.
2000
2001システムログ出力用ライブラリ関数を用いる場合には,log_output.hをインク
2002ルードし,log_output.cをコンパイル・リンクする.
2003
2004(1) void syslog_printf(const char *format, const intptr_t *p_args,
2005 void (*putc)(char))
2006
2007formatで指定されるフォーマット記述とp_argsで指定される引数列から作成し
2008たメッセージを,1文字出力関数putcを用いて出力する.
2009
2010(2) void syslog_print(const SYSLOG *p_syslog, void (*putc)(char))
2011
2012p_syslogで指定されるログ情
2013報を文字列に直し,1文字出力関数putcを用いて出
2014力する.
2015
2016(3) void syslog_lostmsg(uint_t lost, void (*putc)(char))
2017
2018lost個のログ情
2019報が失われた旨のメッセージを,1文字出力関数putcを用いて出
2020力する.
2021
2022
202310.テストプログラム
2024
2025テストプログラムは,カーネルの機能テストおよび性能評価を行うためのプロ
2026グラム群である.
2027
202810.1 テストプログラム用サービス
2029
2030テストプログラム用サービスは,プログラム中のチェックポイントが正しい順
2031序で実行されたことなど,プログラムが正しく動作していることをチェックす
2032るためのシステムサービスである.プログラムが正しく動作していないことを
2033検出した場合には,プログラムを終了させる.
2034
203510.1.1 テストプログラム用サービスのサービスコール
2036
2037テストプログラム用サービスを呼び出すサービスコールの仕様は次の通りであ
2038る.これらのサービスコールを呼び出すソースファイルでは,test_svc.hをイ
2039ンクルードする.
2040
2041(1) void test_start(const char *progname)
2042
2043テストプログラムの開始時に呼び出す関数.prognameには,テストプログラム
2044名を渡す.
2045
2046(2) void set_bit_func(const void *bit_func)
2047
2048チェックポイントにおいて呼び出す自己診断関数を設定するための関数.この
2049関数を呼び出さない場合,チェックポイントで自己診断関数を呼び出さない.
2050
2051(3) void check_point(uint_t count)
2052
2053チェックポイントを通過する際に呼び出す関数.countには,何番目のチェック
2054ポイントであるかを指定する(最初のチェックポイントでは1を指定する).
2055countの値が,最初のチェックポイントにおいては1でない場合に,それ以降の
2056チェックポイントにおいては,前のチェックポイント通過時にcountに指定した
2057値に1を加えた値でない場合に,プログラムが正しく動作していないと見なし,
2058プログラムを終了させる.
2059
2060(4) void check_finish(uint_t count)
2061
2062最後のチェックポイントに到達した際に呼び出す関数.countには,何番目の
2063チェックポイントであるかを指定する(最初のチェックポイントでは1を指定す
2064る).countの値が,前のチェックポイント通過時にcountに指定した値に1を加
2065えた値でない場合に,プログラムが正しく動作していないと見なす.この関数
2066は,プログラムが正しく動作している/いないに関わらず,プログラムを終了
2067させる.
2068
2069チェックポイントを使用しないテストプログラムの場合には,countに0を指定
2070してこの関数を呼び出し,プログラムを終了させる.
2071
2072(5) void check_assert(bool_t exp)
2073
2074expが真であることをチェックしたい場合に呼び出す関数.expが偽である場合
2075に,プログラムが正しく動作していないと見なし,プログラムを終了させる.
2076
2077(6) void check_ercd(ER ercd, ER expected_ercd)
2078
2079ercdがexpected_ercdに一致していることをチェックしたい場合に呼び出す関数.
2080ercdがexpected_ercdに一致していない場合に,プログラムが正しく動作してい
2081ないと見なし,プログラムを終了させる.
2082
2083(7) void check_state(bool_t ctx, bool_t loc,
2084 bool_t dsp, bool_t dpn, bool_t ter)
2085
2086システム状æ…
2087‹ãŒæœŸå¾…
2088したものになっているかチェックしたい時に呼び出す関数.
2089ctx,loc,dsp,dpn,terには,それぞれsns_ctx(),sns_loc(),sns_dsp(),
2090sns_dpn(),sns_ter()の返値として期待
2091される値を指定する.この内
2092のいずれ
2093かが期待
2094される値と一致していない場合に,プログラムが正しく動作していな
2095いと見なし,プログラムを終了させる.
2096
2097(8) void check_ipm(PRI ipm)
2098
2099割込み優å…
2100ˆåº¦ãƒžã‚¹ã‚¯ãŒæœŸå¾…
2101した値になっているかチェックしたい時に呼び出す
2102関数.ipmには,get_ipm()で参ç…
2103§ã§ãã‚‹å‰²è¾¼ã¿å„ªå…
2104ˆåº¦ãƒžã‚¹ã‚¯ã¨ã—て期待
2105される
2106値を指定する.期待
2107される値と一致していない場合に,プログラムが正しく動
2108作していないと見なし,プログラムを終了させる.
2109
211010.1.2 テストプログラム用サービスの組込みと取外し
2111
2112テストプログラム用サービスは,コンポーネント記述ファイルで
2113tTestService.cdlをインポートし,以下のセルの組上げ記述を含めることで,
2114システムに組み込むことができる(test_pf.cdlとperf_pf.cdlには,この記述
2115が含まれている).
2116
2117----------------------------------------
2118cell tTestService TestService {
2119 cSysLog = SysLog.eSysLog;
2120};
2121----------------------------------------
2122
2123テストプログラム用サービスを取り外す場合には,上のセルの組上げ記述を削
2124除すればよい.
2125
212610.2 カーネルの整合性検査
2127
2128チェックポイントにおいて呼び出す自己診断に使うためのプログラムとして,
2129カーネルの整合性検査を用意している.カーネルの整合性検査は,カーネル内
2130
2131の各データ構造の一貫性を検査する(現時点では未完成).
2132
2133カーネルの整合性検査を用いる場合には,それぞれ,bit_kernel.c,
2134bit_mutex.cをコンパイル・リンクする.
2135
2136(1) ER bit_kernel(void)
2137
2138カーネル内
2139の各データ構造の一貫性を検査し,一貫性が確認できた場合にE_OK,
2140できなかった場合にE_SYSエラーを返す関数.E_SYSエラーを返す際のサブエラー
2141コードとして,一貫性が確認できなかった項
2142目を示すコードを返す.
2143
2144(2) ER bit_mutex(void)
2145
2146カーネル内
2147のミューテックス関連のデータ構造の一貫性を検査し,一貫性が確
2148認できた場合にE_OK,できなかった場合にE_SYSエラーを返す関数.E_SYSエラー
2149を返す際のサブエラーコードとして,一貫性が確認できなかった項
2150目を示すコー
2151ドを返す.
2152
215310.3 機能テストプログラム
2154
2155testディレクトリに置かれた"test"で始まるプログラムは,カーネルの機能テ
2156ストを行うためのプログラムである.
2157
2158機能テストプログラムはテストプログラム用サービスを使用しているため,構
2159築する場合には,コンポーネント記述ファイルにtest_pf.cdlを使用する必
2160要が
2161ある.コンフィギュレーションスクリプトを使用する場合には,-Cオプション
2162でtest_pf.cdlを指定する.å…
2163·ä½“的には,次のコマンドを実行すればよい(構築
2164用のディレクトリが,ASP3カーネルのソースファイルを展開したディレクトリ
2165の直下にあると仮定している).
2166
2167 % ruby ../configure.rb -T <ターゲット略称> -a ../test \
2168 -A <テストプログラム名> -C test_pf.cdl
2169
2170ただし,CPU例外処理のテスト(1)〜(13)は,同一のシステムコンフィギュレー
2171ションファイル(test_cpuexc.cfg)をå…
2172±ç”¨ã—ているため,-cオプションで
2173test_cpuexc.cfgを指定する必
2174要がある.
2175
2176 % ruby ../configure.rb -T <ターゲット略称> -a ../test \
2177 -A <テストプログラム名> -C test_pf.cdl \
2178 -c test_cpuexc.cfg
2179
2180また,いくつかのテストプログラムでは,カーネルの整合性検査を実施してい
2181る.該当するテストプログラムを構築する場合には,システムサービスのオブ
2182ジェクトファイル名に,bit_kernel.oまたはbit_mutex.oを追加する必
2183要がある.
2184コンフィギュレーションスクリプトを使用する場合には,-Sオプションでこれ
2185らのファイルを指定する.å…
2186·ä½“的には,次のコマンドを実行すればよい.
2187
2188 % ruby ../configure.rb -T <ターゲット略称> -a ../test \
2189 -A <テストプログラム名> -C test_pf.cdl \
2190 -S "bit_kernel.o bit_mutex.o"
2191
2192現バージョンで用意している機能テストプログラムは次の通り.
2193
2194(1) test_cpuexc1 CPU例外処理のテスト(1)
2195(2) test_cpuexc2 CPU例外処理のテスト(2)
2196(3) test_cpuexc3 CPU例外処理のテスト(3)
2197(4) test_cpuexc4 CPU例外処理のテスト(4)
2198(5) test_cpuexc5 CPU例外処理のテスト(5)
2199(6) test_cpuexc6 CPU例外処理のテスト(6)
2200(7) test_cpuexc7 CPU例外処理のテスト(7)
2201(8) test_cpuexc8 CPU例外処理のテスト(8)
2202(9) test_cpuexc9 CPU例外処理のテスト(9)
2203(10) test_cpuexc10 CPU例外処理のテスト(10)
2204(11) test_dlynse sil_dly_nseに関するテスト
2205(12) test_flg1 イベントフラグ機能のテスト(1)
2206(13) test_dtq1 データキュー機能のテスト(1)
2207(14) test_hrt1.c fch_hrtに関するテスト(1)
2208(15) test_mutex1.c ミューテックス機能のテスト(1)
2209(16) test_mutex2.c ミューテックス機能のテスト(2)
2210(17) test_mutex3.c ミューテックス機能のテスト(3)
2211(18) test_mutex4.c ミューテックス機能のテスト(4)
2212(19) test_mutex5.c ミューテックス機能のテスト(5)
2213(20) test_mutex6.c ミューテックス機能のテスト(6)
2214(21) test_mutex7.c ミューテックス機能のテスト(7)
2215(22) test_mutex8.c ミューテックス機能のテスト(8)
2216(23) test_notify1.c 通知処理のテスト(1)
2217(24) test_raster1.c タスク終了要求機能に関するテスト(1)
2218(25) test_raster2.c タスク終了要求機能に関するテスト(2)
2219(26) test_sem1 セマフォ機能のテスト(1)
2220(27) test_sem2 セマフォ機能のテスト(2)
2221(28) test_sysman1 システム状æ…
2222‹ç®¡ç†æ©Ÿèƒ½ã®ãƒ†ã‚¹ãƒˆ(1)
2223(29) test_sysstat1 システム状æ…
2224‹ã«é–¢ã™ã‚‹ãƒ†ã‚¹ãƒˆ(1)
2225(30) test_task1 タスク管理モジュールのテスト(1)
2226(31) test_tmevt1.c タイムイベント管理モジュールのテスト(1)
2227
2228CPU例外処理のテストプログラムの一部は,CPU例外ハンドラからリターンした
2229場合に,CPU例外を発生させた命令の次から実行が継続されることを前提に作成
2230されている.この前提が成り立たない場合には,テストプログラムのターゲッ
2231ト依存定義において,PREPARE_RETURN_CPUEXCの定義で対応することが必
2232要であ
2233る.詳しくは,「ターゲット依存部 ポーティングガイド」を参ç…
2234§ã™ã‚‹ã“と.
2235
223610.4 システム時刻管理機能テストプログラム
2237
2238testディレクトリに置かれた"hrt"で始まるプログラムは,高分解能タイマを用
2239いて実現したシステム時刻管理機能に関するテストを行うためのプログラムで
2240ある.
2241
2242システム時刻管理機能テストプログラムは,テストデータに駆動されて動作す
2243るテスト用の高分解能タイマモジュールを必
2244要とする.そのため,テスト用の
2245高分解能タイマモジュールを組み込んだターゲット依存部を用いてテストを行
2246わなければならない.
2247
2248テスト用の高分解能タイマモジュールを用いたカーネルをコンパイルする際に
2249は,高分解能タイマモジュールの性質を切り換えるためのマクロ定義が必
2250要で
2251ある.å…
2252·ä½“的には,-DHRT_CONFIG1または-DHRT_CONFIG2のいずれかのコンパイ
2253ルオプションをつける必
2254要がある.どちらのコンパイルオプションを付けるべ
2255きかは,テストプログラム毎に決まっている.
2256
2257また,システム時刻管理機能テストプログラムは,機能テストプログラムと同
2258様に,テストプログラム用サービスを使用している.
2259
2260以上より,システム時刻管理機能テストプログラムをコンフィギュレーション
2261スクリプトを使用して構築する場合には,次のコマンドを実行すればよい(構
2262築用のディレクトリが,ASP3カーネルのソースファイルを展開したディレクト
2263リの直下にあると仮定している).
2264
2265 % ruby ../configure.rb -T <テスト用のターゲット略称> -a ../test \
2266 -A <テストプログラム名> -C test_pf.cdl \
2267 -O -DHRT_CONFIG<1または2>
2268
2269現バージョンで用意しているシステム時刻管理機能テストプログラムは次の通
2270り.
2271
2272(1) hrt_systim1 システム時刻管理機能のテスト(1)
2273(2) hrt_systim2 システム時刻管理機能のテスト(2)
2274(3) hrt_systim3 システム時刻管理機能のテスト(3)
2275(4) hrt_systim4 システム時刻管理機能のテスト(4)
2276
2277この内
2278,hrt_systim4は-DHRT_CONFIG2をつけて,他は-DHRT_CONFIG1をつけてコ
2279ンパイルすること.
2280
228110.5 性能評価プログラム
2282
2283testディレクトリに置かれた"perf"で始まるプログラムは,カーネルの性能評
2284価を行うためのプログラムである.
2285
2286性能評価プログラムは,計測対象となる処理を繰り返し実行し,その実行時間
2287を計測して,実行時間分布を表示する.
2288
2289計測した実行時間には,時間計測のオーバヘッド(時間計測処理の実行にかか
2290る時間)が含まれる.計測対象の処理の正味の実行時間を求めるためには,計
2291測された時間から,時間計測のオーバヘッドを計測するためのプログラム
2292(perf0)で計測された時間を減算する必
2293要がある.
2294
2295また,実行時間の計測は,別に記述がない限り割込みを許可したまま行うため,
2296割込みハンドラ(少なくとも,タイマ割込みハンドラ)の処理時間が含まれた
2297実行結果が計測される.
2298
2299カーネルの性能評価にあたっては,ハードウェア(特にキャッシュ)の設定に
2300留意する必
2301要がある.
2302
2303性能評価プログラムはテストプログラム用サービスと実行時間分布集計サービ
2304スを使用しているため,構築する場合には,コンポーネント記述ファイルに
2305perf_pf.cdlを使用する必
2306要がある.コンフィギュレーションスクリプトを使用
2307する場合には,-Cオプションでperf_pf.cdlを指定する.å…
2308·ä½“的には,次のコマ
2309ンドを実行すればよい(構築用のディレクトリが,ASP3カーネルのソースファ
2310イルを展開したディレクトリの直下にあると仮定している).
2311
2312 % ruby ../configure.rb -T <ターゲット略称> -a ../test \
2313 -A <性能評価プログラム名> -C perf_pf.cdl
2314
2315現バージョンで用意している性能評価プログラムは次の通り.
2316
2317(1) perf0 時間計測のオーバヘッドの評価
2318
2319時間計測のオーバヘッドを計測するためのプログラム.å…
2320·ä½“的には,空のプロ
2321グラム(begin_mearsureとend_measureを続けて呼び出すプログラム)の実行時
2322間を計測する.
2323
2324他の性能評価プログラムで計測された時間から,このプログラムで計測された
2325時間を減算した時間が,計測対象の処理の正味の実行時間である.
2326
2327(2) perf1 slp_tsk,wup_tskによるタスク切換え時間の評価
2328
2329slp_tsk,wup_tskによるタスク切換え時間を計測するためのプログラム.å…
2330·ä½“
2331的には,高い優å…
2332ˆåº¦ã®ã‚¿ã‚¹ã‚¯ãŒèµ·åºŠå¾…
2333ち状æ…
2334‹ã§ã‚る時に,低い優å…
2335ˆåº¦ã®ã‚¿ã‚¹ã‚¯
2336がwup_tskにより高い優å…
2337ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã‚’起床し,高い優å…
2338ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã«åˆ‡ã‚Šæ›ã‚
2339るまでの時間と,高い優å…
2340ˆåº¦ã®ã‚¿ã‚¹ã‚¯ãŒslp_tskにより起床待
2341ち状æ…
2342‹ã¨ãªã‚Šï¼Œä½Ž
2343い優å…
2344ˆåº¦ã®ã‚¿ã‚¹ã‚¯ã«åˆ‡ã‚Šæ›ã‚ã‚‹ã¾ã§ã®æ™‚間を計測する.
2345
2346(3) perf2 snd_pdqの処理時間の評価
2347
2348優å…
2349ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«è“„積されているデータの数により,snd_pdqの処理時間が
2350どのように変化するかを計測するためのプログラム.å…
2351·ä½“的には,優å…
2352ˆåº¦ãƒ‡ãƒ¼
2353タキュー中に高い優å…
2354ˆåº¦ã®ãƒ‡ãƒ¼ã‚¿ãŒn個蓄積されている時に,snd_dtqにより低
2355い優å…
2356ˆåº¦ã®ãƒ‡ãƒ¼ã‚¿ã‚’å…
2357¥ã‚Œã‚‹ã®ã«ã‹ã‹ã‚‹æ™‚間を計測する.nを0,10,20,30,40,
235850,100,200,300と変化させて計測する.
2359
2360(4) perf3 set_flgの処理時間の評価
2361
2362待
2363ち解除するタスクの数により,set_flgの処理時間がどのように変化するかを
2364計測するためのプログラム.å…
2365·ä½“的には,TA_WMUL属性のイベントフラグに対し
2366て,n個のタスクが待
2367っている時に,set_flgによりそのすべてを待
2368ち解除する
2369のにかかる時間を計測する.nを0,1,2,3,4,5,10,20と変化させて計測す
2370る.
2371
2372(5) perf4 act_tskの処理時間とタスク切換え時間の評価
2373
2374act_tskの処理時間とタスク切換え時間を計測するためのプログラム.å…
2375·ä½“的に
2376は,(1) タスクコンテキストから呼び出し,タスク切換えを起こさない
2377act_tskの処理時間,(2) タスクコンテキストから呼び出し,タスク切換えを起
2378こすact_tskの処理時間(タスク切換え時間を含む),(3) 非タスクコンテキス
2379トから呼び出し,タスク切換えを起こすact_tskの処理時間(タスク切換え時間
2380とタイマ割込み中で実行されるシステム時刻の更新処理時間を含む)の3つの時
2381間を計測する.
2382
2383(6) perf5 タイムイベント処理時間の評価
2384
2385タイムイベントヒープ操作のオーバヘッドにより,sta_alm,stp_almの処理時
2386間がどのように変化するかを計測するためのプログラム.å…
2387·ä½“的には,タイム
2388イベントヒープ中でのノードの交換回数が,ない場合,少ない場合,多い場合
2389で,sta_almとstp_almの処理時間を計測する.
2390
2391
239211.使用上の注意とヒント
2393
239411.1 実行時間と割込み禁止時間に関する注意事項
2395
2396
2397ASP3カーネルの各サービスコールは,可能な限り,最大実行時間が一定値とな
2398るように実装
2399しているが,そのように実装
2400できない状況があり,最大実行時間
2401が何らかのパラメータに依存する場合がある.またASP3カーネルでは,カーネ
2402ルの処理のほぼå…
2403¨ä½“をカーネル管理の割込みを禁止した状æ…
2404‹ï¼ˆCPUロック状æ…
2405‹ã¨
2406同等)で実行するため,そのような場合には,最大割込み禁止時間も何らかの
2407パラメータに依存することになる.
2408
2409以下では,サービスコールの実行時間および割込み禁止時間が,何らかのパラ
2410メータに依存する場合について説明する.
2411
2412(1) set_flgにより複数のタスクが待
2413ち解除される場合
2414
2415TA_WMUL属性であり,TA_CLR属性でないイベントフラグに対するset_flgにより,
2416複数のタスクが待
2417ち解除される場合がある.この場合,サービスコールの実行
2418時間およびカーネル内
2419での割込み禁止時間が,待
2420ち解除されるタスクの数の数
2421のオーダで長くなる.この実行時間の伸びを計測するために,性能評価プログ
2422ラムperf3を用意している.
2423
2424また,TA_WMUL属性のイベントフラグに対するset_flgの実行時間およびカーネ
2425ル内
2426での割込み禁止時間は,対象イベントフラグ待
2427ち状æ…
2428‹ã®ã‚¿ã‚¹ã‚¯ï¼ˆå¾…
2429ち解除
2430されないタスクも含む)の数のオーダでも長くなるが,これによる実行時間お
2431よび割込み禁止時間の変化はわずかであり,実際の影響は小さい.
2432
2433(2) ini_yyyにより複数のタスクが待
2434ち解除される場合
2435
2436対象オブジェクト待
2437ち状æ…
2438‹ã®ã‚¿ã‚¹ã‚¯ãŒè¤‡æ•°ã‚ると,ini_yyyにより,複数のタス
2439クが待
2440ち解除される.この場合,サービスコールの実行時間およびカーネル内
2441
2442での割込み禁止時間が,待
2443ち解除されるタスクの数のオーダで長くなる.
2444
2445(3) タスク優å…
2446ˆåº¦é †ã®å¾…
2447ち行列にタスクが挿å…
2448¥ã•ã‚Œã‚‹å ´åˆ
2449
2450待
2451ち行列がタスクの優å…
2452ˆåº¦é †ã«ãªã£ã¦ã„る同期・通信オブジェクトに対して,
2453タスクが待
2454ち状æ…
2455‹ã«ãªã‚‹å ´åˆï¼Œã‚µãƒ¼ãƒ“スコールの実行時間およびカーネル内
2456で
2457の割込み禁止時間が,すでに待
2458っているタスク(の中で新たに待
2459ち状æ…
2460‹ã«ãªã‚‹
2461タスクより優å…
2462ˆåº¦ãŒé«˜ã„か同じもの)の数のオーダで長くなる.ただし,これ
2463による実行時間および割込み禁止時間の変化はわずかであり,実際の影響は小
2464さい.
2465
2466(4) 優å…
2467ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«ãƒ‡ãƒ¼ã‚¿ã‚’送信する場合
2468
2469優å…
2470ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ã«å¯¾ã—てデータを送信する場合,サービスコールの実行時
2471間およびカーネル内
2472での割込み禁止時間が,すでに優å…
2473ˆåº¦ãƒ‡ãƒ¼ã‚¿ã‚­ãƒ¥ãƒ¼ç®¡ç†é ˜
2474域に格納されているデータ(の中で新たに送信されたデータより優å…
2475ˆåº¦ãŒé«˜ã„
2476か同じもの)の数のオーダで長くなる.ただし,これによる実行時間および割
2477込み禁止時間の変化はわずかであり,実際の影響は小さい.
2478
2479(5) タイムイベント処理時間
2480
2481タイムイベントを登録または登録解除する場合,サービスコールの実行時間お
2482よびカーネル内
2483での割込み禁止時間が,すでに登録されているタイムイベント
2484の対数オーダで長くなる.また,高分解能タイマ割込みの実行時間およびその
2485中での割込み禁止時間も,同様に長くなる.ただし,時間の伸びが対数オーダ
2486であることから,実際の影響は限られている.この実行時間の伸びを計測する
2487ために,性能評価プログラムperf5を用意している.
2488
248911.2 assertマクロの処理
2490
2491ASP3カーネルのコード中には,assertマクロが使われている.assertマクロの
2492定義はt_stddef.hに含まれ,assertが失敗した場合の最後の処理(通常は,プ
2493ログラムを停止させる処理)は,ターゲット依存部のTOPPERS_assert_abortで
2494決定される.
2495
2496assertが失敗した場合,システム開発中はデバッガに落とすのが望ましいが,
2497システム稼働時の対処法は,システムに対する要件に依存する.そこで,ター
2498ゲット依存部のTOPPERS_assert_abortを,システム要件に合致した適切な処理
2499に置き換える必
2500要がある.システム要件によっては,NDEBUGを定義してassert
2501マクロの処理をオブジェクトコード中から消す(「6.2 コンパイルオプション」
2502の節を参ç…
2503§ï¼‰æ–¹æ³•ã‚‚考えられる.
2504
250511.3 システムログ機能の扱い
2506
2507ASP3カーネルでは,システム開発時の利便性を考æ…
2508®ã—,システムログ機能を組
2509み込む設定をデフォルトとしている.
2510
2511それに対して,ASP3カーネルを用いたシステムを機器に組み込む場合は,シス
2512テムログ機能が意味がない場合も多い.機器への組込みに際してのシステムロ
2513グ機能の設定方法には,以下の方法が考えられる.
2514
2515(1) システムログ機能を用いない
2516
2517システムログ機能を一切使用しない場合には,システムログ機能をシステムに
2518組み込まず,システムログ機能のサービスコールを呼び出すソースファイルを
2519TOPPERS_OMIT_SYSLOGを定義してコンパイルすればよい.詳しくは,「8.1.8 シ
2520ステムログ機能の組込みと取外し」の節を参ç…
2521§ã™ã‚‹ã“と.
2522
2523(2) ログ情
2524報の蓄積のみを行う
2525
2526機器に組み込んだ状æ…
2527‹ã§ï¼Œã‚·ãƒªã‚¢ãƒ«ãƒãƒ¼ãƒˆç­‰ã‚’介してシステムを外部と接続す
2528ることができる場合には,システム稼働時にはログ情
2529報の蓄積のみを行い,シ
2530ステムに障害が起きた時などにログ情
2531報を取り出すことで,障害の原因分析の
2532助けとすることができる.
2533
2534å…
2535·ä½“的な設定方法として,次の2つの方法が考えられる.
2536
2537(2-1) 低レベル出力をメモリに蓄積する
2538
2539必
2540要なログ情
2541報を低レベル出力機能を用いて出力するように設定し,低レベル
2542の文字出力関数に送られた文字をメモリ(å…
2543¸åž‹çš„にはリングバッファ)に蓄積
2544するようにする.システムの障害時には,そのメモリ領域を読み出す.ターゲッ
2545ト依存部の低レベル出力の変更が必
2546要である.
2547
2548(2-2) システムログ機能のログバッファに蓄積する
2549
2550必
2551要なログ情
2552報をシステムログ機能のログバッファに記録するように設定する.
2553システムログタスクを動作させないと,ログ情
2554報はログバッファに蓄積されて
2555いく.システムの障害時には,ログバッファの領域を読み出すか,システムロ
2556グタスクを動作させてログ情
2557報を出力させる.
2558
2559(3) 開発時の設定のままとする
2560
2561システムログ機能の設定を,システム開発時のまま変更せず,シリアルポート
2562等にログ情
2563報を垂れ流す方法も考えられる.
2564
256511.4 オブジェクトIDの管理
2566
2567ASP3カーネルでは,オブジェクトのID番号を,コンフィギュレータが割り付け
2568る方法が基本となっている.
2569
2570アプリケーションプログラム中でオブジェクトのID番号を参ç…
2571§ã™ã‚‹å ´åˆã«ã¯ï¼Œ
2572次の2つの方法が考えられる.
2573
2574(1) オブジェクト識別名を用いる
2575
2576オブジェクト生成のための静的API(CRE_YYY)の第1パラメータに記述したオブ
2577ジェクト識別名を,アプリケーションプログラム中でも用いる方法.
2578
2579コンフィギュレータは,オブジェクト識別名を,割り付けたID番号にマクロ定
2580義するC言語プリプロセッサのディレクティブ(#define)をkernel_cfg.hに生
2581成するため,アプリケーションプログラムからkernel_cfg.hをインクルードす
2582る必
2583要がある.
2584
2585この方法は,オブジェクトコード中にID番号が直接埋め込まれるために実行効
2586率が良い一方で,システムコンフィギュレーションファイルが変更されて
2587kernel_cfg.hが書き換わる度に,アプリケーションプログラムの再コンパイル
2588が必
2589要になるという欠点がある.そのため,アプリケーションプログラムを構
2590成するファイルの中で,一部のファイルのみでオブジェクト識別名を参ç…
2591§ã™ã‚‹
2592構成にするといった工夫をすることが望ましい.
2593
2594(2) オブジェクトのID番号を保持する変数を用いる
2595
2596オブジェクトのID番号を保持するconst属性を付加した変数を用意し,アプリケー
2597ションプログラム中では,その変数を用いる方法.
2598
2599例えば,TASK1というオブジェクト識別名のタスクに対して,次のような変数を
2600用意する.
2601
2602const ID TASK1_id = TASK1;
2603
2604アプリケーションプログラム中では,この変数(TASK1_id)を用いることで,
2605システムコンフィギュレーションファイルが変更されてkernel_cfg.hが書き換
2606わった時にも,上記の変数定義を含んだファイルのみを再コンパイルすればよ
2607いことになる.
2608
2609この方法は,アプリケーションプログラムの再コンパイルを最小限にできる利
2610点がある一方で,変数のためのメモリ領域が必
2611要になることに加えて,(プロ
2612セッサによっては)変数アクセスのためのオーバヘッドが生じるという欠点が
2613ある.また,定数ではなく変数であることから,他の変数の初期化には使えな
2614いという制限がある.
2615
2616なお,ASP3カーネルのコンフィギュレータは,コンパイルオプションに
2617-DUSE_EXTERNAL_IDを指定することにより,上記の変数定義をkernel_cfg.c中に
2618生成する機能を持っているので,すべてのオブジェクトIDをこの方法で参ç…
2619§ã™
2620る場合には,この機能を用いることを推奨する.
2621
2622コンフィギュレータによるID番号割付けのもう1つの課題として,システムコン
2623フィギュレーションファイルの修正により,オブジェクトIDの割付けが変わっ
2624てしまうことが挙げられる.これは,アプリケーションソフトウェアの設計仕
2625様書にID番号が記載されている場合や,デバッグ作業においてID番号を直接扱っ
2626ている場合に,作業効率を低下させる可能性が考えられる.
2627
2628この問題に対応するために,ASP3カーネルのコンフィギュレータに,ID番号の
2629割付け結果をファイルに書き出す機能(--id-output-fileオプション)と,ID
2630番号の割付けをファイルから取り込む機能(--id-input-fileオプション)を用
2631意している.これらの機能を用いて,コンフィギュレータを実行する度に,前
2632回に実行した時にファイルに書き出したID番号の割付けを取り込むことで,前
2633回実行時と同じ割付けを行うことができる.ただし,ASP3カーネルでは,ID番
2634号に抜けがあるのは許されないため,オブジェクトの数が減った場合には(ID
2635番号が大きい方のオブジェクトが減った場合を除いて)エラーとなる.この場
2636合には,ダミーのオブジェクトを生成する方法で回避するしかない.
2637
263811.5 カーネルの内
2639部シンボルのリネーム
2640
2641ASP3カーネルでは,モジュール内
2642部の名称が他のモジュール内
2643部の名称と衝突
2644することを避けるために,カーネルの内
2645部シンボルは,C言語レベルで,å…
2646ˆé ­ãŒ
2647"_kernel_"または"_KERNEL_"である名称としている.
2648
2649これをソースコードの可読性と両立させるために,ASP3カーネルでは,ソース
2650コードは自然な名前を用いて記述し,C言語プリプロセッサのマクロ定義
2651(#define)を用いて,それを"_kernel_"または"_KERNEL_"で始まる名前(自然
2652な名前がyyyの場合には,_kernel_yyy)にリネームする仕組みを用いている.
2653
2654å…
2655·ä½“的には,関連するディレクトリにxxx_rename.defを置き,そこからリネー
2656ムのためのヘッダファイル(xxx_rename.hおよびxxx_unrename.h)を生成する
2657ツール(utils/genrename.rb)を用意している.
2658
2659この仕組みは,ソースコードの可読性向上に役立つ一方で,弊害もある.例え
2660ば,多くのデバッガで,ソースコード中の名称とオブジェクトコード中の名称
2661が異なるために,ソースコード中の変数名を指定して値を読んだり,関数名を
2662指定してブレークポイントを置くといったことができない.
2663
2664この状況に対応するために,ASP3カーネルでは,ソースコード中の該当する名
2665称をリネームするためのユーティリティ(utils/applyrename.rb)を用意して
2666いる.このユーティリティに,リネーム定義ファイル(xxx_rename.def)のプ
2667リフィックス(xxxの部分)と,リネームしたいファイルリストを与えると,リ
2668ネーム処理を行なう.例えば,kernelディレクトリのすべてのファイルに対し
2669て,カーネルの内
2670部シンボルをリネームするには,次のコマンドを実行すれば
2671よい.
2672
2673 % cd kernel
2674 % ruby ../utils/applyrename.rb kernel *
2675
2676また,ターゲット依存部のディレクトリのすべてのファイルに対して,カーネ
2677ルの内
2678部シンボルをリネームするには,次のようなコマンドを実行すればよい.
2679
2680 % cd target/ct11mpcore_gcc/
2681 % ruby ../../utils/applyrename.rb target *
2682 % ruby ../../utils/applyrename.rb ../../kernel/kernel *
2683
268411.6 トレースログ記録のサンプルコードの使用方法
2685
2686トレースログ記録のサンプルコードがターゲット依存部に組み込まれている場
2687合には,コンフィギュレーションスクリプトにそれを使用することを指示する
2688オプション(-r)を付加し,コンポーネント記述ファイルに以下の記述を含め
2689ることで,メモリ上にトレースログを記録する機能が有効になる.
2690
2691----------------------------------------
2692/*
2693 * トレースログ機能の組上げ記述
2694 */
2695import("arch/tracelog/tTraceLog.cdl");
2696
2697cell tTraceLog TraceLog {
2698 logBufferSize = 1024; /* ログバッファのサイズ */
2699 initialMode = C_EXP("TRACE_RINGBUF");
2700
2701 /* 低レベル出力との結合 */
2702 cPutLog = PutLogTarget.ePutLog;
2703};
2704----------------------------------------
2705
2706この記述を変更することで,トレースログ機能のログバッファのサイズを変更
2707することができる.
2708
2709initialModeをTRACE_RINGBUFにすることで,システム起動時にトレースログの
2710記録を開始する.ここに指定できる動作モードは,以下のいずれかである.
2711
2712 TRACE_STOP トレース停止
2713 TRACE_RINGBUF リングバッファモード
2714 TRACE_AUTOSTOP 自動停止モード
2715
2716また,システム終了時に,記録したトレースログをダンプするためには,コン
2717ポーネント記述ファイル次の記述を追加する(トレースログを別の方法で取り
2718出す場合には,この記述は不要).
2719
2720----------------------------------------
2721cell tTerminateRoutine TraceLogTerminate {
2722 cTerminateRoutineBody = TraceLog.eDump;
2723};
2724----------------------------------------
2725
2726この方法では,トレースログのダンプを終了処理ルーチンで行ってているため,
2727終了処理ルーチンを呼び出した後のトレースログは出力されない.終了処理ルー
2728チンを呼び出した後に実行される処理でトレースログ記録の機能を利用するた
2729めには,トレースログのダンプを適切な場所で行うように修正することが必
2730要
2731である.
2732
273311.7 システムの起動時の初期化処理
2734
2735システムの起動時にアプリケーションで必
2736要となる初期化処理を行うための機
2737能として初期化ルーチンが用意されているが,初期化ルーチンが実行されるよ
2738りも早いタイミングで実行することが必
2739要な初期化処理がある場合がある.
2740
2741このような場合に用いるために,標準的なスタートアップモジュールから,ター
2742ゲットシステム依存の初期化フック(hardware_init_hook)を呼び出すことと
2743している.hardware_init_hookは,カーネルのターゲット依存部で用意されて
2744いるのが標準であるが,これをアプリケーションで用意したものに置き換え,
2745その中でアプリケーションで必
2746要となる初期化処理を行うことができる.
2747
2748ただし,hardware_init_hookの作成する場合には,bssセクションとdataセクショ
2749ンが初期化されていないことや,ライブラリが初期化されていないこと,C言語
2750で記述できるとは限らないことなどに注意が必
2751要である.作成にあたっては,
2752「ターゲット依存部 ポーティングガイド」を参ç…
2753§ã™ã‚‹ã“と.
2754
2755カーネルのスタートアップモジュールがhardware_init_hookを呼び出すように
2756実装
2757されていない場合には,スタートアップモジュールをアプリケーションで
2758用意したものに置き換える方法を推奨する.
2759
276011.8 rodataセクションをRAMに置く場合
2761
2762何らかの理由でrodataセクションをRAMに置く場合,dataセクションと同様に,
2763その初期値はROMに置き,スタートアップモジュールでRAMにコピーするのが素
2764直である.これを実現するには,dataセクションの取扱いを参考に,リンカス
2765クリプトとスタートアップモジュールを修正する必
2766要があるが,それに加えて,
2767以下の措置が必
2768要である.
2769
2770コンフィギュレータは,パス1とパス3において,ロードモジュールのシンボル
2771ファイルを用いて,ロードモジュール内
2772のrodataセクションを読み込むことで,
2773各種の定数値を取得する.そのため,rodataセクションをdataセクションと同
2774様に扱うと,そのアクセスアドレス(RAM内
2775のアドレス,VMAと呼ぶ)とé…
2776ç½®ã‚¢
2777ドレス(ROM内
2778のアドレス,LMAと呼ぶ)が一致しなくなるために,定数値を取
2779得することができず,エラーとなる.
2780
2781パス1でのエラーを回避するためには,パス1のリンク時(cfg1_outをリンクす
2782る時)には,rodataセクションのアクセスアドレスとé…
2783ç½®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’一致させ
2784るリンカスクリプト(標準のリンカスクリプトはこのようになっている)を用
2785いる.標準のMakefileでは,LDSCRIPTによりリンカスクリプトを指定するので
2786はなく,LDFLAGSとCFG1_OUT_LDFLAGSに異なるリンカスクリプトを用いるオプショ
2787ンを設定すればよい.
2788
2789パス3でのエラーを回避するためには,コンフィギュレータのパス3の生成スク
2790リプトにおいて,rodataセクションの内
2791容を,é…
2792ç½®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‹ã‚‰ã‚¢ã‚¯ã‚»ã‚¹ã‚¢ãƒ‰
2793レスにコピーする.そのためには,パス3の生成スクリプトのターゲット依存部
2794で,$lmaListを設定すればよい.å…
2795·ä½“的な方法は,「ターゲット依存部 ポーティ
2796ングガイド」を参ç…
2797§ã™ã‚‹ã“と.
2798
2799
280012.参考情
2801å ±
2802
280312.1 利用条件と利用報告
2804
2805ASP3カーネルの利用条件は,各ファイルのå…
2806ˆé ­ã«è¡¨ç¤ºã•ã‚Œã¦ã„る.著作権は,
2807各ファイルのå…
2808ˆé ­ã«è¡¨ç¤ºã•ã‚Œã¦ã„る著作権者
2809が保有している.
2810
2811利用条件の(3)の(b)において,利用の形æ…
2812‹ã‚’TOPPERSプロジェクトに報告する方
2813法としては,ASP3カーネルを利用した製品の名称と応用分野,製品化した会社
2814名と業種等の情
2815報を,以下のURLのページから報告するものとする.
2816
2817 http://www.toppers.jp/report.html
2818
2819またその際に,ASP3カーネルを使用してのコメントやご意見もいただけると幸
2820いである.
2821
282212.2 保証・適用性・サポート
2823
2824ASP3カーネルは無保証で提供されているものである.開発者
2825およびTOPPERSプロ
2826ジェクトは,ASP3カーネルに関して,特定の使用目的に対する適合性も含めて,
2827いかなる保証も行わない.また,ASP3カーネルの利用により直接的または間接
2828的に生じたいかなる損害に関しても,その責任を負わない.
2829
2830開発者
2831およびTOPPERSプロジェクトは,ASP3カーネルに関するサポートの約束は
2832していない.ASP3カーネルに関して質問がある場合は,後述のTOPPERSユーザー
2833ズメーリングリストを利用していただけると幸いである.確実なサポートが必
2834
2835要な場合には,有償でサポートサービスを提供している会社に相談されたい.
2836
283712.3 バグレポート
2838
2839ASP3カーネルにバグや問題点を発見された場合には,後述のTOPPERSユーザーズ
2840メーリングリストに報告して欲しい.
2841
2842メーリングリストにバグや問題点などを報告する場合には,必
2843要に応じて次の
2844情
2845報を知らせて欲しい.
2846
2847 使用しているカーネルに関する情
2848å ±
2849 ・ターゲット非依存部のバージョン
2850 ・使用しているターゲット依存部とそのバージョン
2851 ・TOPPERSプロジェクトからのリリースに対する改造箇所(あれば)
2852
2853 ターゲットシステムに関する情
2854å ±
2855 ・ターゲットプロセッサの種類
2856 ・ターゲットボード等の種類
2857
2858 ホストに関する情
2859å ±
2860 ・OSのバージョン(サービスパックの適用状況も)
2861 ・コンパイラなどの開発環境のバージョン(Cygwinのバージョンも)
2862
286312.4 ウェブサイト
2864
2865TOPPERSプロジェクトのウェブサイトは,以下のURLにある.
2866
2867 http://www.toppers.jp/
2868
2869TOPPERSプロジェクトやASP3カーネルに関する最新情
2870報は,このウェブサイトか
2871ら得ることができる.また,ASP3カーネルの最新版は,このウェブサイトから
2872ダウンロードすることができる.
2873
287412.5 TOPPERSユーザーズメーリングリスト
2875
2876ASP3カーネルを含むTOPPERSプロジェクトの開発成果物のユーザに対する情
2877報提
2878供およびユーザ相互間の情
2879報交換を容易にするために,TOPPERSユーザーズメー
2880リングリスト(users@toppers.jp)を用意している.
2881
2882このメーリングリストには,誰でも自由に登録し,メールを送付することがで
2883きる(登録者
2884以外はメールを送付できない).また,送付されたメールは,誰
2885でも自由にウェブサイトで読むことができる.
2886
2887メーリングリストへの登録方法については,以下のURLのページに説明がある.
2888
2889 http://www.toppers.jp/community.html
2890
289112.6 TOPPERSプロジェクトのメンバ向けのサービス
2892
2893TOPPERSプロジェクトのメンバに対しては,上記に加えて,ASP3カーネルに関連
2894して次のサービスを用意している.
2895
2896(1) TOPPERS開発者
2897メーリングリスト
2898
2899TOPPERSプロジェクトのメンバは,ASP3カーネルに関する質問,バグや問題点な
2900どの報告に,TOPPERS開発者
2901メーリングリスト(dev@toppers.jp)を利用するこ
2902とができる.
2903
2904(2) ASP3カーネルの開発支援サイト
2905
2906ASP3カーネルの開発支援のためのTRAC(バグトラッキングシステム)が,以下
2907のURLにある(TRACへのアクセスには,会員パスワードが必
2908要である).
2909
2910 http://dev.toppers.jp/trac/asp3/
2911
2912TOPPERSプロジェクトのメンバは,このサイトから,ウェブインタフェースおよ
2913びsubversionサーバにより,ASP3カーネルの開発中のバージョンを得ることが
2914できる.また,バグトラッキングデータベースにアクセスすることができ,過
2915去のバグ履歴へのアクセスや,バグの登録をすることができる.
2916
291712.7 TOPPERSプロジェクトへの参加
2918
2919TOPPERSプロジェクトでは,何からの形でプロジェクトに貢献していただける方,
2920プロジェクトで開発したソフトウェアをお使いの方,プロジェクトに興味をお
2921持ちの方の参加を求めている.TOPPERSプロジェクトへの参加方法については,
2922以下のページに説明がある.
2923
2924 http://www.toppers.jp/joinus.html
2925
2926
292713.リファレンス
2928
292913.1 サービスコール一覧
2930
2931(1) タスク管理機能
2932
2933 ER ercd = act_tsk(ID tskid)
2934 ER_UINT actcnt = can_act(ID tskid)
2935 ER ercd = get_tst(ID tskid, STAT *p_tskstat)
2936 ER ercd = chg_pri(ID tskid, PRI tskpri)
2937 ER ercd = get_pri(ID tskid, PRI *p_tskpri)
2938 ER ercd = get_inf(intptr_t *p_exinf)
2939 ER ercd = ref_tsk(ID tskid, T_RTSK *pk_rtsk)
2940
2941(2) タスク付属同期機能
2942
2943 ER ercd = slp_tsk(void)
2944 ER ercd = tslp_tsk(TMO tmout)
2945 ER ercd = wup_tsk(ID tskid)
2946 ER_UINT wupcnt = can_wup(ID tskid)
2947 ER ercd = rel_wai(ID tskid)
2948 ER ercd = sus_tsk(ID tskid)
2949 ER ercd = rsm_tsk(ID tskid)
2950 ER ercd = dly_tsk(RELTIM dlytim)
2951
2952(3) タスク終了機能
2953
2954 ER ercd = ext_tsk(void)
2955 ER ercd = ras_ter(ID tskid)
2956 ER ercd = dis_ter(void)
2957 ER ercd = ena_ter(void)
2958 bool_t state = sns_ter(void)
2959 ER ercd = ter_tsk(ID tskid)
2960
2961(4) 同期・通信機能
2962
2963 ER ercd = sig_sem(ID semid)
2964 ER ercd = wai_sem(ID semid)
2965 ER ercd = pol_sem(ID semid)
2966 ER ercd = twai_sem(ID semid, TMO tmout)
2967 ER ercd = ini_sem(ID semid)
2968 ER ercd = ref_sem(ID semid, T_RSEM *pk_rsem)
2969
2970 ER ercd = set_flg(ID flgid, FLGPTN setptn)
2971 ER ercd = clr_flg(ID flgid, FLGPTN clrptn)
2972 ER ercd = wai_flg(ID flgid, FLGPTN waiptn,
2973 MODE wfmode, FLGPTN *p_flgptn)
2974 ER ercd = pol_flg(ID flgid, FLGPTN waiptn,
2975 MODE wfmode, FLGPTN *p_flgptn)
2976 ER ercd = twai_flg(ID flgid, FLGPTN waiptn,
2977 MODE wfmode, FLGPTN *p_flgptn, TMO tmout)
2978 ER ercd = ini_flg(ID flgid)
2979 ER ercd = ref_flg(ID flgid, T_RFLG *pk_rflg)
2980
2981 ER ercd = snd_dtq(ID dtqid, intptr_t data)
2982 ER ercd = psnd_dtq(ID dtqid, intptr_t data)
2983 ER ercd = tsnd_dtq(ID dtqid, intptr_t data, TMO tmout)
2984 ER ercd = fsnd_dtq(ID dtqid, intptr_t data)
2985 ER ercd = rcv_dtq(ID dtqid, intptr_t *p_data)
2986 ER ercd = prcv_dtq(ID dtqid, intptr_t *p_data)
2987 ER ercd = trcv_dtq(ID dtqid, intptr_t *p_data, TMO tmout)
2988 ER ercd = ini_dtq(ID dtqid)
2989 ER ercd = ref_dtq(ID dtqid, T_RDTQ *pk_rdtq)
2990
2991 ER ercd = snd_pdq(ID pdqid, intptr_t data, PRI datapri)
2992 ER ercd = psnd_pdq(ID pdqid, intptr_t data, PRI datapri)
2993 ER ercd = tsnd_pdq(ID pdqid, intptr_t data, PRI datapri, TMO tmout)
2994 ER ercd = rcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
2995 ER ercd = prcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri)
2996 ER ercd = trcv_pdq(ID pdqid, intptr_t *p_data, PRI *p_datapri, TMO tmout)
2997 ER ercd = ini_pdq(ID pdqid)
2998 ER ercd = ref_pdq(ID pdqid, T_RPDQ *pk_rpdq)
2999
3000 ER ercd = loc_mtx(ID mtxid)
3001 ER ercd = ploc_mtx(ID mtxid)
3002 ER ercd = tloc_mtx(ID mtxid, TMO tmout)
3003 ER ercd = unl_mtx(ID mtxid)
3004 ER ercd = ini_mtx(ID mtxid)
3005 ER ercd = ref_mtx(ID mtxid, T_RMTX *pk_rmtx)
3006
3007(5) メモリプール管理機能
3008
3009 ER ercd = get_mpf(ID mpfid, void **p_blk)
3010 ER ercd = pget_mpf(ID mpfid, void **p_blk)
3011 ER ercd = tget_mpf(ID mpfid, void **p_blk, TMO tmout)
3012 ER ercd = rel_mpf(ID mpfid, void *blk)
3013 ER ercd = ini_mpf(ID mpfid)
3014 ER ercd = ref_mpf(ID mpfid, T_RMPF *pk_rmpf)
3015
3016(6) 時間管理機能
3017
3018 ER ercd = set_tim(SYSTIM systim)
3019 ER ercd = get_tim(SYSTIM *p_systim)
3020 ER ercd = adj_tim(int32_t adjtim)
3021 HRTCNT hrtcnt = fch_hrt(void)
3022
3023 ER ercd = sta_cyc(ID cycid)
3024 ER ercd = stp_cyc(ID cycid)
3025 ER ercd = ref_cyc(ID cycid, T_RCYC *pk_rcyc)
3026
3027 ER ercd = sta_alm(ID almid, RELTIM almtim)
3028 ER ercd = stp_alm(ID almid)
3029 ER ercd = ref_alm(ID almid, T_RALM *pk_ralm)
3030
3031(7) システム状æ…
3032‹ç®¡ç†æ©Ÿèƒ½
3033
3034 ER ercd = rot_rdq(PRI tskpri)
3035 ER ercd = get_tid(ID *p_tskid)
3036 ER ercd = get_lod(PRI tskpri, uint_t *p_load)
3037 ER ercd = get_nth(PRI tskpri, uint_t nth, ID *p_tskid)
3038 ER ercd = loc_cpu(void)
3039 ER ercd = unl_cpu(void)
3040 ER ercd = dis_dsp(void)
3041 ER ercd = ena_dsp(void)
3042 bool_t state = sns_ctx(void)
3043 bool_t state = sns_loc(void)
3044 bool_t state = sns_dsp(void)
3045 bool_t state = sns_dpn(void)
3046 bool_t state = sns_ker(void)
3047 ER ercd = ext_ker(void)
3048
3049(8) 割込み管理機能
3050
3051 ER ercd = dis_int(INTNO intno)
3052 ER ercd = ena_int(INTNO intno)
3053 ER ercd = chg_ipm(PRI intpri)
3054 ER ercd = get_ipm(PRI *p_intpri)
3055
3056(9) CPU例外管理機能
3057
3058 bool_t stat = xsns_dpn(void *p_excinf)
3059
306013.2 静的API一覧
3061
3062(1) タスク管理機能
3063
3064 CRE_TSK(ID tskid, { ATR tskatr, intptr_t exinf, TASK task,
3065 PRI itskpri, size_t stksz, STK_T *stk })
3066
3067(4) 同期・通信機能
3068
3069 CRE_SEM(ID semid, { ATR sematr, uint_t isemcnt, uint_t maxsem })
3070 CRE_FLG(ID flgid, { ATR flgatr, FLGPTN iflgptn })
3071 CRE_DTQ(ID dtqid, { ATR dtqatr, uint_t dtqcnt, void *dtqmb })
3072 CRE_PDQ(ID pdqid, { ATR pdqatr, uint_t pdqcnt, PRI maxdpri, void *pdqmb })
3073 CRE_MTX(ID mtxid, { ATR mtxatr, PRI ceilpri })
3074
3075(5) メモリプール管理機能
3076
3077 CRE_MPF(ID mpfid, { ATR mpfatr, uint_t blkcnt, uint_t blksz,
3078 MPF_T *mpf, void *mpfmb })
3079
3080(6) 時間管理機能
3081
3082 CRE_CYC(ID cycid, { ATR cycatr, <通知方法の指定>,
3083 RELTIM cyctim, RELTIM cycphs })
3084 CRE_ALM(ID almid, { ATR almatr, <通知方法の指定> })
3085
3086(8) 割込み管理機能
3087
3088 CFG_INT(INTNO intno, { ATR intatr, PRI intpri })
3089 CRE_ISR(ID isrid, { ATR isratr, intptr_t exinf,
3090 INTNO intno, ISR isr, PRI isrpri })
3091 DEF_INH(INHNO inhno, { ATR inhatr, INTHDR inthdr })
3092
3093(9) CPU例外管理機能
3094
3095 DEF_EXC(EXCNO excno, { ATR excatr, EXCHDR exchdr })
3096
3097(10) システム構成管理機能
3098
3099 DEF_ICS({ size_t istksz, STK_T *istk })
3100 ATT_INI({ ATR iniatr, intptr_t exinf, INIRTN inirtn })
3101 ATT_TER({ ATR teratr, intptr_t exinf, TERRTN terrtn })
3102
310313.3 バージョン履歴
3104
3105 2014年11月24日 Release 3.A.0 最初の早期リリース(α版)
3106 2015年8月5日 Release 3.B.0
3107 2016å¹´2月8日 Release 3.0.0 最初の一般å…
3108¬é–‹
3109 2016年2月14日 Release 3.0.1
3110 2016年5月15日 Release 3.1.0
3111
3112以上
Note: See TracBrowser for help on using the repository browser.