次のようにタスクレットをスケジュールする割り込みハンドラーがあります(疑似コード)-
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
「Exit irq」の出力は表示されません。タスクレット機能の印刷物は印刷されません。
このタスクレットがスケジュールされない理由は何ですか?
カーネルがハングする原因は何ですか?