Buffer overrun on serial Fedora 16

4

Eu tenho um problema de esmagamento cerebral com o Fedora 16 e minha porta serial.

Eu uso o serial para monitorar um STB no qual estou desenvolvendo. O STB é executado no Linux e, quando inicializado, inicio o programa em que estou trabalhando através da interface serial.

Agora, meu programa gera muitos rastreios quando estou depurando, e recebo muitos erros de buffer overrun em dmesg .

Isso faz com que a aplicação depure a bagunça, porque a saída serial fica ilegível.

Então, o que me incomoda é que quando eu estava rodando no Fedora 15, não havia nenhum buffer !

Mais alguns detalhes sobre minha configuração:

  • Fedora Core 16 em Cinnamon / gnome-terminal para o serial. Uname: 3.2.6-3.fc16.x86_64
  • para conectar a porta serial, eu uso este comando: screen -R -d -t "Serial" /dev/ttyS0 115200

Alguma ideia de como eu poderia consertar isso?

(mais alguns detalhes:)

$ cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:3395 rx:11899157 fe:6 brk:4 oe:3496 RTS|DTR
###                                                               ^^^^^^^
###                                                            overflow errors
1: uart:16550A port:0000EC98 irq:17 tx:32 rx:0 CTS|DSR|CD
2: uart:unknown port:000003E8 irq:4
3: uart:unknown port:000002E8 irq:3

Saída típica de dmegs:

[370425.080452] ttyS0: 24 input overrun(s)
[370426.092382] ttyS0: 30 input overrun(s)
[370427.109291] ttyS0: 36 input overrun(s)
[370428.173344] ttyS0: 28 input overrun(s)
[370429.583198] ttyS0: 26 input overrun(s)
[370430.638700] ttyS0: 32 input overrun(s)

:( :( :(

Saída de sudo setserial -v -a -g /dev/ttyS0 :

/dev/ttyS0, Line 0, UART: 16550A, Port: 0x03f8, IRQ: 4
    Baud_base: 115200, close_delay: 50, divisor: 0
    closing_wait: 3000
    Flags: spd_normal skip_test low_latency
    
por Gui13 02.03.2012 / 16:38

2 respostas

2

De acordo com a documentação do Fedora 16 /etc/rc.serial é responsável por configurar as linhas seriais.

Alguma coisa mudou aqui entre as suas instalações 15 e 16?

Definir "baixa latência" e "rx / tx_trigger" (se possível) pode ajudar.

Lembro que o 16550A tem um buffer de entrada de 15 bytes. De alguma forma, você pode definir em qual nível de preenchimento uma interrupção está sendo gerada - usei 7 bytes para uma troca entre confiabilidade e velocidade (com DOS). Talvez o gatilho rx / tx faça um ajuste comparável.

Atualização 2012-03-12:

Acabei de verificar na minha estação de trabalho (CentOS5 - deve ser comparável ao Fedora):

rpm -qd setserial mostra a documentação disponível. Há um arquivo README e um arquivo rc.serial - veja o README.

Além disso - eu olhei novamente para a sua saída: spd_normal não parece ok para mim. Você quer 115 kb - então você provavelmente deve definir spd_vhi (veja man setserial). A razão para isto é que você não pode solicitar mais de 38,4 kb, já que o padrão UART não permite mais. Mais tarde veio 57.6kb, em seguida, 115kb - tinha que haver um "truque" para definir essas velocidades também.

    
por 11.03.2012 / 22:34
1

Eu me deparei com um problema semelhante. Consegui isolar isso em outro dispositivo competindo pelo tempo de serviço de interrupção. No meu caso, o leitor de cartão SD do meu laptop estava competindo pelo tempo com o meu dispositivo serial. Eu desabilitei o driver do leitor de cartões (rmmod) e os excessos foram embora. Você pode ver os dispositivos no mesmo IRQ usando: cat / proc / interrupts

    
por 29.06.2012 / 02:01