我找到了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进行调用。但现在对我来说,它们是模糊的。有谁知道如何解决这个问题,并能给我一些建议,从哪里开始使用工作队列?
发布于 2010-08-23 09:55:13
"Scheduling while atomic“表示您尝试在不应该的地方休眠--比如在受自旋锁保护的临界区或中断处理程序中。
可以休眠的常见例子有mutex_lock()、kmalloc(..., GFP_KERNEL)、get_user()和put_user()。
发布于 2011-12-02 17:59:49
正如在第一个答案中所说的,调度而原子发生时,调度器被混淆,因此无法正常工作,这是因为调度器试图在包含不可调度代码的部分中执行"schedule()“。
例如,在由自旋锁保护的区段内使用休眠。尝试使用另一个锁(信号量、互斥..)受自旋锁保护的代码内部也可能会干扰调度程序。此外,在用户空间中使用自旋锁可以驱动调度器这样做。希望这能有所帮助
发布于 2015-08-16 01:18:12
对于其他有类似错误的人-我遇到了这个问题,因为我有一个从原子上下文调用的函数,它使用了kzalloc(..., GFP_KERN),而它本应该使用GFP_NOWAIT或GFP_ATOMIC。
这只是一个函数在您不想休眠的时候休眠的例子,这是在内核编程中必须小心的事情。
希望这篇文章对其他人有用!
https://stackoverflow.com/questions/3537252
复制相似问题