我不知道这个问题在这里是相关的还是超级用户,但无论如何都要问。
我已经在下面提到的设置- Linux桌面PC系统。这是一个连接自定义的FPGA开发board.In,这个FPGA有一个以太网网卡IP的实现和执行。该板采用USB接口-USB线和串口连接到FPGA开发板上.从本质上说,这整个设置测试的是基于FPGA的网卡和相关的以太网驱动程序。
有许多应用程序运行在主机linux上,并将数据发送给基于FPGA的以太网n/w卡,后者接受它,进行必要的处理,并发送到FPGA上实现的物理层,然后通过以太网将其发送到网络上的其他节点/设备。
这一设置工作良好,即使多个应用程序从主机-pc发送数据到FPGA网卡。作为其中一个应用程序,我使用一个基于Linux的VLC播放器(它是一个多媒体播放器)来播放来自Linux主机的一些多媒体流,这些数据被发送到FPGA网卡。在VLC播放器中,我使用vlc播放器控件查找(反向/转发)流。当我连续执行这个查找操作时,它使linux主机pc。挂/别动。没有i/o设备工作,只有重新启动工作。
现在,我试图查看linux主机pc /var/log (dmesg)中的日志,以了解是什么进程/应用程序导致了冻结,但无法从其中获得任何输入。
任何指针都是有用的。
谢谢。
-AD。
发布于 2009-12-17 20:04:01
您提到Linux主机已被冻结。首先,我将确定它是否实际上被锁在内核中,或者是否有某个用户空间进程(Es)占用了过多的CPU。
主机可以点击(最好是在与您的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;
}内核(软件)问题?
您可以启用魔法sysrq密钥并检查系统状态,然后从那里开始。内核开发人员使用这个接口来调试他们的软件。为了使用此功能,必须在内核编译时启用CONFIG_MAGIC_SYSRQ选项。
在经验地将bug缩小到特定模块之后,printk()仍然是一个很好的资源。
它还可能有助于启用内核调试器(KDB)并通过串行电缆连接到它。
发布于 2009-12-20 16:32:44
@Jscheimer:谢谢关于我的问题的详细提示。经过大量调试&与工作场所的其他系统开发人员进行了一些讨论,我终于找到了根本原因。在整个设置中有一个DMA外围设备。DMA用于对齐访问,但是在某些数据传输中,它接收的是一个未对齐的地址,这是因为我在代码中没有检查缓冲区对齐情况,这导致挂起/冻结。这种行为是没有规律的。
https://stackoverflow.com/questions/1923400
复制相似问题