BlueUSBとEthernetInterfaceの組み合わせでエラー

29 Sep 2012

USBとEthernetを組み合わせたプログラムを作成しようと思っていますが、 BlueUSBとEthernetInterface(新しいEthernetライブラリ)を同時に利用すると
" Unable to automatically place AT section USBHost.cpp.LPC1768.o(.ARM.__AT_0x2007C000) with required base address 0x2007c000. Please manually place in the scatter file using the --no_autoat option."
というエラーが出て困っています。

blueUSBをIMPORTしてMassStorageの部分を削除でコンパイル=>OK!
mbed-rtosをImportしてコンパイル=>OK!
EthernetInterfaceをImportしてコンパイル=>ERROR!
になります。
ソースは元のBlueUSBからMassStorageの部分を削除しているだけで、他は変更していません。
BlueUSBのUSBHost.cppの896行の領域確保している部分が、問題だと思っています。
static HostController _controller __attribute__((at(USB_RAM_BASE)));

static HostController _controller __attribute__((section(".ARM.__AT_0x2007C000")))
に変更しても同様のもエラーが発生します。
どなたか解決方法を知っている方がおられましたら、教えてもらえませんか。

29 Sep 2012

EthernetInterfaceがAHBSRAM0も使っているからエラーになります。 static HostController _controller をAHBSRAM0以外の256バイト境界に配置して、 USBGetBuffer() または OnBluetoothInsert() を修正すればいいと思います。

30 Sep 2012

オカモト様
アドバイスありがとうございます。
USBHost.cpp
895行目付近の
static HostController _controller __attribute__((at(USB_RAM_BASE)));

static __align(256) HostController _controller __attribute__((section("AHBSRAM1")));
に変更することで、解決しました(動作しました)。 ありがとうございました。

(参考までに)
次に、mbed-rtosとの不具合が発生しました。現象は、最初から接続している機器(1台目)は認識できるのですが、 途中で接続したときの認識や、HUB経由で子接続のときに認識しないようです。
調べていったら、タイムアウトみたいな感じで、途中で処理が終了してしまいます。
途中というのは、debugのために追加したprintfの文字列が表示途中で動作が止まる。前のprintfの文字の長さを変えると場所が変わるので、printf自体には問題ありません。

mbed-rtosをImportする前は問題なく、Importした後に同様の症状が出るのを確認しましたので、mbed-rtosの影響だと思われます。

なるべく処理を少なくするために、USBHost.cppの6行目付近を
#define USBLOG 0
にしてログを出さないように変更してOKになりました。 構成は USB Hub1台 + 子[Fujitsu スマートコンセント FX-5204PS]2台

30 Sep 2012

そのほかのメモ
BlueUSBを使うときに気をつけるべき点。。
・初期化にあまり時間をかけない事。(無応答になります)
・一回のループでデータをたくさん呼ぶと、おかしな結果が返ってきます。USBloopを適当に挟むこと。

RTOSを利用しているのwaitやtickを利用できません。ThreadのThread::waitやスレッドタイマーを利用します。