我不知道这些问题在这里是否与超级用户有关,但无论如何都要问。
我有下面提到的设置 - 一个Linux桌面PC系统。为此,连接了一个定制的FPGA开发板。在这个FPGA中,有一个以太网网卡实现并执行。该板通过USB端口-USB电缆和串行电缆连接到FPGA开发板。基本上,这整个设置测试基于FPGA的网卡以及在其上实现的相关以太网驱动程序。
有许多应用程序在主机linux pc上运行并将数据发送到基于FPGA的以太网n / w卡,它接受它,进行必要的处理并发送到FPGA上实现的物理层然后发送它通过以太网网络连接到网络上的其他节点/设备。
即使来自主机-PC的多个应用程序将数据发送到FPGA网卡,此设置也能正常工作。作为其中一个应用程序,我使用基于Linux的VLC播放器(它的多媒体播放器)播放来自Linux主机的一些多媒体流,并将数据发送到FPGA网卡。在VLC播放器中,我使用vlc播放器控件搜索(反向/前进)流。当我这样做,不断寻求操作,它使linux主机pc。杭/冻结。没有i / o设备工作,只有重启工作。
现在我试图在linux主机pc / var / log(dmesg)中查看日志,看看我是否得到了关于什么进程/应用程序导致冻结的线索,但我无法从中得到任何输入。
如何继续隔离我的整个设置中涉及的不同组件(软件,硬件)以缩小问题的根本原因?
有没有办法通过某种方式与冻结的linux-host进行通信(串口线或其他连接,以便在挂起时从中获取任何数据?
我应该遵循哪些步骤?如何判断VLC应用程序是否存在问题或者FPGA网卡驱动程序是否存在问题或其他问题?
任何指针都很有用。
感谢。
-AD。
答案 0 :(得分:2)
您提到Linux主机已被冻结。我首先要确定它是否实际上被锁定在内核中,或者是否有一些用户空间进程消耗了太多的CPU。
主机是否可以ping通(最好是在与FPGA以太网卡分开的接口上)?如果它回复,则内核不会被锁定。
如果可能,可以暂时更改设置以删除FPGA以太网卡,然后重现问题吗?我这样做是为了帮助隔离与硬件相关的问题(FPGA以太网)。
如果从等式中删除VLC,您是否仍然可以通过使用其他方法生成以太网流量来实现锁定/挂起?
您可以尝试创建以更高优先级运行的shell,以便在系统挂起时检索数据。也许通过在这个高优先级shell中运行top,您可以确定谁(如果有人)正在使用所有CPU。您可以通过网络(telnet / ssh)或通过串行终端运行此shell。
#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;
}
您可以启用magic sysrq key并检查系统状态并从那里开始。内核开发人员使用此接口来调试他们的软件。必须在内核编译时启用CONFIG_MAGIC_SYSRQ选项才能使用此功能。
根据经验将错误缩小到特定模块后,printk()仍然是一个很好的资源。
启用内核调试器(KDB)并通过串行电缆连接它也可能会有所帮助。
答案 1 :(得分:1)
@Jscheimer:感谢关于我的问题的详细指示。经过大量的调试和在工作场所与其他系统开发人员进行了一些讨论,我终于找到了根本原因。在整个设置中有一个DMA外设。 DMA被配置为对齐访问,但在某些数据传输的某处,它接收到未对齐的地址,因为我没有在代码中检查缓冲区对齐,这导致挂起/冻结。这种行为没有任何模式。