긴 직렬 데이터 청크를 tty 장치로 보낼 때 5us-20us 대기 시간 간격의 원인이 될 수 있습니까?

긴 직렬 데이터 청크를 tty 장치로 보낼 때 5us-20us 대기 시간 간격의 원인이 될 수 있습니까?

나는 직렬 포트에서 빠른 전송 속도로 많은 데이터를 보내는 간단한 C 프로그램을 가지고 있습니다. 실제로 포트에서 나오는 비트를 살펴보면 블록 시작 근처(6ms에서 20ms 사이)에 있는 직렬 바이트에 거의 항상 간격이 있고 너비가 약 몇 바이트 정도 지속된다는 것을 알 수 있습니다. 바이트(5us - 20us).

여기 사진이 있습니다...

데이터 격차의 범위 보기

각 전송에서 최대 1개의 간격만 발생하며, 일단 발생하면 나머지 100ms 길이의 전송은 중단되지 않습니다. 블록을 보낼 때 10번 중 9번은 공백이 있습니다.

바이트 사이에는 항상 간격이 발생하므로 수신 컴퓨터에 손상된 바이트로 표시되지 않으며 일반적인 직렬 통신에서는 문제가 되지 않습니다(소량의 처리량을 잃지 않는 한). 신호가 연속되어야 하는 비일상적인 애플리케이션에서 직렬 포트를 사용하고 싶기 때문입니다.

처음에는 이것이 일정 문제일지도 모른다고 생각했지만, 이 프로세스를 최적화해도 격차에 아무런 영향을 미치지 않는 것 같습니다. 머신에서 실행 중인 다른 준비된 프로세스가 없습니다.

pi@raspberrypi ~ $ ps all
F   UID   PID  PPID PRI  NI    VSZ   RSS WCHAN  STAT TTY        TIME COMMAND
4     0  2101     1  20   0   3744   804 n_tty_ Ss+  tty1       0:00 /sbin/getty
4     0  2102     1  20   0   3744   804 n_tty_ Ss+  tty2       0:00 /sbin/getty
4     0  2103     1  20   0   3744   804 n_tty_ Ss+  tty3       0:00 /sbin/getty
4     0  2104     1  20   0   3744   804 n_tty_ Ss+  tty4       0:00 /sbin/getty
4     0  2105     1  20   0   3744   804 n_tty_ Ss+  tty5       0:00 /sbin/getty
4     0  2106     1  20   0   3744   804 n_tty_ Ss+  tty6       0:00 /sbin/getty
0  1000 16370 27290  20   0   4136   956 -      R+   pts/1      0:00 ps all
0  1000 27290 27289  20   0   8252  5508 wait   Ss   pts/1      1:04 -bash
pi@raspberrypi ~ $ ./sendzeros /dev/ttyAMA0
Please start with ./sendzeros /dev/ttyS1 (for example)

저는 이 격차의 원인을 파악하고 이를 없애기 위해 노력하고 있습니다. 가능한 원인에 대한 아이디어가 있습니까?

다음 단계는 UART 버퍼를 가득 채운 상태로 직접 유지하는 인터럽트 트리거 장치 드라이버를 작성하는 것이지만 가능하다면 사용자 영역에 머무르는 것을 선호합니다. 나도 지금 알고 싶습니다. 그러면 커널에서 대기 시간의 원인이 어디에서 나오는지 더 잘 이해할 수 있습니다.

머신은 Raspbian을 실행하는 Raspberry Pi(gasp)입니다.

관련성이 있을 수 있는 경우를 대비한 코드는 다음과 같습니다.

#include <string.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <termios.h>


#define COUNT 24000             // Number of bytes to send...

int main(int argc,char** argv)
{
        struct termios tio;
        int tty_fd;

        printf("Please start with %s /dev/ttyS1 (for example)\n",argv[0]);

        tty_fd=open(argv[1], O_WRONLY );

        tcgetattr(tty_fd,&tio);

        tio.c_iflag=0;
        tio.c_oflag=0;
        tio.c_cflag=CS8|CREAD|CLOCAL;           // 8n1, see termios.h for more $
        tio.c_lflag=0;

        cfmakeraw( &tio );

        int ssr = cfsetospeed(&tio,  B2500000 );

        tcsetattr(tty_fd,TCSANOW,&tio);

        // This bit pattern makes it possible to see disruptions on an attached$

        char buffer[ COUNT ];

        memset( buffer , 0 , sizeof(buffer ) );

        write(tty_fd,&buffer,sizeof(buffer));                     // if new dat$

        close(tty_fd);

        return EXIT_SUCCESS;
}

관련 정보