나는 직렬 포트에서 빠른 전송 속도로 많은 데이터를 보내는 간단한 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;
}