HOME > INtime > システムコール

システムコール

■ システムコール

Windows従来のWIN32APIを使用したWindowsアプリケーションはGUIアプリケーションとして利用します。INtimeを導入しますと、NTX-APIが加えて利用可能になります。制御・計測処理はINtimeカーネル上で動作するINtimeアプリケーションとして開発を行い、GUIアプリケーションはNTX-APIによってデータ交換・イベント交換を要求できます。



■ INtime API

リアルタイム性能を100%発揮するために、INtimeアプリケーションはINtimeシステムコールをいつでもコールできます。また、リアルタイム性を考慮のうえ再設計されている付属ANSI-Cライブラリがコールできます。
API(システムコール)詳細はこちらを参照してください。

■ INtime API | C++ クラスライブラリ

INtimeアプリケーションの開発は、C++言語でも可能です。付属しているC++クラスライブラリは、INtimeオブジェクトごとにクラス化されいるので、直感的にわかりやすいプログラミングを可能とします。

■ NTX API

WindowsアプリケーションにはWIN32システムコールに加えて、NTXシステムコールが実装されます。NTXシステムコールによってWindowsアプリケーションはINtimeシステムコールの一部を自由にコールできるようになります。NTXシステムコールを利用することで、INtimeアプリケーションとWindowsアプリケーションの間でデータ交換や、イベント交換、共有メモリアクセスなどが実現できます。その後自由な描画処理を開発することができます。

■ 安定したシステムコールパフォーマンス

WindowsアプリケーションとINtimeアプリケーションをNTXによって接続したとき、データ交換/イベント交換に要する時間を確定的にできます。下図はWindowsアプリケーションからINtimeアプリケーションに対するイベント送信~受信に要した時間(青色)と、INtimeアプリケーションからWindowsアプリケーションに対するイベント送信~受信に要した時間(桃色)を示しています。スレッド優先度の関係で青色(一般的に制御処理への要求)は確定的(100マイクロ秒未満)、桃色(一般的に描画要求)は変動する(1ms未満)可能性があることを示しています。

INtime iWin32 API


 1. iWin32についての概要

1.1

iWin32 APIとは?
iWin32 API とは 一般的に使用されているマイクロソフトWindows API (Win32 API)の新しいサブセットであり、INtimeリアルタイム拡張機能に対応している API です。INtime API は、もともと独立した INtime環境での稼動中プロセスから INtime 機能にアクセスするために設計されたものであり、意図的に32ビットWindows プログラミングで使用される Win32 APIと類似するように作られてはいますが、同一ではありませんでした。Windows環境に精通している開発者にとっては、INtime APIを使用するにあたり、1から学習しなくてはならないという手間がありました。この手間を省き、従来の思想をそのままINtimeリアルタイムアプリケーションの開発に移行できるのが、このiWin32 API です。

 1. iWin32についての概要

1.2

iWin32 APIに含まれる関数について
Win32の完全なサブセットと、リアルタイムアプリケーションをWindowsプラットフォーム上で実行するために必要なリアルタイム拡張ファンクションコールが含まれています。INtime には、独自のリアルタイム API 機能がありますが、この新しいiWin32 APIでは、次のような馴染みのある Microsoft Win32 構成 を提供しています。(プロセス、スレッド、相互排除、クリティカルセクション、セマフォ、イベント、構造化例外処理(SEH)、ファイルと割込み処理、共用メモリ、およびタイマー)。さらにiWin32 API は、INtime API と併用する事が可能であり、従来のINtime 思想を移行する事が出来ます。

 1. iWin32についての概要

1.3

iWin32 API には、どんなものがありますか?

次の iWin32 API の表を参照して下さい。

iWin32 API 一覧

分類 関数名 別名 (RTXコール) 分類 関数名 別名 (RTXコール)
ハンドル関数 CloseHandle RtCloseHandle スレッド
関数
CreateThread -
プロセス関数 ExitProcess - ExitThread -
GetCurrentProcess - GetCurrentThread -
GetCurretProcessId - GetCurrentThreadId -
GetExitCodeProcess RtGetExitCodeProcess GetExitCodeThread -
OpenProcess RtOpenProcess GetLastError -
TerminateProcess RtTerminateProcess GetThreadPriority RTGetThreadPriority

-

RtCreateProcess(iwin32x)

-

RtGetThreadTimeQuantum
WaitforMultipleObjects RtWaitforMultipleObjects OpenThread -
WaitForSingleObject RtWaitForSingleObject ResumeThread -
ミューテックス
関数
CreateMutex RtCreateMutex SetLastError -
OpenMutex RtOpenMutex SetThreadPriority RtSetThreadPriority
ReleaseMutex RtReleaseMutex

-

RtSetThreadTimeQuantum
WaitforMultipleObjects RtWaitforMultipleObjects Sleep

-

WaitForSingleObject RtWaitForSingleObject

-

RtSleepFt
クリティカル
セクション関数
DeleteCriticalSection - SuspendThread -
EnterCriticalSection - TerminateThread -
InitializeCriticalSection - WaitForMultipleObjects RtWaitForMultipleObjects
LeaveCriticalSection - WaitForSingleObjent RtWaitForSingleObjent
TryEnterCriticalSection - 割込み処理関数 - RtAttachInterruptVector
セマフォ関数 CreateSemaphore RtCreateSemaphore - RtAttachInterruptVectorEx
OpenSemaphore RtOpenSemaphore - RtDisableInterrupts
ReleaseSemaphore RtReleaseSemaphore - RtEnableInterrupts
WaitforMultipleObjects RtWaitforMultipleObjects - RtReleaseInterruptVector
WaitForSingleObject RtWaitForSingleObject 共有メモリ
関数
- RtCreateSharedMemory
イベント関数 CreateEvent RtCreateEvent - RtOpenSharedMemory
OpenEvent RtOpenEvent タイマー
関数
- RtCancelTimer
PulseEvent RtPulseEvent - RtCreateTimer
SetEvent RtSetEvent - RtDeleteTimer
WaitforMultipleObjects RtWaitforMultipleObjects - RtGetClockResolution
WaitForSingleObject RtWaitForSingleObject - RtGetClockTime
I/O関数 CreateFile - - RtGetClockTimerPeriod
DeleteFile - - RtGetTimer
ReadFile - - RtSetClockTime
RemoveDirectory - - RtSetTimer
SetFilePointer - - RtSetTimerRelative
WriteFile - 物理/仮想
メモリ関数
- RtGetPhysicalAddress
- RtDisablePortIo - RtMapMemory
- RtEnablePortIo - RtUnmapMemory
- RtGetBusDataByOffset メモリ関数
(互換性の為)
- RtAllocateContiguousMemory
- RtReadPortXxx - RtAllocateLockedMemory
- RtSetBusDataByOffset - RtFreeContiguousMemory
- RtWritePortXxx - RtFreeLockedMemory
ライブラリ
モジュール
参照関数
FreeLibrary - HeapAlloc -
GetModuleHandle - HeapFree -
GetProcAddress - HeapReAlloc -
LoadLibrary

-

HeapSize -
既存API
互換性用
関数
- RtCommitLockHeap クイック
同期関数
InterLockedCompare -
- RtCommitLockProcessHeap InterlockedCompareExchange -
- RtCommitLockStack InterlockedCompareExchangePointer -
- RtDisablePortIo InterlockedDecrement -
- RtEnablePortIo InterlockedExchange -
- RtLockKernel InterlockedExchangeAdd -
- RtLockProcess InterlockedExchangePointer -
- RtUnlockKernel InterlockedIncrement -
- RtUnlockProcess - - -
例外処理
関数
_set_se_translator -
AbnormalTermination -
GetExceptionCode -
GetExceptionInformation -

 

 1. iWin32についての概要

1.4

Windows アプリケーションと iWin32 プロセスの通信方法

Windows アプリケーション(*.EXE) と iWin32 プロセス(*.RTA) の通信方法は、従来のNTX API に加え、iWin32x API と呼ばれる関数を使用出来ます。これらの関数はCまたはC++のプログラムからのみ使用でき、APIは iWin32 API のサブセットを提供します。

 1. iWin32についての概要

1.5

iWin32x API には、どんなものがありますか?

次の iWin32 API の表を参照して下さい。

iWin32x API 一覧表

分類 関数名 分類 関数名 分類 関数名
イベント処理関数 RtCreateEvent ミューテックス関数 RtCreateMutex セマフォ関数 RtCreateSemaphore
RtOpenEvent RtOpenMutex RtOpenSemaphore
RtPulseEvent RtReleaseMutex RtReleaseSemaphore
RtResetEvent

-

-

RtSetEvent
プロセス処理関数 RtCreateProcess 共有メモリ関数 RtCreateSharedMemory 汎用関数 RtCloseHandle
RtGetExitCodeProcess RtOpenSharedMemory RtImportHandle
RtOpenProcess

-

RtSetNode
RtTerminateProcess RtWaitForSingleObject


 2. リアルタイム移行について

2.1

リアルタイムへ移植するためには・・・

Windowsプロセスから、リアルプロセスに移行する手順は次の通りです。 

  1. リアルタイムコードの決定
    INtime環境に移行しなければならない処理箇所を定めます。主に時間的制約が要求される個所や、ダイレクトにI/Oする個所がリアルタイムコードになります。 

  2. 通信の設計
    Windowsプロセス、INtimeプロセス間の通信を設計します。WindowsとINtimeは同じ物理メモリを使っていますが、アドレス空間は互いに保護されており、通常では参照出来ない仕組みになっている為、データの受け渡し方法が必要になってきます。INtimeにはデータ通信方法がいくつも用意されている為、処理に合った方式をとる事が望まれます。

  3. リアルタイムコードの移行 
    リアルタイムにする機能をリアルタイムプロセスに移行する必要があります。 リアルタイムプロセスは例外を除き、新規に作成し移行します。Visual C++よりINtimeウィザードを使用して作成する方法が最も容易に骨格を作成する事が出来ます。

  4. INtime通信とWindows通信の確立
    リアルタイムプロセスにプロセス間通信手段を設計した手法で追加します。また、既存のWindowsプロセスにも同様に、このプロセス間通信手段を追加します。これで、WindowsプロセスとINtimeプロセスとの通信が確立されます。

  5. INtimeプロセスの開始と終了
    INtimeプロセスの開始方法、終了方法を追加します。通常、Windowsプロセスが起動すると共にINtimeプロセスが開始し、Windowsプロセスが終了する時にINtimeプロセスも終了するように設計します。


 2. リアルタイム移行について

2.2

既存のWindows単独システム構成からINtime リアルタイム構成へ移行する流れについて
要求する精度の問題から、既存のWindowsだけで構成されたシステムより、INtime リアルタイムへの移行をする場合
まず、構成されているシステムを2つに分ける必要があります。INtimeは、厳密なリアルタイム性を持つがゆえに、GUI
(Graphic User Interface の略 ユーザーとのやり取りする機構を指す 以下GUIと称する)を持っていない為、
表示処理の部分はWindowsに残し、時間的な厳密さが要求される個所、ハードウェアI/O処理、等の制御処理をINtime へ移植します。
表示処理(Windows)側と制御処理(INtime)側で、データのやり取りが必要な場合には、共有メモリを確保、参照するなど処理を
加える必要があります。また、この共有メモリの書き込み、読み込みが排他的に行うように制御したい場合には、ミューテックス等を
使用し、排他制御を加える必要があります。
下の図の例は、表示処理と制御処理が存在し、制御処理がDI/DOの処理を行い、表示処理がDI/DOの結果を表示するシステムです。
従来のWindows単独システム構成では、要求する時間的制約毎に制御が出来ないという事でINtimeを導入し、制御処理部分INtimeに
移植し、要求する時間的制約毎の制御を実現しているところを表しています。


 2. リアルタイム移行について

2.3

INtime リアルタイムを導入して、新規にシステムを構築する場合について

新規に構想する場合も、 2.2項と 同様、大きく分けて表示処理と制御処理を設計し、表示処理部分をWindowsで作成し、制御処理部分をINtimeで作成します。データ通信方法も 2.2 同様、共有メモリを使用し、排他制御、同期等をとるのであれば、ミューテックス、セマフォを用いて制御します。INtimeコーディングについては、iWin32 APIを使用する事で、従来の思想をそのまま活用できますので容易に行える事でしょう。

 2. リアルタイム移行について

2.4

RTXよりINtimeへ移行する場合について

このiWin32 APIには、RTX APIと同じAPIが含まれています。
その為、わざわざiWin32 API に置き換えるという作業が無く、スムーズな移行が行えます。

Back |HOME