首页 文章

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

提问于
浏览
0

我通过串行< - > 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我的嵌入式PC(来自Embeddedarm)运行更新的Debian Lenny .

我可以解决它吗?

2 回答

  • 0

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

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

    这是做什么的 -

    • 确保嵌入式设备的内核配置具有magic sysreq密钥的内核配置选项,并且启用了它的运行时配置 . 请参阅:http://en.wikipedia.org/wiki/Magic_SysRq_key如何做到这一点 .

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

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

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

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

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

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

  • 1

    Ubuntu launchpad有一个像你这样可疑的错误 . 建议的解决方法是:

    modprobe -r pl2303
    modprobe pl2303
    

    看看这是否适用于bug?

相关问题