У меня есть обработчик прерываний, который планирует тасклет следующим образом (псевдо-код) -Почему запланированная тасклет из обработчика прерываний не работает
struct tasklet_struct mytasklet;
void my_tasklet_function(unsigned long arg1) {
...
pr_alert("Inside tasklet function\n");
...
}
int my_probe() {
....
....
tasklet_init(&mytasklet, my_tasklet_function, arg1);
....
/* Register interrupt handler my_irq_handler*/
....
}
irqreturn_t my_irq_handler(int irq, void *data) {
...
status = read_reg(base_addr, intr_status_reg_offset)
write_reg(base_addr, intr_status_reg_offset, status);
if (status & INTR_MASK_1) {
....
pr_alert("intr 1 came\n");
}
...
...
pr_alert("Schedule tasklet\n");
tasklet_schedule(&mytasklet);
pr_alert("Exit irq\n");
return IRQ_HANDLED;
}
Замечено, что ядро зависает после следующих отпечатков
intr 1 came
Schedule tasklet
Печать «Выход из irq» никогда не появляется. Отпечатки в этой функции не печатаются.
В чем может быть причина, по которой этот талисман не намечается?
Что может привести к зависанию ядра?
Показать, как инициализируется объект 'mytasklet' (определенный). – Tsyvarev
Обновлен код для инициализации mytasklet –
Вы уверены, что ваш обработчик прерываний вызывается * после того, как * tasklet инициализируется? (То есть вы регистрируете обработчик irq * после того, как * функция 'my_probe()' вызывается или * после * 'tasklet_init' в этой функции.) – Tsyvarev