組み込み Linux 環境で、Zigbee デバイスのペアリング/バインディングに関連する非常にタイミングに敏感な問題をデバッグしています。
私たちのアーキテクチャは、データが SPI インターフェイスを介して Zigbee フロント エンド モジュールから読み取られ、処理のためにカーネル空間からユーザー空間に渡されるようなものです。処理されたデータと応答はカーネル空間に戻され、SPI インターフェイスを介して再びクロックアウトされます。
Zigbee 802.15.4 のタイミング要件では、19.5 ミリ秒以内に応答する必要があると指定されており、このウィンドウのすぐ外側で応答する状況が頻繁に発生し、ネットワークで障害やパケット損失が発生します。
Linux カーネルはプリエンプションが有効な状態で実行されておらず、プリエンプションも有効にできない可能性があります。
私の疑いでは、カーネルはプリエンプティブルではないため、ioctl() インターフェイスを使用している別のタスク/プロセスがあり、これが Zigbee アプリケーションを 19.5 ミリ秒のウィンドウを超えるのに十分な時間遅らせているのではないかと考えています。
私は次のツールを試しました
- oprofile - システム全体をプロファイリングするため、ここではあまり役に立ちません。この間、アプリケーションは少量のデータを移動するため、実際にはそれほどビジーではありません。
- strace - オーバーヘッドが多すぎます。使用経験があまりないので、出力を改善できるかもしれません。オーバーヘッドがパフォーマンスに大きく影響するため、アプリケーションはまったく機能しません
このようなシステムをプロファイリングする他の軽量な方法はありますか?
別のタスク/スレッドでioctl呼び出しが保留されているときにキャッチする方法はありますか? (これが問題の根本原因であると仮定します)