| 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 の表を参照して下さい。
| 分類 |
関数名 |
別名 (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 の表を参照して下さい。
| 分類 |
関数名 |
分類 |
関数名 |
分類 |
関数名 |
| イベント処理関数 |
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プロセスから、リアルプロセスに移行する手順は次の通りです。
-
リアルタイムコードの決定
INtime環境に移行しなければならない処理箇所を定めます。主に時間的制約が要求される個所や、ダイレクトにI/Oする個所がリアルタイムコードになります。
-
通信の設計
Windowsプロセス、INtimeプロセス間の通信を設計します。WindowsとINtimeは同じ物理メモリを使っていますが、アドレス空間は互いに保護されており、通常では参照出来ない仕組みになっている為、データの受け渡し方法が必要になってきます。INtimeにはデータ通信方法がいくつも用意されている為、処理に合った方式をとる事が望まれます。
-
リアルタイムコードの移行
リアルタイムにする機能をリアルタイムプロセスに移行する必要があります。
リアルタイムプロセスは例外を除き、新規に作成し移行します。Visual C++よりINtimeウィザードを使用して作成する方法が最も容易に骨格を作成する事が出来ます。
-
INtime通信とWindows通信の確立
リアルタイムプロセスにプロセス間通信手段を設計した手法で追加します。また、既存のWindowsプロセスにも同様に、このプロセス間通信手段を追加します。これで、WindowsプロセスとINtimeプロセスとの通信が確立されます。
-
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 に置き換えるという作業が無く、スムーズな移行が行えます。
|
|