EMPRESS Embedded Real Time Tool Kit
目次
2. Design Goal.
5. What Can You Store in an ADT.
7. General Operation of the API on ADT.
8. Array.
10. Queue.
11. Stack.
12. Table.
13. Variable.
14. How to deal with data and ADTs.
15. Special Attributes in General.
16. Record Numbe.
17. Timestamp.
18. Key.
19. Serial Number.
20. Example1.
21. Example2.
ERTツールキットは組込み、リアルタイム環境でEMPRESSを利用
するための開発環境です。(オプション製品)
提供形態:ソースコード。
使用方法:Real Time Linux、QNXにてコンパイルして使用。
ERTツールキットはEMPRESSを組込みや、リアルタイムOSで扱うための
拡張機能として追加されました。
ERTツールキットの設計は特別な需要の為に最適化されました。
| ・早い処理能力 |
| ・高い整合性 |
| ・重要な操作の最大応答時間を計算できる |
| ・ノンストップ稼動でのレスポンスの低下が無いこと |
| ・信頼性・安全性のある操作 |
| ・他の部品の不具合に影響されない強固さ |
| ・柔軟さ |
ERTツールキットの可能な領域。
| ・データの収集、管理、解析プロセスの制御 |
| ・履歴データの管理、解析 |
| ・エラーデータの保存、解析 |
| ・定義データの管理 |
| ・拘束されない同期プロセス |
| ・システムのテスト、プロトタイプ |
ERTツールキットは、開発者に対し階層データを保存するためにオブジェクト、
コンテナを作成する事を許します。
オブジェクト、コンテナ、抽象的データタイプ(ADT)はERTツールキットでは
Cの関数で操作できます。
オブジェクトやそれらのデータはEMPRESSのデータベーステーブルに保存されます。
EMPRESSデータベーステーブルは、共有メモリ(一時的データ)または
ハードディスク(継続データ)に保存されます。
アプリケーションは、ERTツールキットの特別なライブラリとユーティリティによって、
オブジェクトとの対話型問い合わせを行います。
EMPRESSデータベーステーブルは、一般的なインタフェースによりODBC、 JDBC、
HTML、Perl、Tcl/Tkなどからアクセスできます。
ERTツールキットは以下の抽象的データイプ(Abstract Data Type)をサポート
します。
| ・Array |
| ・Circular Buffer |
| ・Queue(FIFO) |
| ・Stack(LIFO) |
| ・Table |
| ・Variable |
5) What Can You Store in an ADT.
全てのADTは、基本的なデータタイプのEMPRESSのデータ型またはCのデータ型
に保存できます。
また、複数の基本的なデータ型の複雑な構造体などはEMPRESSのBULKデータ型に
保存できます。
すべてのデータ要素はEMPRESSテーブルのレコードに保存できます。
方法は以下の2つがあります。
1. 各々の値は、基本データ型に該当する個別のフィールドに保存できます。
このケースではノーマルフィールドを持つレコードは、データベースの基本
インタフェースによって検索されます。
よってODBC経由でMS ACCESSなどから検索できます。
2. 単一つのバイナリデータに保存できます。基本インタフェースにより
読込むことはできますが、データの内部構造を知らないと加工できません。
この方法には以下の利点があります。
・値を加工する必要が無ければ、より良い性能が得られます。
・悪影響を最小限にできる。
7) General Operation of the API on ADT.
ERTツールキットでは、各ADTに対し以下の標準操作を提供します。
| API | 概要 |
| Create | 新規オブジェクトの作成 |
| Delete | 既存オブジェクトの削除 |
| Attach | オブジェクトのオープン |
| Connect | オブジェクトへの接続 |
| Detach | オブジェクトのクローズ |
| Disconnect | オブジェクトへの接続を切断 |
| Purge | マークした前エントリを削除 |
| Entries | 有効なエントリ数 |
| MaxEntries | 最大エントリ数 |
| ReadOkay | エントリが0以上あればTRUEを返す |
| WriteOkay | エントリが最大エントリ数より小さければTRUEを返す |
指定された数のデータを持ちます。
各データには0から(n-1)のインデックスでアクセスできます。
以下に標準操作以外のArrayに対する可能な操作を示します。
| API | 概要 |
| WriteArray | 指定位置のデータを上書する |
| ReadArray | 指定位置のデータを読込み"invalid"設定する |
| Del | 指定位置にNULL値をセットする |
| DelKey | 与えられたキーにNULL値をセットする |
| Peek | 指定位置のデータを読込む |
指定された数のバッファを持ちます。データが無い場合、最初の書込みは最初の位置
に行われ2番目の書込みは2番目のバッファに行われます。
最大値n番目のバッファまで書込み済の時に、書込みが行われると最も古いバッファ
(0番目)が上書きされます。
以下に標準操作以外のCircular Bufferに対する可能な操作を示します。
| API | 概要 |
| Write | バッファに書込みます |
| Read | 最も古いデータを読込み"read"設定します |
| First | 最も古いデータの読込み位置を取得する |
| Last | 最も新しいデータの読込み位置を取得する |
| Next | 読込み位置を後方(新しいデータ)に移動する |
| Prev | 読込み位置を前方(古いデータ)に移動する |
| PeekLast | 古いデータを読込む |
| Peek | 現在の位置のデータを読込む |
QueueはFIFO(First-In-First-Out)バッファを扱います。
このデータ型は複数のデータ要素で構成されます。書込み操作はデータの最後尾に
書込みます。最大数まで書込まれている状態では、データの読込み操作が行われる
まで書込み操作はできません。
一般的な読込み操作は最も古いデータ要素を削除し"read"設定します。
Queueに何も無い場合、読込み操作はできません。
開発者は操作の結果を判断し、以下のような場合にアプリケーションの動作を実装
しなければなりません。
| ・操作がエラーになった場合 |
| ・タイムアウトを除き、読込み処理の新しい値待ち処理 |
| ・新データ値の読込み処理での最小待ち時間 |
Circular Buffersの全ての読込み操作(First, Last, Next, Prev,Peek, PeekLast)
はQueueにも有効です。
データ要素は上書きされるまで、"read"設定され読込み可能です。
複数の書込み、読込みプロセスをサポートします。
Queueは読込み、書込みの複数プロセスに同期処理が使用できます。
以下にその他のQueueに対する可能な操作を示します。
| API | 概要 |
| Fill(n) | nデータ要素の為の領域を取得します。 (古い値は守られます) |
| Write | Queueの最後尾に値を書込みます |
| Read | Queueの最も古い値を読込み、"read"を設定します |
StackはLIFO(Last-In-First-Out)バッファを扱います。
書込み(Write)操作はデータをStackの最上部に挿入します。
エントリの最大数に達した場合、書込み処理は無効になります。
読込み(Read)操作は、スタックの最上部のデータを読込み、"used"を設定します。
Stackにデータが無い場合、読込み処理は無効になります。
Circular Buffersの全ての読込み操作(First, Last, Next, Prev,Peek, PeekLast)
はStackにも有効です。
データ要素は上書きされるまで、"read"設定され読込み可能です。
Stackはいろいろな場面で使用されます。例えばRPN(逆ポーランド記法)
エンジンをサポートした数学関数からの戻り値の文字列など。
以下にその他のStackに対する可能な操作を示します。
| API | 概要 |
| Fill(n) | nデータ要素の為の領域を取得します。 (古い値は守られます) |
| Write | Stackの最上部に値を書込みます |
| Read | Stackの最上部の値を読込み、"read"を設定します |
Tableはソートされたリストに似ています。それはEMPRESSのテーブルの
フィールドのように、沢山のデータ要素を持つ事ができます。
TableはまさしくEMPRESSの一般的なテーブルで、全てのEMPRESSテーブルは
ERTツールキットにより操作できます。
他のADTと比較して、Tableへの操作は確定されません。例えばTableへの時間の
挿入は、データベースの言語種別やファイルシステムに依存します。
抽象的データ型のVariableは単一のデータ要素に保存されます。
要素としてはいろいろな構造体や、複数の違うデータ型を持つ事が
できます。
以下に標準操作以外のVariableに対する可能な操作を示します。
| API | 概要 |
| WriteVariable | 現在の値を上書きします |
| PeekLast | 現在の値を読込みます |
| ReadVariable | 現在の値を読込み、"invalid"を設定します |
現在の値はメモリ上に保存されます。読込み操作(PeekLast)はデータベースや
ファイルシステムを必要としません。
Variableが一時的に作成された場合、データはメモリに保存されディスクに書かれる
事はありません。この場合Variableは共有メモリを使用します。
その時違うプロセスはメモリ中のデータを参照する事が可能です。
Variableはプロセス制御装置がデータを保存するのに使用されます。
14) How to deal with data and ADTs.
読込み・書込み操作からのデータ要素のパラメータは、特別なC構造体を必要とします。
このC構造体は関数によってアロケートされ初期化されます。
開発者はデータをこの構造体に挿入する為に、2つの手順から選択する事ができます。
1. 開発者は構造体のメモリアドレスを取得します。このアドレスにADTに保存する
データを書込みます。この場合、開発者はADTのサイズと、書込みデータのサイズ
が一致するように注意しなければなりません。
2. C構造体のユーザデータのためのメモリは、ADTのデータ要素の最大長で
アロケートされます。この場合、開発者はこのメモリのアドレスを問い合わせる
事ができます。また、このアドレスにデータを挿入できます。
開発者は挿入データがアロケートされたメモリ内に収まる事に気をつけなければ
なりません。
15) Special Attributes in Genera
ERTツールキットは以下の、特別な属性をサポートします。
| ・Record Number |
| ・Timestamp |
| ・Key |
| ・Serial Number |
全てのADTは、特別な属性を自動的に管理できます。このため、いくつかの
パラメータはADTの作成時刻をセットしなくてはなりません。
ただしADTのTableは除外します。
TableはERTツールキットの関数を呼んで作成する事はできません。
この場合、開発者はERTツールキットで操作できるオリジナルのEMPRESSテーブル
に合った属性を作成しなければなりません。
全てのレコードはレコード番号属性を受取ります。この属性にはEMPRESSテーブル
中のレコードの絶対位置を記憶します。これはフリーレコードリストの管理の為に、
内部で使用されます。
開発者はこの属性を操作できませんが、いつでも参照できます。
Timestamp属性は各データ要素の最終参照時刻を記憶します。
一般的にはこの時刻はデータの最終更新時刻です。それは更新操作が実行された場合に
自動的にセットされます。
Timestampのタイプは、Date, Time, Microtimestampのいずれかです。
データ要素を読込んでいる時にTimestampを参照できます。
ADTのVariableは常にTimestamp属性を保持しています。
Timestamp属性はイベントの正確な発生順を取得するのに利用されます。
注意:マシンのシステム時間を戻してしまった場合には、重複した時間がセットされ
矛盾が発生する場合があります。これは、システムが時間調整デーモンによって時間
合わせをしている場合やサマータイム、ウィンタータイムを導入している国で発生する
恐れがあります。
Key属性はlonginteger型かchar型のいずれかを持ちます。
開発者は書込み・読み込み操作でKeyの値も書込み・読み込みが保証されます。
ADTのVariableはKey属性を持ちません。
Key属性は外部システムと一致するデータ要素との識別番号の保存に使用されます。
Serial Number属性は、追加データ要素毎にプラス1されていく通し番号を保持します。
この数字は各データ要素の識別子となります。
Serial Number属性の最終値は、例えADT中に有効なデータが無くても存在します。
Serial NumberはADTが削除された場合か、再作成された場合に限りリセットされ
ます。
EMPRESSのテーブル中ではシリアル番号は、longintegerかdecimal型で保持され
ます。もしADTを作成する場合、シリアル番号の持つ少数点位置を指定しなくては
なりません。
Serial Number属性は読込み専用です。検索の項目に指定しPeek関数で使用されます。
Cライブラリを通して、シリアル番号使って計算する事ができます。
| ・+, -, *, /, % |
| ・inc, desc |
| ・数学関数 |
さらにシリアル番号の比較ができます。
| 比較 | 概要 |
| seq1<seq2 | seq1はseq2の前に挿入された |
| seq2-seq1=1 | seq2はseq1の次に挿入された |
| seq2-seq1=10 | seq1とseq2の間には9つのデータが挿入されている |
ソースコードにはCircular Bufferを使用したサンプルプログラムが含まれています。
これは、1つのCircular Bufferへ書込み、それを読込んで他のCircular Bufferへ
データを保存するサンプルです。
2つのCircular Bufferは10,000レコードを保存できるバッファサイズを持っています。
最初に新規にデータベース"db"をERTツールキットによって作成し初期化します。
MemMasterプログラムは起動したら、2つのCircular Bufferを作成します。
MemMasterは1つのCircular Bufferにデータを書込んだ後に終了します。
共有メモリセグメントが作成され、Tabzeroに書かれた設定ファイルからテーブルを
共有メモリにマップします。MemMasterはバックグランドで起動され、ERTツール
キット用の共有メモリセグメントを保持します。データを読込んで、それを書きこむ
処理が10,000回実行されます。
一度の読込み・書込み処理に要した時間が出力されます。
[Write Process]
Circular Bufferへのデータの書込みには10msec必要だと思われます。よって書込み
ループ中に10msec遅らせる処理をセットします。
書込み処理が終了したら、書込みに要した時間を10msec遅らせた時間を排除して計算
します。また書込み前後の時間を表示します。
書込みプロセスは操作間でスケジュールされるので、前後の時間を表示するのは
有益となります。
[Read Process]
読込みプロセスは、Circular Bufferからデータを読込み、他のCircular buffer
へデータを保存します。読込むCircular Bufferのデータが有効であれば、読込み
プロセス遅れ無しにデータを読込みます。
読込むCircular Bufferにデータが無い場合、読込みプロセスは10msec遅れが生じ、
新しいデータを検索します。
[PeekLast Process]
PeekLastプロセスはCircular Bufferの最後尾データを読込み、データが違う場合に
限り次のCircular Bufferに保存します。
各読込みが終了後、PeekLastプロセスは10msecの遅れが生じます。そして新しい
データを検索します。PeekLastの遅延時間は、読込み・書込みプロセスのオプション
として設定できます。
[emplogd]
"emplogd"デーモンは、シスログメッセージをEMPRESSデータベース中に
Circular Bufferを使用して保存します。またデータベースクエリーを通して
メッセージを作成します。
"emplogd"が起動されると最初にシスログ分のCicular Bufferを作成し保存します。
"emploginfo.sh"スクリプトは、Circular Bufferの読込みのためにパターンマッチング
を使用します。
一度"emplogd"が起動されると、シスログメッセージを受取り、Circular Bufferへ
保存していきます。
[emploginfo.sh]
このシェルスクリプトは"emplogd"で書かれたデータベースからパターンマッチング
によって見易い情報を提供します。
以下の形式で呼び出します。
<option list>を指定しないと、全てのログメッセージを表示します。
<option list>の詳細は以下のようになっています。
| オプション | 概要 |
| -a | 時間(後) |
| -b | 時間(前) |
| -k | キーマッチパターン(AND) |
| -K | キーマッチパターン(OR) |
| -m | メッセージマッチパターン(AND) |
| -M | メッセージマッチパターン(OR) |
例:
# emploginfo.sh db emplog -a "today - 10 days" -b "today -20 days" -m error failed
この指定により、データベース"db"のテーブル"emplog"から、20日前から10日前の
ログメッセージから"error"と"failed"という文字列が存在するものを出力します。
2002.08.07