2010-08-21 216 views
19

我找到了tsc2007驱动程序,并根据我们的需要进行了修改。我们公司正在生产自己的TI DM365板。在这个电路板中,我们使用了TSC2007,并将PENIRQ引脚连接到DM365的GPIO0。在驾驶员身上看起来不错。当我触摸到触摸屏光标移动,但同时我得到如何解决“BUG:调度while atomic:swapper/0x00000103/0,CPU#0”?在TSC2007驱动程序?

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

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

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

回答

28

“Scheduling while atomic”表示您已尝试在某处不应该睡觉的地方 - 如在受自旋锁保护的关键部分或中断处理程序中。

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

12

与第一个答案中所述的一样,在调度程序变得混乱并因此无法正常工作时调度原子,这是因为调度程序试图在包含可调度代码的部分中执行“调度()”一个不可调度的。

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

2

谢谢你的前两个答案,在我的情况下,这已经足够了禁用抢占:

preempt_disable(); 

// Your code with locks and schedule() 

preempt_enable(); 
+0

不够准确:正如caf所说,锁定不能睡觉。只有spinlock符合这个条件。无法使用互斥锁(我不确定?),因为当互斥锁开始等待时,可以将CPU调度到其他处理器(因为mutex_lock()内部是一个“might_sleep()”函数调用,这可能会导致重新计划 - 因为cond_resched()被调用,即使您将抢占标志设置为off(这可能会导致另一个错误?),因为自动计划在抢占标志打开时完成?让我们来讨论。 – 2014-05-19 23:48:56

4

为别人有类似的错误 - 我,因为我有一个函数有这个问题,在原子上下文中调用时,使用kzalloc(..., GFP_KERN)时应该使用GFP_NOWAITGFP_ATOMIC

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

希望这对其他人有用!

相关问题