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

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

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

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

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

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

可以睡眠的常见例子是mutex_lock()kmalloc(..., GFP_KERNEL)get_user()put_user()

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

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

对于其他有类似错误的人 – 我有这个问题,因为我有一个函数,从primefaces上下文调用kzalloc(..., GFP_KERN)当它应该使用GFP_NOWAITGFP_ATOMIC时使用kzalloc(..., GFP_KERN)

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

希望这对其他人有用!

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

 preempt_disable(); // Your code with locks and schedule() preempt_enable();