Live LinuxでUSBビデオがフレームを削除するのはなぜですか?

Live LinuxでUSBビデオがフレームを削除するのはなぜですか?

Realtime LinuxパッチがインストールされているUbuntu 20.04に4つのUSBカメラを接続すると、約60秒ごとにフレーム損失が発生しました。ユーザーコードioctl(VIDIOC_DQBUF)呼び出しレベルでv4l2_buffer.sequenceバッファをスキップしましたが、エラーが報告されていないことがわかります。奇妙なことに、1台のカメラはスキップされませんが、3台のカメラはすべて別のUSBポートにあるにもかかわらずスキップします。

カーネルのデバッグ情報を見ると、次の情報を見ることができます。

Jan 21 08:48:52 kernel: [ 612.290354] uvcvideo: frame 1955 stats: 0/151/151 packets, 0/0/151 pts (!early initial), 0/151 scr, last pts/stc/sof 0/0/0
Jan 21 08:48:52 kernel: [ 612.291017] uvcvideo: frame 1940 stats: 0/151/151 packets, 0/0/151 pts (!early initial), 0/151 scr, last pts/stc/sof 0/0/0
Jan 21 08:48:52 kernel: [ 612.294264] uvcvideo: frame 1956 stats: 0/9/9 packets, 0/0/9 pts (!early initial), 0/9 scr, last pts/stc/sof 0/0/0
Jan 21 08:48:52 kernel: [ 612.294269] uvcvideo: Marking buffer as bad (error bit set).
Jan 21 08:48:52 kernel: [ 612.294270] uvcvideo: Frame complete (FID bit toggled).
Jan 21 08:48:52 kernel: [ 612.294270] uvcvideo: frame 1957 stats: 0/1/1 packets, 0/0/0 pts (!early !initial), 0/1 scr, last pts/stc/sof 0/1217480818/18547
Jan 21 08:48:52 kernel: [ 612.294272] uvcvideo: Marking buffer as bad (error bit set).
Jan 21 08:48:52 kernel: [ 612.294678] uvcvideo: frame 1958 stats: 0/2/2 packets, 0/0/0 pts (!early !initial), 0/1 scr, last pts/stc/sof 0/1217480818/18547
Jan 21 08:48:52 kernel: [ 612.294682] uvcvideo: Marking buffer as bad (error bit set).
Jan 21 08:48:52 kernel: [ 612.294682] uvcvideo: Frame complete (FID bit toggled).
Jan 21 08:48:52 kernel: [ 612.294683] uvcvideo: frame 1959 stats: 0/1/1 packets, 0/0/0 pts (!early !initial), 0/1 scr, last pts/stc/sof 0/1267616628/19316
Jan 21 08:48:52 kernel: [ 612.294685] uvcvideo: Marking buffer as bad (error bit set).
Jan 21 08:48:52 kernel: [ 612.294686] uvcvideo: Frame complete (EOF found).
Jan 21 08:48:52 kernel: [ 612.294888] uvcvideo: Dropping payload (out of sync).
Jan 21 08:48:52 kernel: [ 612.295094] uvcvideo: Marking buffer as bad (error bit set).
Jan 21 08:48:52 kernel: [ 612.295094] uvcvideo: Dropping payload (out of sync).
Jan 21 08:48:52 kernel: [ 612.295299] uvcvideo: Dropping payload (out of sync).
Jan 21 08:48:52 kernel: [ 612.295509] uvcvideo: Marking buffer as bad (error bit set).
Jan 21 08:48:52 kernel: [ 612.295510] uvcvideo: Dropping payload (out of sync).
Jan 21 08:48:52 kernel: [ 612.295715] uvcvideo: frame 1960 stats: 0/5/5 packets, 2/4/3 pts (!early !initial), 2/3 scr, last pts/stc/sof 1284525428/1284525171/19827

ソースコードを見ると、Frame complete (FID bit toggled)USBドライバがフレーム全体を送信していないことを意味します(そうでなければメッセージを受信した可能性があります)。これは代わりに(EOF found)ログに表示されます。0/2/2 packets0/151/151

今デバッグする方法は? USBドライバに問題があるとは信じ難いです。しかし、スタックにRTLinuxに完全に適していないいくつかのコンポーネントがありますか?

答え1

優先順位の高いタスクやスレッドがUSBカメラ/ポートを妨げる可能性はありますか?

デフォルトでは、PREEMPT_RT(またはメインラインLinuxでスレッド割り込みを使用している場合)では、すべてのIRQスレッドは50 prioおよびSCHED_FIFOで実行されます。したがって、これらのスレッド/タスクをより高い優先順位に設定しないと、他の項目によってプリエンプトされる可能性が高くなります。

たとえば、Linux proaudioユーザーは、他のタスク/スレッドによるプリエンプションまたは中断を防ぐために、常にオーディオインターフェイスをシステムで最高の優先順位に設定します。カメラと重要な作業同様の作業に対してこれを行う必要があります。

もう1つの可能性は、USBポートの1つ/一部に共有割り込みがあることです。これは断続的な中断を引き起こす可能性があります。 procfsの割り込みを見るとわかります。 3台のカメラでドロップアウトが発生するが、1台では発生しないという事実を見ると、バックグラウンドで何かが共有/フォーキングされているようです。

それに加えて、ftraceを使用すると、何が起こっているのか、どの機能が遅延を引き起こすのか、または原因になるのかをよりよく知ることができます。実際に合わないことがわかったら、Latencytopはいくつかのヒントを与えるかもしれません。

編集する:

これらの「uvcvideo:バッファを不良としてマークする(無効なビット設定)」というメッセージは疑わしいようです。 - ここで説明されているように、カメラに適切な値を設定する必要があるかもしれません。

https://stackoverflow.com/questions/17155738/uvcvideo-marking-buffer-as-bad-error-bit-set

失敗した場合、ここでバグレポートを見つけました。https://bugzilla.kernel.org/show_bug.cgi?id=207045この問題を解決するリンクされたパッチがあります。

linux-5.16.2ではまだ動作します。https://lore.kernel.org/lkml/[Eメール保護]/

ハードウェアにこれらの問題がある場合は、この方法が役立ちます。あなたは決して知らない。

関連情報