Possíveis fontes de lacuna de latência 5us-20us ao enviar um bloco longo de dados seriais para o dispositivo tty?

2

Eu tenho um programa C trivial que apenas envia um grande bloco de dados para a porta serial a uma taxa de transmissão rápida. Ao olhar para os bits que realmente saem da porta, vejo que há quase sempre uma lacuna nos bytes seriais que chega perto do início do bloco (entre 6ms e 20ms) e dura aproximadamente a largura de um par de bytes. bytes (5us - 20us).

Aqui está uma foto ...

Adiferençasóvemnomáximo1vezportransmissãoe,umavezqueissoacontece,orestodatransmissãode100msdecomprimentoéininterrupta.Aslacunasacontecemcercade9em10vezeseuenvioumbloco.

Alacunasempreocorreentrebytes,portanto,nãoapareceriaemumcomputadorreceptorcomobytescorrompidosenãoseriaumproblemaparaacomunicaçãoserialnormal(excetoquevocêestáperdendoumapequenaquantidadedetaxadetransferência),maséimportantemeuaplicativoporqueeuquerousaraportaserialemumaplicativonãoconvencional,ondeosinalprecisasercontínuo.

Nocomeçoeupenseiquepoderiaserumproblemadeagendamento,masoprocessoparecenãoternenhumefeitosobrealacuna.Nãoháoutrosprocessosprontosemexecuçãonamáquina.

pi@raspberrypi~$psallFUIDPIDPPIDPRINIVSZRSSWCHANSTATTTYTIMECOMMAND40210112003744804n_tty_Ss+tty10:00/sbin/getty40210212003744804n_tty_Ss+tty20:00/sbin/getty40210312003744804n_tty_Ss+tty30:00/sbin/getty40210412003744804n_tty_Ss+tty40:00/sbin/getty40210512003744804n_tty_Ss+tty50:00/sbin/getty40210612003744804n_tty_Ss+tty60:00/sbin/getty0100016370272902004136956-R+pts/10:00psall01000272902728920082525508waitSspts/11:04-bashpi@raspberrypi~$./sendzeros/dev/ttyAMA0Pleasestartwith./sendzeros/dev/ttyS1(forexample)

Estoutentandodescobrirdeondevemessalacunanaesperançadeeliminá-la.Algumaidéiasobreoquepodeseracausa?

OpróximopassoseráescreverumdriverdedispositivoacionadoporinterrupçãoquemantenhaosbuffersdaUARTdiretamentecheios,maseuprefeririaficarnailhaseissoforpossível.Eutambémgostariaapenasdesabernestemomento,mesmoassim,paraqueeupossaentendermelhorondeasfontesdelatênciacomoessapodemvirdokernel.

AmáquinaéumRaspberryPirodandoRaspbian(wheezy).

Aquiestáocódigo,casosejarelevante...

#include<string.h>#include<stdlib.h>#include<stdio.h>#include<unistd.h>#include<fcntl.h>#include<termios.h>#defineCOUNT24000//Numberofbytestosend...intmain(intargc,char**argv){structtermiostio;inttty_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;
}
    
por bigjosh 02.08.2014 / 07:29

0 respostas