라이브 Linux에서 USB 비디오가 프레임을 삭제하는 이유는 무엇입니까?

라이브 Linux에서 USB 비디오가 프레임을 삭제하는 이유는 무엇입니까?

Realtime Linux 패치가 설치된 Ubuntu 20.04에 4개의 USB 카메라를 연결하면 약 60초마다 프레임 손실이 발생했습니다. 사용자 코드 ioctl(VIDIOC_DQBUF)호출 수준 에서 v4l2_buffer.sequence버퍼를 건너뛰었지만 오류가 보고되지 않음을 알 수 있습니다. 이상하게도 한 대의 카메라는 건너뛰지 않지만, 세 대의 카메라는 모두 다른 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 사용자는 다른 작업/스레드에 의해 선점되거나 중단되는 것을 방지하기 위해 항상 오디오 인터페이스를 시스템에서 가장 높은 우선 순위로 설정합니다. 카메라 및 중요한 작업 유사한 작업에 대해 이 작업을 수행해야 합니다.

또 다른 가능성은 USB 포트 중 하나/일부에서 공유 인터럽트가 있다는 것입니다. 이로 인해 간헐적인 중단이 발생할 수도 있습니다. procfs의 인터럽트를 보면 알 수 있습니다. 3대의 카메라에서 드롭아웃이 발생하지만 한 대에서는 발생하지 않는다는 사실을 보면 백그라운드에서 무언가가 공유/포킹되고 있는 것 같습니다...

그 외에도 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/[이메일 보호됨]/

하드웨어에 이러한 문제가 있는 경우 이 방법이 도움이 될 수 있습니다. 당신은 결코 알지 못합니다.

관련 정보