Pergunta

Não sei se essas perguntas são relevantes aqui ou superusuário, mas pergunte de qualquer maneira.

Eu mencionei a configuração abaixo- um sistema de PC para desktop Linux. Para isso, está conectado uma placa de desenvolvimento FPGA personalizada. Neste FPGA, há um IP da placa de rede Ethernet realizado e executando. Esta placa está conectada à placa de desenvolvimento FPGA usando o cabo USB portas-USB e o cabo serial. Essencialmente, toda essa configuração testa a placa de rede baseada em FPGA e os drivers Ethernet associados realizados nele.

Existem muitas aplicações que são executadas no PC do Host Linux e enviam os dados para o cartão Ethernet N/W baseado em FPGA, que o aceita, faz o processamento necessário e envia para a camada física realizada no FPGA, que o envia sobre o Rede Ethernet para algum outro nó/dispositivo na rede.

Essa configuração funciona bem, mesmo quando vários aplicativos do host-PC enviam dados para a placa de rede FPGA. Como um dos aplicativos, uso um player VLC baseado em Linux (é um jogador multimídia) para reproduzir alguns fluxos multimídia do host Linux e esses dados são enviados para a placa de rede FPGA. No Player VLC, procuro (reverter/ encaminhar) o fluxo usando os controles do player VLC. Quando faço essa operação de busca continuamente, ele torna o PC do host Linux. pendurar/congelar. Não há trabalho de dispositivo de E/S, apenas a reinicialização funciona.

Agora eu tentei ver os logs no host Linux PC/var/log (DMESG) para ver se eu recebo uma pista sobre o processo/aplicativo causou o congelamento, mas não consegui obter nenhuma entrada dele.

  1. Como faço para isolar diferentes componentes (software, hardware) envolvidos em toda essa configuração minha para restringir a causa raiz do problema?

  2. Existe alguma maneira de se comunicar com o host linux congelado por meio de alguns meios (cabo serial ou alguma outra conexão para obter qualquer dados dele quando pendurar?

  3. Que etapas eu devo seguir? Como posso saber se o aplicativo VLC é um problema ou o driver da placa de rede FPGA é um problema, ou a outra coisa?

Quaisquer indicadores serão úteis.

Obrigado.

-DE ANÚNCIOS.

Foi útil?

Solução

Você menciona que o host Linux está congelado. Primeiro, eu determinaria se está realmente bloqueado no kernel ou se há alguns processos espaciais do usuário que consomem muito CPU.

O host pode ser pingado (de preferência em uma interface separada do seu cartão Ethernet FPGA)? Se responder, o kernel não está trancado.

Problema de hardware?

Se possível, a configuração pode ser alterada temporariamente para remover o cartão FPGA Ethernet e depois reproduzir o problema? Eu faria isso para ajudar a isolar problemas especificamente relacionados ao hardware (FPGA Ethernet).

Problema de espaço do usuário (software)?

Se você remover o VLC da equação, ainda poderá obter o bloqueio/pendurar usando outro método para gerar tráfego Ethernet?

Você pode tentar criar um shell que seja executado com uma prioridade mais alta para recuperar dados quando o sistema parece pendurar. Talvez, executando o top neste shell de alta prioridade, você possa determinar quem, se alguém, está usando toda a CPU. Você pode executar esse shell pela rede (telnet/ssh) ou através de um terminal serial.

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

Problema do kernel (software)?

Você pode ativar o Chave Magic Sysrq e examine o estado do sistema e vá a partir daí. Os desenvolvedores do kernel usam essa interface para depurar seu software. A opção config_magic_sysrq deve ser ativada no tempo de compilação do kernel para usar essa funcionalidade.

Depois de estreitar empiricamente um bug em um módulo específico, o printk () ainda é um bom recurso.

Também pode ser útil ativar o depurador do kernel (Kdb) e conecte -se a ele através de um cabo serial.

Outras dicas

@Jscheimer: Obrigado por um ponteiro detalhado sobre o meu problema. Após muita depuração e algumas discussões com outros desenvolvedores de sistemas no local de trabalho, finalmente encontrei a causa raiz. Há um periférico DMA que entra em cena em toda essa configuração. O DMA foi comparado para acesso alinhado, mas em algum lugar em alguma transferência de dados estava recebendo um endereço inalignado, como resultado de não verificar o alinhamento do buffer por mim no código, que estava causando o Hang/Freeze. E não havia padrão para esse comportamento.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top