我们使用基于 Beagle Bone Black 的定制板,内核版本为 3.12。
我们在初始化脚本之一期间面临系统挂起(该脚本会启动 WiFi),
此挂起发生在随机次数的电源周期之后,
Nothing works during this hang, it looks like system is frozen, It doesn't even respond to sysrq keys
我认为这是在 ISR 代码中,因为它没有任何作用。
不幸的是,当我们启用“检测挂起任务(DETECT_HUNG_TASK
)”时,我们没有看到该问题。 :(
唯一有效的是,如果在看门狗定时器到期后启用看门狗,它将重新启动系统并恢复系统。
但我们想找出问题出在哪里。
有什么建议吗?
我想过使用软狗和修复脚本对来打印一些消息,但我认为外部中断将具有更高的优先级,当它执行并挂在那里时,软狗定时器也将没有机会执行,对吗?
bug 的随机性使得调试变得更加困难:(
任何帮助表示赞赏。
答案1
好吧,我们按照评论中的建议进行了代码阅读,并发现了补丁中系统可能进入无限循环(在 irq 中)并且无法退出的部分。
然而,当我们将 printk 放入该 irq 函数时,问题并未重现。 (时间问题你知道!)
最后,我的同事尝试了切换 GPIO 的老派方法,结果有所帮助。这也很困难,因为超过两个 GPIO 切换条目会阻止问题重现。
在函数内部,他使用了 GPIO 切换,如下所示,
func()
{
//set gpio high
some doubtfull code..
....
//set gpio low
}
这就是他跟踪有问题的代码的方式,其解决方案在 linux-4.1 中可用,他修复了它并正在测试它。
@ShankarSM:如果您正在阅读本文,所有功劳都归于您追踪它:-)