Переполнение буфера на Fedora 16 serial

У меня проблема с разбивкой мозга с Fedora 16 и моим последовательным портом.

Я использую серию для мониторинга STB, на котором я разрабатываю. STB работает в Linux, и при загрузке я запускаю программу, над которой я работаю через последовательный интерфейс.

Теперь моя программа выводит много трасс, когда я отлаживаю, и я получаю множество ошибок buffer overrun в dmesg .

Это делает отладку приложения беспорядочной, потому что последовательный вывод становится нечитаемым.

Итак, меня беспокоит то, что когда я работал на Fedora 15, переполнения буфера вообще не было !

Некоторые подробности о моей настройке:

  • Fedora Core 16 под Cinnamon / gnome-terminal для последовательного порта. Uname: 3.2.6-3.fc16.x86_64
  • для подключения последовательного порта, я использую эту команду: screen -R -d -t "Serial" /dev/ttyS0 115200

Любая идея, как я мог это исправить?

(некоторые подробности 🙂

 $ 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 

Типичный выход 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) :( :( :( 

Выход 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 

Согласно документации Fedora 16 /etc/rc.serial отвечает за настройку последовательных линий.

Что-то изменилось здесь между вашими установками 15 и 16?

Установка «низкая латентность» и «rx / tx_trigger» (если возможно) может помочь.

Я помню, что 16550A имеет буфер с 15 байтами ввода. Как-то вы можете установить, на каком уровне заполнения генерируется прерывание – я использовал 7 байтов для компромисса между надежностью и скоростью (с DOS). Возможно, rx / tx-trigger о сопоставимой настройке.

Обновление 2012-03-12:

Я просто проверил на своей рабочей станции (CentOS5 – должен быть сопоставим с Fedora):

rpm -qd setserial показывает доступную документацию. Существует README и образец файла rc.serial – см. README.

Кроме того, я снова посмотрел на ваш результат: spd_normal не выглядит нормально для меня. Вы хотите 115 kb – поэтому вы должны установить spd_vhi (см. Man setserial). Причина этого в том, что вы не можете запросить более 38,4 kb, поскольку стандарт UART не позволяет больше. Позже появился 57.6kb, а затем 115kb – для установки этих скоростей тоже должен был быть «трюк».

У меня возникла аналогичная проблема. Я смог выделить это на другое устройство, конкурирующее за время обслуживания прерывания. В моем случае устройство чтения карт памяти моего ноутбука конкурировало во времени с моим серийным устройством. Я отключил драйвер считывателя карт (rmmod), и перерасходы исчезли. Вы можете видеть устройства в одном и том же IRQ, используя: cat / proc / interrupts