Palm Programmer's Laboratory

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

BBS-雑談掲示板/39

ARMletのデバッグ環境について教えていただけませんか? - 風間 (2008年01月24日 11時33分58秒)

以前お世話になりました。風間でございます。
よろしければARMletのデバッグ環境について教えていただけませんか?

開発環境はCW9で、ARMletを使ったプログラムを書こうと思います。
そこで基本的なことなのですが、シュミレーター上でARMletのデバッグは可能なのでしょうか?

CW9に付属のARMletなるサンプル・プログラムに以下の記述ありました。

result = PceNativeResourceCall('ARMC', 1000, "ARMlet.dll\0NativeFunction", &inputData);

多分、勝手に"ARMlet.dll"なるものがあれば、デバッグが可能であると判断。
ネットで探すと、jpegArmletsなるサンプルに内にARMlet.dllが付属していたので、
これをシュミレーターと同じフォルダに配置。
コンパイルしたアプリをシュミレーター上で実行すると、下記のエラーが出てクラッシュしてしまいます。
ARMlet.dllをフォルダから外すとアプリを実行しても何も動きません。
ということは一応プログラムはARMlet.dllを認識はしてることだと思うのですが?
PceNativeCallを呼び出しはするところはまでは到達しているようです。

==============
= Welcome to the Palm OS Pace Debugger! =
==============
I:\Snoopy\ARM\Core\Emul68K\SrcSlowEmu\Run68K.c, Line:1045, Invalid addr mode for byte instruction
I:\Snoopy\ARM\Core\Emul68K\SrcSlowEmu\Run68K.c, Line:2080, Invalid write to 000000F6

I:\Snoopy\ARM\Core\Emul68K\Src\Emul68KCommon.c, Line:527, Odd address
I:\Snoopy\ARM\Core\Emul68K\Src\Emul68KCommon.c, Line:527, Odd address
I:\Snoopy\ARM\Core\Emul68K\Src\Emul68KCommon.c, Line:527, Odd address

(jpegArmletsは全く動きませんでした)

ちなみにシュミレーターは下記のものを使用してます。
Palm OSR 5.0 Simulation
SonyBuild 2002102501

何か基本的に考えが間違ってますでしょうか?
何かアドバイスを頂けませんでしょうか、よろしくお願いします。

コメント

  • 風間さん、始めまして(じゃなかったかな?)。ひとまず、こちらをお読みください。結論からいうと、お書きになっている例でいえば、ARMlet.dll は自分で作成するものです。シミュレータでのデバッグでは、Palmware 内に作成した ARMlet を「直接」デバッグすることはできません。ARMlet と同じ処理をする Windows DLL を作成し、デバッグする場合にはシミュレータ環境かどうかを判定して DLL 内の関数をコールする必要があります。陰郎も CW9 ですが、ARMlet をデバッグする場合は Microsoft Visual C++ で DLLを作成し、Visual C++ のデバッグセッションで Palm OS Simulator を起動し、対象の Palmware を実行してデバッグしています。例が c++ になってしまいますが、68K, ARM, Simulator 間でコード共有をする方法については拙稿がありますのでこちらをお読み下さい。PC と実機を直接接続してデバッグする場合には ARMlet を直接デバッグできるのかもしれませんが、それについては詳しく知りません。 - 陰郎 (2008年01月24日 16時03分49秒)
  • 陰郎さん、ご無沙汰しております。 - 風間 (2008年01月24日 17時57分24秒)
  • 陰郎さん、ご無沙汰しております。昨年、テーブルのことでこちらでお世話になりました。その節はありがとうございました。あれからいろいろ試行錯誤をして現在は簡単な画像ビューワーのアプリを作っているのですが、画像の回転やら、アルファ・ブレンドっぽい処理を加えたところ、激遅なアプリになってしまいました。そこでARMletなるものがあるのを知り、それを早速取り入れてみようと思っているのですが。つまり、デバッグをするにはそのアプリ専用のDLLを用意しなければならないということでしょうか? そして、それにはMicrosoft Visual C++の開発環境が必要なのですね。すいません、Microsoft Visual C++は手元にないので、デバッグは無理!ということですか...。例えばGarnet Developer Suiteとかでも同じようにDLLを作成しないと駄目なんでしょうか?あんまり環境を変えたくはないのですが、それが可能ならそれも一つに選択になるのでしょうか? - 風間 (2008年01月24日 17時58分44秒)
  • 風間さん、速断は禁物ですよ。Visual C++ は単に陰郎が使っているだけで、Win32 環境で DLL を作成できて、デバッグできればなんでもいいはずです。PODS は Eclipse ベースで、Eclipse のベースには Cygwin がいます。PODS をインストールした場合に、デフォルトで Cygwin がインストールされるのは C:\PalmOSCygwin ですが、この bin 配下には gcc がちゃんと入っているようです。これがあればひとまず DLL は作成できるかもしれません。あとは、Simulator をデバッガで起動して、Simulator がロード・実行する ARMlet 代替 DLL をソースコードインラインでデバッグできるような環境があるかどうかです。ひょっとしたら PODS (というか Eclipse )でもできるかもしれません。最悪、DLL から Windows 上のファイルシステムにデバッグログを出力しまくるという方法もありますよ。 - 陰郎 (2008年01月24日 20時17分19秒)
  • 補足です。ARMlet のデバッグで Windows DLL を使用しなければならないのは、開発環境である CodeWarrior の仕様ではなく、Palm OS Simulator の仕様です。なぜなら、Palm OS を Windows 上に移植した Palm OS Simulator は、PceNativeCall の実装が本来の Palm OS と異なるからです。具体的には、本物の Palm OS では渡されたパラメータを ARMlet のエントリポイントとして認識してそのアドレスをコールするのに対して、Palm OS Simulator では代替 DLL のファイル名とその内部の DLL 関数名を NULL 文字で区切った文字列の先頭ポインタとして認識し、(おそらくは)Win32 API である LoadLibrary 関数をコールして DLL 関数を実行しています。Palm OS Simulator はシミュレータですから、ハードウェアのエミュレーションは行ないません。Palm OS 5 をエミュレートする Palm OS Emulator があったら、ARMlet を搭載した Palmware もそのままデバッグできたかもしれませんね。 - 陰郎 (2008年01月24日 21時22分44秒)
  • 陰郎さん、丁寧に説明していただきまして、ありがとうございます。CygwinもGCCも手を出したことがないので、余計に混乱しそうです。とりあえず何とかMicrosoft Visual C++を入手するしか無いのかな〜。とにかく今作っているアプリをなんとかARMlet化させたいので、がんばるしかないのかと思います。 - 風間 (2008年01月25日 06時15分15秒)
  • すいません、Microsoft Visual Studio .NET 2003でもDLLをコンパイル出来ますでしょうか? - 風間 (2008年01月25日 10時07分40秒)
  • Microsoft 製品から遠ざかってしまっているため、たしかなことはいえないのですが、大丈夫だと思います。ただ、Visual Studio.NET は Visual C++ 以外の製品 ── Visual Basic とか ── も入っているので、割高ではないかと思います。Visual C++ の単体製品は今でもあると思うのですがどうでしょう。あと、陰郎が Visual C++ を始めて購入したのはかれこれ 10年くらい前ですが、一番安価なエディションンでは作成したアプリケーションを販売・配付できないようなライセンスだった気がします。なので、目的にもよりますが購入されるのであれば良くお調べになった方がいいかもしれません。 - 陰郎 (2008年01月25日 11時20分38秒)
  • ちなみに、念の為に書いておきますと、Visual Basic で作成できるのは ActiveX DLL だけ(のはず)なので、いわゆる古式ゆかしい DLL は作成できないと思います。ただ、Visual C++ をこれから使い始めるのであれば、もっと安価(あるいは無償)で利用できるものを検討するのも一考かな...と思いますがいかがでしょう? Visual C++ をお勧めしない、というのではありません。個人的には、良い開発環境だと思いますが、唯一の選択肢ではないはずです。Borland(というのはもう古い社名でしたっけ)製品などでもできるとは思います。使ったことがないので、使い勝手などについては陰郎からはなにもいえないのですが... - 陰郎 (2008年01月25日 11時22分28秒)
  • 試してみたところ、Cygwin に入っている gcc でも DLL のビルドはできました。ただ、PODS バンドルの Cygwin ではなく、Cygwin 単体でインストールした PC なので、PODS 環境では事情が違うかもしれません。また、Cygwin に閉じた確認しかしていないので、Palm OS Simulator から問題なく使えるかどうか、使えたとしてもデバッグが快適にできるかどうか...もまだわかりません。 - 陰郎 (2008年01月25日 11時58分09秒)
  • またまたご丁寧に説明していただきまして、ありがとうございます。可能なら無料で出来るならその方が嬉しいのです。とりあえず昨日の夜PODSを落としておいたので、さっきインストールをしたところです。で、Cygwinなるもので、どうやってVisual C++ のプロジェクト・ファイルをコンパイルすればいいのか...。どこかに解説してあるサイトとかないですかね(^^; それとも書籍でも構いません、ヒントになるような物があったら教えていただけませんか? とにかくCWしか触れたことがないので...。ちなみに作成したアプリは配付出来るようなシロモノではありません(笑) - 風間 (2008年01月25日 12時16分52秒)
  • 今、PODS バンドルの Cygwin 環境で DLL をビルドするお試しをやっています。しかし、Palm OS Simulator からの呼び出しが可能かどうかの検証については、週末になってしまうかもしれません...また、呼び出せたとしても上手くデバッガを使えるかどうかは保証の限りではありません。しばらくお待ちください。 - 陰郎 (2008年01月25日 12時31分28秒)
  • とんでもなくお手間を掛けてしまって申し訳ありません。自力でどこまで出来るかわかりませんが、いろいろ挑戦してみようと思います。何か分かりましたらまた教えて下さい。ありがとうございます。 - 風間 (2008年01月25日 13時16分08秒)
  • 続報です。PODS バンドルの gcc で DLL をビルドするところまではできました。使用しているのはこのページの末尾で示しているサンプルプロジェクトで、MSVC++ でビルドしていた Simulator 向け DLL と同等のものを目指しています。しかし、実際に Simulator で動かしてみたところ、1回目は撃沈しました。今職場なので、必要な道具立てが揃っていないこともあり、続きは今夜以降になります。 - 陰郎 (2008年01月25日 15時26分42秒)
  • PODS 付属の Cygwin gcc で、コンパイルオプションを調整調整したところ、Palm OS Simulator から動作させることができました。デバッグについてはまだですが、ここまでをひとまず情報としてまとめますので少々お待ち下さい。 - 陰郎 (2008年01月25日 19時49分08秒)
  • 書いてみました。詰めが甘いので奇妙なエラーが出ることと、デバッガとの連携がまだですが、ひとまず頑張ってみて下さい。cygwin のシェルコマンドの使用や make は大丈夫でしょうか。C:\PalmOSCygwin\cygwin.bat を起動してプロンプトを起こし、PalmSimDLL のディレクトリまで移動して make です。 - 陰郎 (2008年01月25日 21時47分16秒)
  • 横から失礼します。Visual Studio Expressに含まれるVC++でデバッグすることは出来ないのでしょうか?話の流れをみているとVC++を使えない理由は"有償だから"な様に見えるのですが、合ってますでしょうか?もしそうなあらVisual Studio Expressはフリーで利用可能ですので試してみる価値はあると思います。作成したバイナリの配布に対しても制限はありません。MFCとATLが使えないようですがgccでコンパイル出来るということは問題ないですよね - EIJ (2008年01月26日 01時08分30秒)
  • EIJ さん、お久しぶりです。Visual Studio Express というのは無償で利用できるんですか? Microsoft 製品から遠ざかって久しいので、全然知りませんでした...それなら話は別ですね。確かに、無償で利用できるものがあるならそちらを探してみよう...という流れになってました。それに、MFC と ATL は必要ないです。 - 陰郎 (2008年01月26日 01時19分20秒)
  • すいません、ほんとうにとんでもなくありがとうございます。こんなにいろいろ説明していただいて何とお礼を申し上げたらよいのか。しかし今の自分の力では難しい過ぎます。とりあえずまずCygwinやらGCCを一から勉強しないと無理そうです。気が遠くなるような話しですが、絶対にARMletはアプリに取り入れたいので、これからコツコツと勉強してDLLのコンパイルを出来るようになりたいと思います。週末にゼロからCygwinを調べてみたいと思います。どうしても分らないことがあったらまたお聞きするかもしれませんが、その時はよろしくお願いします。Visual Studio Expressというのも探してみます。 - 風間 (2008年01月26日 05時37分37秒)
  • ディレクトリ移動のコマンドで躓いてしまい、やっとPalmSimDLLフォルダに移動出来ました。ここでとりあえず何も考えずに gcc -mno-cygwin -g -c FooImp.cxx を実行。すると No Such file or directory エラーが表示 include されているヘッダーファイルがありませんとのことか。でもmakeファイルの中でパスを指定されているのに何故? makeファイルとは別の場所でパスを指定する必要があるんでしょうか? - 風間 (2008年01月26日 14時25分33秒)
  • いや、makeと入力して実行でいいはずですよ。 - 陰郎 (2008年01月26日 14時39分54秒)
  • あ、ちょっと待ってください。CW9 のインストール先ディレクトリが違うのであれば、makefile 内の INCLUDEPATH に書かれているパスを書き換える必要はあります。 - 陰郎 (2008年01月26日 14時41分35秒)
  • やっと分かりました。迷って迷って迷いました。単純に make で良かったんですね。エラーも出ないで Foo.dll なるものが出来ました。それを早速シュミレーターのディレクトリにコピーして実行すると。確かにエラーが必ず3回出て、次に SIMULATOR::FooImp::Execute() と表示されます。一応これで動いたことになるのでしょうか?ただデバッグ・モードでステップ毎に実行すると何故かエラーが出ません。ありがとうございます。なんかすっかり教えてもらってしまったので自分でやった実感がなくて本当に申し訳なくて仕方ありません。何とお礼を申し上げたらよいのか、ありがとうございます。一つ質問なんですが、デバッグモードの時に UInt32 result = ::PceNativeCall( reinterpret_cast<NativeFuncType*>( ENTRYPOINT ), &param );ここまて来るとアラートが表示されますが、この先はステップ毎に追うことはできないのでしょうか?それとExpressの方も一応試してみましが、 fatal error C1083: include ファイルを開けません。'PceNativeCall.h': No such file or directoryというエラーが出ます。どこをどうしたら良いのか。とりあえず次はどの道を進むべきか。このままGCCで進んだ方が良いのでしょうか? - 風間 (2008年01月26日 17時50分35秒)
  • PceNativeCall の呼び出しの先は、まさに ARMlet 代替 DLL です。ですから、その ARMlet 代替 DLL を動的リンクして関数をコールしている Palm OS Simulator 自体をデバッグしなければならないわけです。念のために書いておきますと、ARMlet 代替 DLL をコールしているのは Palm OS Simulator です。CodeWarrior でデバッグ中の palmware 自身ではありません。CodeWarrior は Palm OS Simulator を利用して palmware をデバッグしているわけですが、ARMlet 代替 DLL をデバッグしたければ、palmware のコンテナでありドライバであるところの Palm OS Simulator 自体をデバッグしなければならないわけです(余計に混乱させてしまったかもしれませんが)。gcc でやるのであれば、gdb を使用して Palm OS Simulator を起動し、対象の palmware を起動して ARMlet コールを発生させることになります。この場合、その palmware は必ずしも CodeWarrior でデバッグしている必要はありません。ちなみに、陰郎はまだ gdb でのデバッグは失敗しています。 - 陰郎 (2008年01月26日 18時45分46秒)
  • 了解しました。重ね重ねありがとうございます。現在とってもめげそうな気分です。どこから手をつけるか。とりあえずもう一度ARMlet関連の書類を熟読してみようと思います。 - 風間 (2008年01月26日 19時42分36秒)
  • 何となく分かったような気になったので、とりあえず実技として、PalmMagazinに掲載されてたARMletFire用のDLLを作成してみようと思います。 - 風間 (2008年01月28日 14時27分28秒)
  • いろいろ試してみたんですが、自力でDLLは挫折してます。makeをすると"no include rule" というエラーが出て先に進みません。多分$(LINK.cc) -shared -o $@ $(OBJS) $(SHAREDLIB_FLAGS) $(LDLIBS)の部分でソースを拾えないみたいです。とりあえずDLLでのデバッグは後回しにして、実際のコードにチャレンジしてみました。それでPACEInterface.hに記述のあるAPIは利用できるのですが、無いものはどうすれば良いのか? 適当にいじりまわしているとARMlet_Runtime.mcpに変更を加えてコンパイルをすることでAPIを追加することが出来るんですね。で、更に調子に乗ってsony の APIも加えたいんですが、これは可能なんでしょうか? PACEInterface.hに#include <SonyCLIE.h>を加えると、LibTraps68K.hが見つかりませんとなります。ところがLibTraps68K.hなるファイルはどこを探しても見つかりません。何か根本的に間違ってますか? それともsony の APIは駄目なんでしょうか? お分かりになる方がおりましたらヒントを頂けませんでしょうか? 何故今更sony のAPIという疑問もあると思いますが、jpegとか読込むのに便利なので使えたら良いなと思ってます。 - 風間 (2008年01月31日 17時43分44秒)
  • わー、PACEInterface.h って ARMlet からコールバックできる Palm OS API のラッパークラスがあるんですね。知らなかった...これまで API のコールバックは全部手作業でやってました。ところで、ARMlet から API をコールバックする正統的(?)な方法は、こちらをお読みになってください。これだと、CoreTraps.h に載っている API なら何でもコールできます。で、一部の API は CoreTraps.h に載っていませんし、ベンダ特有の API もしかりです。これらをコールする確実な方法は、先程と同じページの下半分に載っています。 - 陰郎 (2008年01月31日 20時47分34秒)
  • 基本的に、ベンダ提供のヘッダファイルやソースファイルをイジるのはお勧めしません。何がどう悪さをするかわかりませんので...分かった上でやる分にはもちろん問題ありませんけどね。 - 陰郎 (2008年01月31日 20時49分05秒)
  • 陰郎さん、レスありがとうございます。"ARM コードからの Palm OS API の呼び出し"は何度も読んでるんですが、サッパリ分からなくて(^^; だから、PACEInterface.hをいじくり回してたわけで。何だか手詰まり状態ですね。でも工夫次第でSonyのAPIも使えるというのは朗報です。 - 風間 (2008年01月31日 22時12分49秒)
お名前: コメント:


表示された文字列