Palm Programmer's Laboratory

トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

Palm OS Programmer's Companion Volume I/14-3

← 2 節に戻る ↑14 章トップへ 4 節に進む →


14-3 ARM ネイティブサブルーチンの呼び出し

 
68Kアプリケーションから ARM ネイティブのサブルーチンをコールするには、新しい関数 PceNativeCall を使用します。

PceNativeCall 関数は2つの引数をとります。

  1. ARM ネイティブ関数のポインタ。これは通常はコードリソースに保存されています。ARM ネイティブサブルーチンがリソースに保存されている場合、68Kアプリケーションは単純に DmGetResource を使用してリソースを取得し、MemHandleLock を使用してそのリソースをロックすることで ARM ネイティブサブルーチンのポインタを取得できます。
  2. データブロックを指すポインタ。これにより、68Kアプリケーションは ARM ネイティブサブルーチンとデータを交換することができます。

PceNativeCall をコールする前に、プロセッサタイプを確認する必要があります。

  • プロセッサが ARM の場合、68Kアプリケーションから ARM 関数をコールします。
  • プロセッサが x86 ファミリの(つまり、アプリケーションはWindows上の Palm OS シミュレータ上で動作している)場合、68Kアプリケーションは ARM 関数を代替する Windows DLL をコールします。
  • 上記以外の場合、68Kアプリケーションは関数の68Kバージョンをコールするか、あるいはその機能を68Kアプリケーションに合理的に組み込むことができなければ体良く失敗します。この例は、アプリケーションが Palm OS Garnet よりも前のバージョンでも動作するという前提です。

リスト 14.1 にこのプロセスを示します。わかりやすさのために、この例では ARM 関数にはパラメータを渡していません。

リスト 14.1 ARM 関数のコール

static UInt32 PceNativeResourceCall(DmResType resType, DmResID resID,
                                    char *DLLEntryPointP, void *userCPB) {
    UInt32 processorType;
    MemHandle armH;
    MemPtr armP;
    UInt32 result;

    // get the processor type
    FtrGet(sysFileCSystem, sysFtrNumProcessorID, &processorType);
    if (sysFtrNumProcessorIsARM(processorType)){
        // running on ARM; call the actual ARM resource
        armH = DmGetResource(resType, resID);
        armP = MemHandleLock(armH);

        result = PceNativeCall(armP, userCPB);

        MemHandleUnlock(armH);
        DmReleaseResource(armH);

    } else if (processorType == sysFtrNumProcessorx86) {
        // running on Simulator; call the DLL
        result = PceNativeCall((NativeFuncType *)DLLEntryPointP, userCPB);

    } else {
        // some other processor; fail gracefully
        ErrNonFatalDisplay("Unsupported processor type");
        result = -1;
    }

    return result;
}

各種のプロセッサタイプのための( 全て sysFtrNumProcessor〜 で始まる名前の )#define が SystemMgr.h で定義されています。

 


← 2 節に戻る ↑14 章トップへ 4 節に進む →