EMPRESS Embedded Real Time Tool Kit

目次

 

1.      Introduction.

2.      Design Goal.

3.      Application Areas.

4.      The Abstract Data Types.

5.      What Can You Store in an ADT.

6.      Storage of Data Element.

7.      General Operation of the API on ADT.

8.      Array.

9.      Circular Buffer.

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.

 

1)      Introduction

 

ERTツールキットは組込み、リアルタイム環境でEMPRESSを利用

するための開発環境です。(オプション製品)

 

提供形態:ソースコード。

使用方法:Real Time LinuxQNXにてコンパイルして使用。

 

2)      Design Goal

 

ERTツールキットはEMPRESSを組込みや、リアルタイムOSで扱うための

拡張機能として追加されました。

ERTツールキットの設計は特別な需要の為に最適化されました。

 

・早い処理能力

・高い整合性

・重要な操作の最大応答時間を計算できる

・ノンストップ稼動でのレスポンスの低下が無いこと

・信頼性・安全性のある操作

・他の部品の不具合に影響されない強固さ

・柔軟さ

 

3)      Application Areas

 

ERTツールキットの可能な領域。

 

・データの収集、管理、解析プロセスの制御

・履歴データの管理、解析

・エラーデータの保存、解析

・定義データの管理

・拘束されない同期プロセス

・システムのテスト、プロトタイプ

 

ERTツールキットは、開発者に対し階層データを保存するためにオブジェクト、

コンテナを作成する事を許します。

オブジェクト、コンテナ、抽象的データタイプ(ADT)はERTツールキットでは

Cの関数で操作できます。

オブジェクトやそれらのデータはEMPRESSのデータベーステーブルに保存されます。

EMPRESSデータベーステーブルは、共有メモリ(一時的データ)または

ハードディスク(継続データ)に保存されます。

アプリケーションは、ERTツールキットの特別なライブラリとユーティリティによって、

オブジェクトとの対話型問い合わせを行います。

EMPRESSデータベーステーブルは、一般的なインタフェースによりODBC JDBC

HTMLPerlTcl/Tkなどからアクセスできます。

 

4)      The Abstract Data Types

 

ERTツールキットは以下の抽象的データイプ(Abstract Data Type)をサポート

します。

 

Array

Circular Buffer

Queue(FIFO)

Stack(LIFO)

Table

Variable

 

5)      What Can You Store in an ADT.

 

全てのADTは、基本的なデータタイプのEMPRESSのデータ型またはCのデータ型

に保存できます。

また、複数の基本的なデータ型の複雑な構造体などはEMPRESSBULKデータ型に

保存できます。

 

6)      Storage of Data Element.

 

すべてのデータ要素は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を返す

 

8)      Array

 

指定された数のデータを持ちます。

各データには0から(n-1)のインデックスでアクセスできます。

 

以下に標準操作以外のArrayに対する可能な操作を示します。

 

API

概要

WriteArray

指定位置のデータを上書する

ReadArray

指定位置のデータを読込み"invalid"設定する

Del

指定位置にNULL値をセットする

DelKey

与えられたキーにNULL値をセットする

Peek

指定位置のデータを読込む

 

9)      Circular Buffer

 

指定された数のバッファを持ちます。データが無い場合、最初の書込みは最初の位置

に行われ2番目の書込みは2番目のバッファに行われます。

最大値n番目のバッファまで書込み済の時に、書込みが行われると最も古いバッファ

0番目)が上書きされます。

 

以下に標準操作以外のCircular Bufferに対する可能な操作を示します。

 

API

概要

Write

バッファに書込みます

Read

最も古いデータを読込み"read"設定します

First

最も古いデータの読込み位置を取得する

Last

最も新しいデータの読込み位置を取得する

Next

読込み位置を後方(新しいデータ)に移動する

Prev

読込み位置を前方(古いデータ)に移動する

PeekLast

古いデータを読込む

Peek

現在の位置のデータを読込む

 

10)  Queue

 

QueueFIFO(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"を設定します

 

11)  Stack

 

StackLIFO(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"を設定します

 

12)  Table

 

Tableはソートされたリストに似ています。それはEMPRESSのテーブルの

フィールドのように、沢山のデータ要素を持つ事ができます。

TableはまさしくEMPRESSの一般的なテーブルで、全てのEMPRESSテーブルは

ERTツールキットにより操作できます。

 

他のADTと比較して、Tableへの操作は確定されません。例えばTableへの時間の

挿入は、データベースの言語種別やファイルシステムに依存します。

 

13)  Variable

 

抽象的データ型の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の作成時刻をセットしなくてはなりません。

ただしADTTableは除外します。

TableERTツールキットの関数を呼んで作成する事はできません。

この場合、開発者はERTツールキットで操作できるオリジナルのEMPRESSテーブル

に合った属性を作成しなければなりません。

 

16)  Record Number

 

全てのレコードはレコード番号属性を受取ります。この属性にはEMPRESSテーブル

中のレコードの絶対位置を記憶します。これはフリーレコードリストの管理の為に、

内部で使用されます。

開発者はこの属性を操作できませんが、いつでも参照できます。

 

17)  Timestamp

 

Timestamp属性は各データ要素の最終参照時刻を記憶します。

一般的にはこの時刻はデータの最終更新時刻です。それは更新操作が実行された場合に

自動的にセットされます。

Timestampのタイプは、Date, Time, Microtimestampのいずれかです。

データ要素を読込んでいる時にTimestampを参照できます。

ADTVariableは常にTimestamp属性を保持しています。

 

Timestamp属性はイベントの正確な発生順を取得するのに利用されます。

 

注意:マシンのシステム時間を戻してしまった場合には、重複した時間がセットされ

矛盾が発生する場合があります。これは、システムが時間調整デーモンによって時間

合わせをしている場合やサマータイム、ウィンタータイムを導入している国で発生する

恐れがあります。

 

18)  Key

 

Key属性はlonginteger型かchar型のいずれかを持ちます。

開発者は書込み・読み込み操作でKeyの値も書込み・読み込みが保証されます。

ADTVariableKey属性を持ちません。

Key属性は外部システムと一致するデータ要素との識別番号の保存に使用されます。

 

19)  Serial Number

 

Serial Number属性は、追加データ要素毎にプラス1されていく通し番号を保持します。

この数字は各データ要素の識別子となります。

Serial Number属性の最終値は、例えADT中に有効なデータが無くても存在します。

Serial NumberADTが削除された場合か、再作成された場合に限りリセットされ

ます。

 

EMPRESSのテーブル中ではシリアル番号は、longintegerdecimal型で保持され

ます。もしADTを作成する場合、シリアル番号の持つ少数点位置を指定しなくては

なりません。

Serial Number属性は読込み専用です。検索の項目に指定しPeek関数で使用されます。

 

Cライブラリを通して、シリアル番号使って計算する事ができます。

 

+, -, *, /, %

inc, desc

・数学関数

さらにシリアル番号の比較ができます。

 

比較

概要

seq1<seq2

seq1seq2の前に挿入された

seq2-seq1=1

seq2seq1の次に挿入された

seq2-seq1=10

seq1seq2の間には9つのデータが挿入されている

 

20)  Example1

 

ソースコードにはCircular Bufferを使用したサンプルプログラムが含まれています。

これは、1つのCircular Bufferへ書込み、それを読込んで他のCircular Buffer

データを保存するサンプルです。

2つのCircular Buffer10,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の遅延時間は、読込み・書込みプロセスのオプション

として設定できます。

 

21)  Example2

 

[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