Проблема с нестандартным драйвером Ethernet

Не знаю, актуален ли этот вопрос здесь или к суперпользователю, но все равно задавайте.

Ниже я упомянул настройку - система настольного ПК Linux. К нему подключена одна пользовательская плата разработки FPGA. В этой FPGA реализован и исполняется IP-адрес сетевой карты Ethernet. Эта плата подключается к плате разработки FPGA с помощью USB-порта, USB-кабеля и последовательного кабеля. По сути, вся эта установка тестирует сетевую карту на основе FPGA и связанные с ней драйверы Ethernet, реализованные на ней.

Есть много приложений, которые запускаются на главном компьютере с Linux и отправляют данные на карту Ethernet n / w на базе FPGA, которая принимает их, выполняет необходимую обработку и отправляет на физический уровень, реализованный на FPGA, который затем отправляет их через сеть Ethernet к какому-либо другому узлу / устройству в сети.

Эта настройка работает нормально, даже когда несколько приложений с главного компьютера отправляют данные на сетевую карту FPGA. В качестве одного из приложений я использую проигрыватель VLC на базе Linux (это мультимедийный проигрыватель) для воспроизведения некоторых мультимедийных потоков с хоста Linux, и эти данные отправляются на сетевую карту FPGA. В проигрывателе VLC я ищу (назад / вперед) поток, используя элементы управления проигрывателя vlc. Когда я выполняю эту операцию поиска постоянно, это делает хост-компьютер linux. зависание / зависание. Никакое устройство ввода-вывода не работает, работает только перезагрузка.

Теперь я попытался просмотреть журналы в хосте linux pc / var / log (dmesg), чтобы узнать, понимаю ли я, какой процесс / приложение вызвало зависание, но я не мог получить от него никаких данных.

  1. Как мне продолжить изолировать различные компоненты (программное обеспечение, оборудование), задействованные во всей моей настройке, чтобы сузить поиск основной причины проблемы?

  2. Есть ли способ связаться с зависшим Linux-хостом с помощью каких-либо средств (последовательный кабель или какое-либо другое соединение, чтобы получить от него какие-либо данные, когда он зависает?

  3. Какие шаги я должен выполнить? Как я могу определить, является ли проблема приложением VLC, драйвером сетевой карты FPGA или чем-то еще?

Любые указатели пригодятся.

Спасибо.

-AD.


person goldenmean    schedule 17.12.2009    source источник
comment
Общая рекомендация - если вы пишете код, он здесь. Если вы настраиваете, он принадлежит суперпользователю.   -  person Dave Swersky    schedule 17.12.2009
comment
В настройке, о которой я спрашивал, я написал код, то есть прошивку Ethernet на основе FPGA.   -  person goldenmean    schedule 17.12.2009


Ответы (2)


Вы упомянули, что хост Linux завис. Сначала я бы определил, действительно ли он заблокирован в ядре или есть какие-то процессы в пользовательском пространстве, потребляющие слишком много ЦП.

Можно ли проверить связь с хостом (желательно на интерфейсе, отдельном от вашей карты Ethernet FPGA)? Если он отвечает, ядро ​​не заблокировано.

Проблема с оборудованием?

Если возможно, можно ли временно изменить настройку, чтобы удалить карту Ethernet FPGA и затем воспроизвести проблему? Я бы сделал это, чтобы помочь изолировать проблемы, конкретно связанные с оборудованием (FPGA Ethernet).

Проблема с пользовательским пространством (программным обеспечением)?

Если вы удалите VLC из уравнения, сможете ли вы получить блокировку / зависание, используя другой метод генерации трафика Ethernet?

Вы можете попробовать создать оболочку, которая будет работать с более высоким приоритетом, чтобы получать данные, когда кажется, что система зависает. Возможно, запустив top в этой высокоприоритетной оболочке, вы сможете определить, кто, если кто-нибудь, использует весь ЦП. Вы можете запустить эту оболочку по сети (telnet / ssh) или через последовательный терминал.

#include <errno.h>
#include <sched.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    struct sched_param scheduling_parameters;

    scheduling_parameters.sched_priority = 10;

    if (sched_setscheduler(getpid(), SCHED_FIFO, &scheduling_parameters) < 0) {
        printf("error is %d\n", errno);
    }

    execlp("/bin/bash", "bash",0, 0, 0, 0);

    return 0;
}

Проблема с ядром (программным обеспечением)?

Вы можете включить волшебный ключ sysrq и проверить состояние системы и перейти оттуда. Разработчики ядра используют этот интерфейс для отладки своего программного обеспечения. Параметр CONFIG_MAGIC_SYSRQ должен быть включен во время компиляции ядра, чтобы использовать эту функцию.

После эмпирического сужения ошибки до конкретного модуля printk () по-прежнему остается хорошим ресурсом.

Также может быть полезно включить отладчик ядра (KDB) и подключиться к нему через последовательный кабель.

person jschmier    schedule 17.12.2009

@Jscheimer: спасибо за подробные указания по моей проблеме. После долгой отладки и некоторых дискуссий с другими разработчиками системы на рабочем месте я наконец нашел основную причину. Во всей этой настройке присутствует периферийное устройство DMA. DMA был настроен для согласованного доступа, но где-то при передаче данных он получал невыровненный адрес из-за того, что я не проверял выравнивание буфера в коде, что вызывало зависание / зависание. И в этом поведении не было никаких закономерностей.

person goldenmean    schedule 20.12.2009