如何解决“BUG:调度原子:swapper / 0x00000103 / 0,CPU#0”?在TSC2007驱动程序?

时间:2010-08-21 10:23:36

标签: c linux-kernel

我找到了tsc2007驱动程序并根据我们的需要进行了修改。我们公司正在生产自己的TI DM365板。在该电路板中,我们使用TSC2007并将PENIRQ引脚连接到DM365的GPIO0。它在驾驶员身上看得很清楚。当我触摸触摸屏光标正在移动但同时我正在

BUG: scheduling while atomic: swapper /0x00000103/0, CPU#0

警告和嵌入式Linux正在崩溃。有2个文件我修改并上传到http://www.muhendislikhizmeti.com/touchscreen.zip一个是定时器,另一个不是。它无论如何都会给出这个错误。

我在网上找到了一个解决方案,我需要使用工作队列并使用schedule_work()API调用。但他们现在对我来说很模糊。有没有人知道如何解决这个问题,并可以给我一些建议,从哪里开始使用工作队列。

4 个答案:

答案 0 :(得分:33)

“原子时调度”表示你试图在某个你不应该睡觉的地方睡觉 - 就像在受自旋锁保护的关键部分或中断处理程序中一样。

可以睡觉的常见例子包括mutex_lock()kmalloc(..., GFP_KERNEL)get_user()put_user()

答案 1 :(得分:13)

正如在第1个答案中所说的那样,当调度程序混淆并因此无法正常工作时,调度原子时会发生这种情况因为调度程序试图在包含可调度代码的部分中执行“schedule()”不可调度的。

例如,在由自旋锁保护的部分内使用睡眠。尝试在自旋锁保护代码中使用另一个锁(信号量,互斥量......)也可能会干扰调度程序。此外,在用户空间中使用自旋锁可以驱动调度程序表现如此。希望这有帮助

答案 2 :(得分:4)

对于其他有类似错误的人 - 我遇到了这个问题,因为我有一个函数,从原子上下文调用,当​​它应该使用kzalloc(..., GFP_KERN)GFP_NOWAIT时使用GFP_ATOMIC

这只是一个函数在你不想要的时候睡觉的例子,这是你在内核编程时必须小心的事情。

希望这对其他人有用!

答案 3 :(得分:2)

感谢前两个答案,在我的情况下,它足以禁用抢占:

preempt_disable();

// Your code with locks and schedule()

preempt_enable();