Потенциальные источники задержки задержки 5us-20us при отправке длинного блока последовательных данных на устройство tty?

У меня есть тривиальная программа на C, которая просто отправляет большой блок данных из последовательного порта с быстрой скоростью передачи в бодах. Когда мы смотрим на биты, которые действительно выходят из порта, я вижу, что почти всегда есть пробел в последовательных байтах, который приближается к началу блока (между 6 мс и 20 мс в) и длится около одной пары байты (5us – 20us).

Вот фотография …

Сфера охвата разрыва данных

Зазор возникает не более 1 раз за передачу, и как только это произойдет, остальная часть длится 100 мс. Пробелы происходят примерно в 9 из 10 раз. Я посылаю блок.

Разрыв всегда происходит между байтами, поэтому он не будет отображаться на принимающем компьютере как поврежденные байты и не будет проблемой для нормальной последовательной связи (за исключением того, что вы теряете крошечную пропускную способность), но это важно в моем приложении, потому что Я хочу использовать последовательный порт в нетрадиционном приложении, где сигнал должен быть непрерывным.

Сначала я, хотя это может быть проблема с планированием, но приятный процесс, похоже, не влияет на разрыв. На машине нет других готовых процессов.

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, но я предпочел бы оставаться в пользовательской области, если это вообще возможно. Я просто хотел бы знать на этом этапе даже просто, чтобы я мог лучше понять, где источники латентности, подобные этому, могут появиться в ядре.

Машина представляет собой малину Pi, бегущую на распийском (хриплый).

Вот код, если он может быть уместным …

 #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; } 

Linux и Unix - лучшая ОС в мире.