4

私自身のカーネルモジュールでkthread、割り込みハンドラ関数内で初期化しようとしています。

私が持っているグローバルスコープで:

static struct task_struct *thread1;

irqの関数ハンドラーは次のとおりです。

static irqreturn_t* func_irq_handler (int irq, void *dev_id)
{   
    printk("irq handler ... \n");
    thread1 = kthread_create(thread_function,NULL,"my_thread");
    if ((thread1)) {
        printk(KERN_INFO "%s\n" , __FUNCTION__);
    }
    return IRQ_HANDLED;
}

スレッド関数は次のとおりです。

static thread_function(void)
{
    unsigned long j1=jiffies+20000;
    int delay = 60*HZ;
    printk("%s \n",__FUNCTION__);

    while (time_before(jiffies,j1)) {
        schedule();
        printk(KERN_INFO "after schedule\n");
    }
}

このようにrequest_irq見えます:

request_irq(irq,func_irq_handler,IRQF_TRIGGER_HIGH | IRQF_TRIGGER_RISING ,"test_irq",(void*)&my_miscdev);

なぜこのエラーが発生するのですか?

BUG: scheduling while atomic: swapper
4

1 に答える 1

4

スレッドを作成するには、スレッドスケジューラとの対話が必要であると思いますが、これは割り込み/アトミックコンテキストでは許可されていません。

より良いアプローチは、カーネルスレッドを別の場所に作成し、それに割り込み要求処理をキューに入れることです。

于 2012-08-21T15:16:04.800 に答える