USBKeyboardでフリーズする

24 Apr 2016

USBKeyboardライブラリで困り果てているので、何か情報があれば教えていただけないでしょうか。

Seeeduino Arch Proを使っています。USBKeyboardライブラリ単独の、キーボードエミュレーションするテストプログラムは動作しました。ホストにつながっていない時、USBKeyboardクラスをインスタンス化で、ホストにつなぐまでコンストラクタから制御が返ってこないという仕様にはハマりましたが、わかってしまえば問題なく動作します。

問題は、テストプログラムでは動作するのに、他の制御機構を組み込んだ状態では、USBKeyboardクラスのインスタンス化から制御が返って来なくなるのです。実行の進み具合をSerial出力で確認していますが、USBKeyboardのインスタンス化の後は実行されません。スレッドでLチカしていますが、ホストにつなぐとLチカが止まってフリーズします。Watchdogのリセットはかかります。

さらにわけがわからないのは、このビルドでmainプログラムを元のテストプログラムのものに戻してもこのテストプログラムは動作しなくなることです。ホストにつなぐとフリーズします。別スレッドの制御もフリーズして動かなくなります。プログラムの文面上では完全に復元しているはずなのに、ホストにつなぐとフリーズする実行ファイルになってしまいます。

どこに問題があるか、何かヒントはないでしょうか? よろしくご教授願います。

25 Apr 2016

コードを見てみないと何とも言えないのですが、スレッド制御という事ですので、mbed-rtos ライブラリをお使いでしょうか? コード中で wait() 関数を使用している場合は、Thread::wait() に置き換える必要があると思います。

https://developer.mbed.org/handbook/Wait

Quote:

When you call wait the CPU of your mbed will be busy spinning in a loop waiting for the required time to pass. Using the mbed RTOS you can make a call to Thread::wait instead.

25 Apr 2016

リプライありがとうございます。

コードを見なければ...というのはごもっともですが、どこに問題があるかわからないので、かいつまんで、というわけにもいかず、だからといって他人のソースまるごと見せられても迷惑であろうから控えています。それでも興味があるというのであれば開示しても構いません。

Thread::wait()の件は、使用済みです。お騒がせしてすいません。

どのライブラリが衝突しているかを確かめるために、動作するサンプルプログラムに、本番用のコードを追加してゆき、フリーズするようになったらコードを抜いていって問題を特定しようとしたら、フリーズするコードから全部抜いて、元の動くはずのコードに戻った時点でもフリーズしてしまうので、バンザイしちゃったのです。