PICでUSBを!(知識ゼロからのスタートです)
PIC18F14K50のUSB機能を100%自前のソフトで制御する試みです。しかもアセンブラで!
当記事は2009年12月から「TTLでCPUをつくろう!」というタイトルの もとにほとんど毎日連載をしてきたものを再編集したものです。 2011.7.10

前へ
次へ
目次へ戻る
ホームページトップへ戻る
☆C++でUSB(HID)アクセスプログラムを作成

PIC側のプログラムはC18コンパイラを使わずPICアセンブラで作成しますが、パソコン側のUSB(HID)アクセスプログラムはBorland C++コンパイラで作成します。
しかしこれがまた難物で悪戦苦闘の連続でありました。

[第45回]

●欠落エクスポート…の結末

前回([第44回])、コンパイルOKになったテストプログラムを実行したところ、

HIDTEST1_8_D.EXEファイルは
欠落エクスポートHID.DLL:_HidD_GetAttributes@8にリンクされています

という、これまた全く意味不明のエラーメッセージに遭遇してしまいました。

意味不明ではありますけれど、このエラーメッセージにつきましては、おおよその見当はつきます。
HID.DLLのリンクで何か問題がおきた、ということでしょう。

HID.DLLのリンク、ということですと、すぐに頭に浮かぶのが、[第42回]で作業をしました、HID.LIBです。
HID.LIBはBorland C++のライブラリには含まれていませんでしたので、Win98DDKから持ってきたものを使いました。
そうしましたら、

Error: ’C:CPP¥USB2¥HID.LIB’ contains invalid OMF record,type 0x21(possibly COFF)

というエラーが表示されてしまいました。
どうやらHID.LIBがBorland C++のファイル形式に合わないとのことらしく、その形式を変換するのに、COFF2OMFというソフトを使いました。

一方、[第43回]では、「外部シンボル…が未解決」というエラーが表示されました。
どうやらこれも、HID.DLLにリンクするための、「名前の解決方法」が’C’と’C++’で異なるために、リンクの情報がうまく適合しない、ということのようです。
その対策として、extern ’C’を使いました。

そのようにしてコンパイルまでやっとこぎつけたHIDテストプログラムを実行したところ、「欠落エクスポートにリンクされています」というエラーが出てしまったのですが、いままでのいきさつからして、[第42回]から[第43回]で行った作業のどこかに問題があったのではないか、ということはおおよそ見当がつきます。

このエラーメッセージについては、2月の時点で、表示されることを確認していたようなのですが、どうもはっきり記憶がありません(困ったものです)。
ですから、どのようにして、それを解決したのかも、当然のことながら、全く記憶にないのですけれど、幸いそれをたどるてがかりはありました。

今回のHIDテストプログラムは、今まで説明してきましたように、もうほとほと嫌になるほどのエラーが出て、それをひとつひとつ解決しながら進まなければならなかったこともあって、テスト作業用にいくつかのフォルダを用意して、そこに必要なファイルをコピーしながらカット・アンド・トライを進めてきました。

で、今回の説明のために用意したフォルダでのコンパイル作業では、その結果作成されたEXEプログラムを実行すると、「欠落エクスポート…」というエラーが発生してしまうのですが、2月のころに作業していたフォルダに残されていたEXEファイルを実行しても、エラーは発生しないことが確認できました。
ちゃんと解決済みだったのです。

そこで、エラーが発生するフォルダと発生しないフォルダの中身を比較し、またそれぞれの中身をさらに別のフォルダにコピーしてコンパイル〜実行を試行してみる、という作業をした結果、2月に到達していたであろう解決にふたたび行きつくことができました(やれやれ)。

問題はWin98DDKから持ってきたHID.LIBにありました。
このHID.LIBそのものに問題があるのかどうかはわかりません。
ただ、このファイルのままではBorland C++ではコンパイルできなかったために、COFF2OMFというソフトを使って変換したのですが、その変換後の「HID.LIB」が問題だったようです。

では、それをどのようにして解決したのでしょうか?

じつは、そこで、[第42回]で説明しました、もうひとつのHID.LIBの作成ツール「IMPLIB」を使ったのです。
もとからWINDOWS¥SYSTEMにあるHID.DLLをもとにして、それからIMPLIBによって生成したHID.LIBを使ってコンパイルして作成されたEXEファイルを実行してみたところ、エラーは発生しませんでした。

印象としてはなんとなくIMPLIBよりもCOFF2OMFのほうが確からしいように思えたので、今回も、そして2月の時点でも、最初にまずCOFF2OMFを使ってHID.LIBを変換してしまったために、エラーに遭遇することになったのでした。

COFF2OMFとIMPLIBを使ってHID.LIBを変更、生成してからHIDテストプログラムをコンパイルし、その結果作成されたEXEファイルを実行して、そのことを確認してみました。

COFF2OMFを実行したあと、コンパイルして(bcc32)できた、hidtest.exeを実行すると、エラーが表示されます。

hidcoff.libというのは、WIN98DDKからもってきたhid.libをリネームしたものです([第42回]COFF2OMF)。

IMPLIBを実行したあと、コンパイルしてできた、hidtest.exeを実行すると、エラーは表示されず、正常に実行されました。


ところで、今回の作業ではWindows98SEのWINDOWS¥SYSTEMにあるHID.DLLをもとにして、HIDテストプログラムを作成したことになりますから、果たしてこのプログラムがWindowsXPで正しく動作してくれるのかどうか、そこが気になるところなのですが、WindowsXPでも試してみた結果、問題無く実行できました。

どうやら今度こそ本当に、めでたしめでたし、のようです(やれやれ)。
CPUをつくろう!第472回(2010.4.7upload)を再編集

PICでUSBを![第45回]
2011.7.10upload

前へ
次へ
目次へ戻る
ホームページトップへ戻る