Как решить "BUG: планирование пока атомное: swapper /0x00000103/0, CPU#0"? в TSC2007 Драйвер?

Я нашел драйвер tsc2007 и изменил в соответствии с нашими потребностями. Наша фирма производит собственную плату TI DM365. В этой плате мы использовали TSC2007 и подключили вывод PENIRQ к GPIO0 DM365. Это замечено на водителе. когда я касаюсь сенсорного экрана курсор движется, но в то же время я получаю

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

предупреждение и встроенный Linux падает. Есть 2 файла, которые я изменил и загрузил на http://www.muhendislikhizmeti.com/touchscreen.zip один с таймером, другой нет. это дает эту ошибку в любом случае.

Я нашел решение в Интернете, что мне нужно использовать рабочую очередь и звонить с использованием schedule_work() API. но они размыты для меня сейчас. Кто-нибудь есть какие-либо идеи, как решить эту проблему и может дать мне несколько советов, с чего начать использовать рабочую очередь.

4 ответа

"Планирование в атомарном режиме" означает, что вы пытались заснуть где-то, что не следует делать - например, в критической секции, защищенной спин-блокировкой, или обработчике прерываний.

Типичные примеры вещей, которые могут спать: mutex_lock(), kmalloc(..., GFP_KERNEL), get_user() а также put_user(),

Точно так же, как сказано в 1-м ответе, планирование в то время как атомарное происходит, когда планировщик запутался и, следовательно, не может работать должным образом, и это потому, что планировщик попытался выполнить "schedule()" в разделе, который содержит планируемое код внутри не планируемое,

Например, использование спящих внутри секции, защищенной спин-блокировкой. Попытка использовать другую блокировку (семафоры, мьютексы...) внутри кода, защищенного спин-блокировкой, также может нарушить работу планировщика. Кроме того, использование спин-блокировки в пользовательском пространстве может заставить планировщик вести себя как таковой. Надеюсь это поможет

Для любого другого с подобной ошибкой - у меня была эта проблема, потому что у меня была функция, вызванная из атомарного контекста, который использовал kzalloc(..., GFP_KERN) когда он должен был использовать GFP_NOWAIT или же GFP_ATOMIC,

Это всего лишь один пример функции, спящей, когда вы не хотите, и с которой вам следует быть осторожным в программировании ядра.

Надеюсь, что это полезно для кого-то еще!

Спасибо за первые два ответа, в моем случае этого было достаточно, чтобы отключить выгрузку:

preempt_disable();

// Your code with locks and schedule()

preempt_enable();
Другие вопросы по тегам