当我通过USB集线器连接串行设备时,Linux进程进入D状态

时间:2011-03-12 08:52:37

标签: linux gps usb serial-port

我通过串行< - > USB适配器(Prolific PL2303)将串行GPS连接到嵌入式PC。每5分钟,一个shell脚本运行一个Python脚本,通过Pyserial读取GPS数据,然后将它们上传到Internet。如果我将GPS直接插入PC(通过PL2303)一切正常,我的系统永远运行但是如果我在pl2303和PC之间使用usb HUB我遇到了这个问题:Python脚本可以运行大约3-6小时然后它进入D状态(不间断睡眠)并且shell脚本不能再次运行它(我只能关闭系统,不能杀死)。我检查了我的脚本,并使用了来自不同供应商的usb集线器(有电源而不是),结果相同。

PS我的嵌入式电脑(来自Embeddedarm)运行更新的Debian Lenny。

我能解决它吗?

2 个答案:

答案 0 :(得分:1)

处于D状态的进程意味着内核(很可能是设备驱动程序)使您的进程陷入不间断的睡眠状态。

老实说,除非您打算调试内核USB堆栈和/或特定的USB芯片组设备驱动程序,否则您作为用户可能无法做到这一点。

以下是做什么 -

  1. 确保嵌入式设备的内核配置具有magic sysreq密钥的内核配置选项,并且启用了它的运行时配置。请参阅:http://en.wikipedia.org/wiki/Magic_SysRq_key了解如何执行此操作。

  2. 重新创建问题(让进程陷入D状态)。

  3. 用ps找出卡住的python脚本的PID并运行strace -p PID。这将为您提供进程正在进入的特定系统调用。

  4. 发送magic sysreq key命令't',它将所有任务及其内核堆栈列出到控制台。通过PID查找python脚本的具体任务,看看内核代码的确切部分是什么。

  5. 打开内核代码并尝试调试问题(如果可以),或者将其移植到相关的邮件列表中。

  6. 还有一个建议是尝试查看问题是否会在Debian发布的更新的内核版本中消失。如果是这样,您知道这是在较新版本的内核中修复的错误,您可以选择使用较新版本并尝试将修复程序移植到您使用的旧版本。

    祝你好运!你需要它......

答案 1 :(得分:0)

Ubuntu launchpad提交的错误与您的错误一样。建议的解决方法是:

modprobe -r pl2303
modprobe pl2303

看看这是否可以解决这个问题?