2006-03-06-01-ARMletへの道 - project-enigma

2006-03-06-01-ARMletへの道

>> Site top >> weblog >> 月別アーカイブ >> 2006年03月のlog >> 2006-03-06-01-ARMletへの道

最終更新日付:2013/12/31 08:04:30


ARMletへの道

2006 年 03 月 06 日

Palmware 開発復活も宣言したことだし、ぼちぼち時間をみつけながら頑張っていくわけだが、2006 年の一発目は、かねてから興味のあった ARMlet である。以前と言っていることが違うが、いろいろと事情があるので見逃してやってほしい。

さて、「Palm OS Programmer's Companion」では、340 ページのあたりに ARMlet を呼び出すために知っておかなければならない事柄が書かれている。また、「Palm OS 5 ARM Programming」というドキュメントもある。陰郎は、今回このあたりを読んでみて ARMletへの取り組みを開始した。ここでは、これらのドキュメントに書かれていることを全部繰り返したりはしない。簡単なサンプルアプリケーションを作って見て得られたデザイン上のトピックについて述べようと思う。

まず重要なことは、Palm OS 4 以前のデバイスもサポートするのであれば ARMlet 化した処理と同じことをする 68K コードを残さなければならないということだ。そして、ドキュメントには、「PACE 上で動いているかどうかを確認せよ」とは書かれているが、「Palm OS 5 かどうかを確認せよ」とは書かれていない。つまり、Palm OS 5 というだけでは PACE が使用されているとは前提できないとも読み取れる。事実上そうだとしてもね。 ...まぁその辺は「Palm OS Programmer's Companion」の 341 ページにサンプルコードがあるのでそちらを読んでいただきたい。

で、もう1点は、Palm OS Simulator の存在だ。ARMlet を呼び出すためのPceNativeCall( ) が呼ばれると、ARM 上の PACE 実装ではその第1パラメータは ARM コードのエントリポイントとして認識される。しかし、Palm OS Simulator の実装では、第1パラメータが Windows DLL のファイル名とエントリ関数名を示す文字列として解釈され、DLL 関数が実行されるようになっている。そのため、ARMlet 対応はこの3つ ── 68K、ARMlet、Simulator ── をサポートする必要があることになる(まぁ大方の場合、Simulator では 68K コードの実行になるだろうが)。

では論理設計開始だ。まず、非常にマシン負荷がかかるために ARMlet 化したい処理をIntensiveFunction として抽象化する。そして、68K 環境の場合、ARM 環境の場合、Simulator の場合でそれぞれクラスを派生する。で、環境に応じて適切なIntensiveFunction 派生クラスを作成するのは IntensiveFunctionFactory クラスの役目だ。このファクトリクラスは、必要な情報を DeviceTraits に問い合わせる。このへんの設計は王道の使いまわしだから別段語ることはない。この状態を以下の図に示す。

まぁ、こんなところだろう。当然、IntensiveFunctionARM は PceNativeCall( ) を通じて ARMlet を呼び出すし、IntensiveFunctionSimulator は同じく PceNativeCall( ) を通じて Windows DLL の関数を呼び出すわけだ。あとは、アプリケーションのオプションで、「ARMlet を使用しない」とかいうオプションがあると、実際のパフォーマンスの違いをユーザーが比べることができて面白いかもしれないな。

おそらく、今後 ARMlet を組み込む Palmware ではこのデザインをさらにイジったものを使用することになる...のだけれども、問題は C++ で書いているということだ。データ構造と処理がクラスにカプセル化されてしまっているため、ARMlet 化においてはクラスごと ARMlet 側に移さなくてはならなくなる...これがどう響くか。結構悩ましい。

 

コメント

このページにコメントする

 

このページのタグ

Page tag : Palm

 

 


Copyright(C) 2005-2017 project-enigma.
Generated by CL-PREFAB.