我找到了tsc2007驱动程序并根据我们的需要进行了修改.我们公司正在生产自己的TI DM365板.在该电路板中,我们使用TSC2007并将PENIRQ引脚连接到DM365的GPIO0.它在驾驶员身上看得很清楚.当我触摸触摸屏光标正在移动,但同时我得到
BUG: scheduling while atomic: swapper /0x00000103/0, CPU#0
Run Code Online (Sandbox Code Playgroud)
警告和嵌入式Linux正在崩溃.有两个文件,我修改并上传到http://www.muhendislikhizmeti.com/touchscreen.zip一个是与计时器,另一个不是.它无论如何都会给出这个错误.
我在网上找到了一个解决方案,我需要使用工作队列并使用schedule_work()API调用.但他们现在对我来说很模糊.有没有人知道如何解决这个问题,并可以给我一些建议,从哪里开始使用工作队列.
caf*_*caf 33
"原子时调度"表示你试图在一个你不应该睡觉的地方睡觉 - 比如在一个受自旋锁保护的关键部分或中断处理程序中.
的东西,可以睡常见的例子是mutex_lock(),kmalloc(..., GFP_KERNEL),get_user()和put_user().
小智 13
正如在第一个答案中所说的那样,当调度程序混淆并因此无法正常工作时,原子调度发生,因为调度程序试图在包含非可调度代码内的可调度代码的部分中执行"schedule()" .
例如,在由自旋锁保护的部分内使用睡眠.尝试在自旋锁保护代码中使用另一个锁(信号量,互斥量......)也可能会扰乱调度程序.此外,在用户空间中使用自旋锁可以驱动调度程序表现如此.希望这可以帮助
小智 5
对于其他有类似错误的人-我遇到了这个问题,因为我有一个从原子上下文调用的函数,该函数kzalloc(..., GFP_KERN)在应使用GFP_NOWAIT或时使用GFP_ATOMIC。
这只是一个函数在您不希望时休眠的示例,这在内核编程中必须要小心。
希望这对其他人有用!