PICでUSBを!(知識ゼロからのスタートです)
PIC18F14K50のUSB機能を100%自前のソフトで制御する試みです。しかもアセンブラで!
当記事は2009年12月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 |
2011.7.10 前へ 次へ 目次へ戻る ホームページトップへ戻る |
☆C++でUSB(HID)アクセスプログラムを作成 PIC側のプログラムはC18コンパイラを使わずPICアセンブラで作成しますが、パソコン側のUSB(HID)アクセスプログラムはBorland C++コンパイラで作成します。 しかしこれがまた難物で悪戦苦闘の連続でありました。 |
[第42回]
●HIDプログラムのお話の続きです
前回書きましたように、およそ2ヶ月ほども中断しておりました、HIDプログラムのお話の続きから説明を再開することにいたします。
[第40回]の続きから、ということになります。
じつは[第39回]がお話のもとでありまして、あちこちのサイトを参考にさせていただいて、苦労して作り上げた、HID送信プログラムなのですが、コンパイルすると、「外部シンボル …が未解決」、という意味不明のエラーメッセージが出てしまいます。
というところで終わっていました。
でその続きからはじめようと思ったのですけれど。
「ううむ。まてよ。まだほかに、もっといろいろややこしいあれこれの作業をしたはずでは…」
しかしながら、[第40回]を書いたのが、もう2ヶ月も前の2月8日。
そんな昔のことなど思い出せるわけがない。
いえ。そもそも2月8日の時点で、たかだかその2週間ほど前に、もっといろいろしたはずのあれこれを、どうやらきれいに忘れてしまっているらしい、というのが[第40回]の記事なのですから、もうお話にもなにもなりません。
せめてメモていどでも書き残しておけばよいものを、そのときにはやってもやっても意味不明のエラーメッセージが次々に出てくるものですから、完全にパニクッてしまって、メモどころではなかったのです。
そこで、今は痕跡程度となってしまった記憶のカケラをもとにして、ファイルのタイムスタンプを手がかりに、昨日から2日がかりで、再現作業をおこなっておりました。
その結果、HIDプログラムをBorland C++コンパイラでコンパイルするために、不足しているファイルはhidsdi.hとhidpi.hだけではなくて、Hid.libも捜してこなければならないらしい、ということがわかってきました。
むむむ。そういうことまで全部忘れてしまうのですよねえ。困ったものです。
このHid.libもWin98DDKにありました。
もういろいろな作業をしてしまって、インクルードファイルもライブラリファイルもしっかりいじってしまっていますから、当初の状況がどこまで正確に再現できるかは、はっきりいって全く自信がないのですけれど、どうも「外部シンボル…が未解決」というエラーよりも先に、別のこれまたよくわからないエラーがでていたように思います。
●OMF?COFF?
Hid.libのタイムスタンプが新しいものだったので、とりあえずBorlandのincludeフォルダからHid.libを削除してみると、当然のことながら、上のDOSプロンプト内のメッセージのように、「Hid.libが開けません」と表示されてしまいます。
そこで、Win98DDKからHid.libをCopyしてきて、現在作業中のフォルダに貼りつけて、もういちどコンパイラにかけてみますと、上のDOSプロンプト画面にありますように、下のエラーメッセージが表示されます。
Error: ’C:CPP¥USB2¥HID.LIB’ contains invalid OMF record,type 0x21(possibly COFF)
はて、OMF?COFF?
そりゃ、また、いったいなんのこっちゃあ。さっぱりわからんではないかあ。
だから、Cなどやりたくはなかったの!
またまたネットサーフィンであります。
むむむ。なんだかよくはわからないのでありますが、どうやらMicrosoftのライブラリファイルの形式がBorland C++のそれと相違している、ということらしいのですね。
それじゃあ、コンパイルできないじゃないの。
どーすりゃ、いいのさ。
●COFF2OMF
さらにネットでいろいろさぐってみましたら、BorlandのツールにCOFF2OMFなるユーティリティソフトが含まれていることがわかりました。
おお、それはそれは。
んでも、本当にそげなものがあるんかいなあ?
それが本当に実行できるものかどうか、DOSプロンプトで、COFF2OMFと打ち込んでみましたのが、下の図です。
おお。ちゃんと使えるようであります。
では。さっそく。
coff2omf hid.lib hid.lib とやってみましたら、それじゃいかん、というメッセージです。
どうやらインプットファイルとアウトプットファイルが同じじゃいかん、ということのようで。
それじゃあ、ということで、hid.libをhidcoff.libにリネームしてから、再実行してみました。
今度はうまくいったようです。
COFF2OMFは実行が正常に終了したときは、何もメッセージが出ないで終わってしまうようです。
むむ。せめて、’done’とか’OK’とかぐらいは表示されてくれてもよいように思うのですけれど。
念の為にDIRコマンドで確認してみると、おお、ちゃんと作業はしてくれたようです。
これで、Hid.libがBorland C++の形式に直ったはずですから、それからあらためて、コンパイラにかけてみますと、先ほど表示されていた、
Error: ’C:CPP¥USB2¥HID.LIB’ contains invalid OMF record,type 0x21(possibly COFF)
は表示されなくなりました。
そして、あの「外部シンボル…が未解決」というエラーメッセージが表示されるようになります。
●IMPLIB
ネットをいろいろさぐっていましたら、COFF2OMFのほかにも、LIBファイルの変換を行うツールがあることがわかりました。
それがIMPLIBです。
これもBorland C++に含まれています。
COFF2OMFはCOFF形式のLIBファイルを読み込んで、それをOMF形式のファイルに変換して出力する、というものでした。
それに対してIMPLIBは、DLLファイルからLIBファイルを生成してしまう、というもののようです。
ますますよくわからんのでありますけれど。
DLLというのは、ダイナミックリンクライブラリファイルの略語で、アプリケーションの実行時に動的に(ダイナミックに)リンクされて、実行されるファイル、なんだそうです。
実行時にリンクされるのでありますから、コンパイル時にはリンクされません。
んじゃあ、何も無くてもよいか、といいますと、そういうわけにはいかないので、そこで、これこれの関数は、どこそこのDLLにありますから、それは実行時にリンクいたします、という情報をコンパイラに教えます。
それがライブラリファイル、なのだそうです。
当然のことながら、DLLファイルとLIBファイルはペアで存在する、というか、そのように作成されるもの、なのでありますが、そのペアのうちのLIBファイルの形式がちょいと困るので、DLLファイルをもとにしてLIBファイルを作ってしまおう、ということのようです。
ものは試し、ということもありますから、IMPLIBも試してみました。
まずはIMPLIBとだけ打ち込んでみると、下のように表示されます。
確かに、ちゃんとIMPLIBも存在していて使えるようです。
COFF2OMFで変換したHid.libファイルを削除しておいて、IMPLIBを実行しました。
Hid.dllはC:¥WINDOWS¥SYSTEMにありました(そりゃ、そうでしょう。なきゃあ、困ります)。
そのままIMPLIBを実行してみましたが、それではだめなようです。
¥WINDOWS¥SYSTEMにあるHID.DLLを作業中のフォルダにCOPYしてから、もういちど、IMPLIBを実行してみました。
今度はうまくいったようです。
IMPLIBもさきほどのCOFF2OMFと同じで、何事も無く正常に終了した場合には、何のメッセージも表示されないようです。
ちょっと気持ち悪い、です。
でもちゃんとHID.LIBは生成されたようで、HIDプログラムをコンパイルしてみると、「HID.LIBがありません」とは表示されないで、コンパイルは完了するようになります。
そして、「外部シンボル…が未解決」というエラーが表示されました。
ということで、次回こそは本当に、この「外部シンボル…が未解決」というエラーの正体にせまります。
CPUをつくろう!第469回(2010.4.4upload)を再編集
PICでUSBを![第42回]
2011.7.10upload
前へ
次へ
目次へ戻る
ホームページトップへ戻る