7

Ubuntu 12.04 を実行している BeagleBoard xM rev C で ftd2xx を使用するプログラムを実行する必要があります。here で提供されている ARM ライブラリ libftd2xx.so を使用しようとしています。libFTDI はオプションではありません。

私が気付いた違いはreadelf -hA、libftd2xx.so で実行した場合と、BeagleBoard で動作する他のライブラリを実行した場合です。アーキテクチャ固有のセクションでは、OS 名を他のライブラリの「7-A」ではなく ftd2xx の「ARM926EF-S」として、CPU_arch を「v7」ではなく「v5TEJ」として指定します。

これは、ライブラリが ARM v5 命令セット用であり、BeagleBoard が ARM v7 を実行していることを意味していると思います。ftd2xx を動作させる方法はありますか?

編集: ARM7 には ARM5 との下位互換性があると言われましたが、それでも問題は解決しません。

注意すべきもう 1 つの点はldd libftd2xx.so、BeagleBoard で実行すると、依存関係が一覧表示されず、出力されnot a dynamic executableますが、他のライブラリでは機能することです。

編集2:

この問題は、ソフト vs ハード フロート ABI にあるようです。BeagleBoard xM に gnueabihf イメージがあります。静的な libftd2xx.a を使用してサンプル プログラムをコンパイルしようとすると、次のようなメッセージが多数表示されます。

/usr/bin/ld: error: static_link_uses VFP register arguments, libftd2xx.a(file.o) does not
/usr/bin/ld: failed to merge target specific data of file libftd2xx.a(file.o)

mfloat-abi=softormfloatabi=softfpでコンパイルしようとすると、

In file included from /usr/include/stdio.h:28:0,
from main.c:12:
/usr/include/features.h:324:26 fatal error: bits/predef.h: No such file or directory
compilation terminated

arm-linux-gnueabiの代わりにクロスコンパイルも試みましarm-linux-gnueabihfたが、結果のプログラムは BeagleBoard で実行されません。私にできることはありますか、それとも不可能ですか?

- - - - - 解決 - - - - - - - -

いくつかの問題の後、FTDI は動作するライブラリのハード フロート バージョンを提供してくれました。多くの人が個別にリクエストした後、ここに提供します。

https://s3.amazonaws.com/hayk-public/arm926-hf.zip

4

2 に答える 2

3

v5TEJ は、v7-A 命令セットのサブセットです。

コードの実行は少し遅くなり、必要以上に大きくなる可能性がありますが、不正な命令などによってクラッシュすることなく動作するはずです。ごくわずかな例外を除いて、ARM コードは以前の命令セットと下位互換性があります。

お使いのプラットフォームでコードが機能しない場合は、USB サブシステムへのアクセス権がないなどの別の原因が考えられます。

于 2013-03-09T07:32:20.777 に答える
2

ARM926 プロセッサでの私の pastebin出力strace参照してください。libftd2xx1.1.12ldd内のバイナリには複数のプロセッサがあります。を使用していることを確認してください。eglibc と Linux 2.6.36 を使用して、ARM926 CPU でバイナリを実行できます。release/build/arm926statictest

出力からldd、次のライブラリが必要です。

  • libdl.so.2- 動的ローディング。
  • librt.so.1- リアルタイム ライブラリ
  • libpthread.so.0-pスレッド
  • libgcc_s.so.1- gcc ヘルパー。
  • libc.so.6- eglibc ライブラリ
  • ld-linux.so.3- Linux 共有ライブラリ ローダー。

関数lddは必要なく、次のコマンドでライブラリが表示されます。

LD_TRACE_LOADED_OBJECTS=1 LD_WARN=yes LD_BIND_NOW=yes LD_VERBOSE=yes \
 /lib/ld-linux.so.3 ./libftd2xx.so.1.1.12 

statictestバイナリが機能することを確認します。その場合は、その場所に設定LD_LIBRARY_PATHしてみてください。release/build/arm926/libftd2xx.so.1.1.12出力からstrace、パス/lib/tls/v5lおよび/lib/tlsが よりも優先され/libます。上記のライブラリはすべて に含まれている必要があり/libます。lnそれらをその場所に (ハードリンク)しようとすることができます。また、strace出力から、/proc/bus/usbファイルシステムをマウントする必要があります。これはカーネル構成オプションです。 /sys/bus/usb/devicesデバイスを見つけるために広く使用されています。これが Ubuntu 12.04 ARM Linux にない可能性は低いです。libd2xx_table.so非標準の USB 記述子を見つけるために使用される可能性が最も高いもあります。

最後に、問題をより詳しく説明していただけると助かります。プログラムを実行しようとしても出力がありませんか? または、プログラムを実行すると例外が発生しますか? statictest ARMバイナリの実行に失敗した場合、元の想定が正しい可能性があります。古い 2.6.32 カーネル (または ld-linux.so) にはARM926EJ-S互換性があるが、新しい Ubuntu 12.04 には互換性がない可能性があります。この場合、man ld-linuxPC ホストで使用してld-linux.so環境変数を表示します。具体的にはLD_DEBUGLD_ASSUME_KERNELバイナリをロードするようにローダーを誘導するのに役立つ場合があります。

于 2013-03-14T14:30:43.673 に答える