2017-06-08 5 views
1

Ich schreibe ein Kernel-Modul, das regelmäßig ein verstecktes Raw-Gerät fragen muss. Ich versuchte hrtimer und einen einfachen Timer und jedes Mal, wenn ich hid_hw_raw_request rufe, bekam ich eine "BUG: scheduling while atomic".Periodisch hid_hw_raw_request im Kernel-Modul, wie?

Wenn ich die gleiche Funktion außerhalb meiner Timer-Funktion versuche (zB in der init), funktioniert es gut (kein Fehler).

Wie könnte man diese Funktion regelmäßig aufrufen, ohne einen Fehler zu erzeugen?

Antwort

0

Sie müssen eine Arbeitswarteschlange verwenden, um Ihre hid_hw_raw_request als verzögerte Arbeit auszugeben. Dies kann wie im folgenden Beispiel Modul erfolgen:

#include <linux/kernel.h> 
#include <linux/module.h> 
#include <linux/workqueue.h> 

static void hid_work_handler(struct work_struct *hid_work); 

static struct workqueue_struct *hid_workqueue; 
static DECLARE_WORK(hid_work, hid_work_handler); 

static void hid_work_handler(struct work_struct *hid_work) 
{ 
     ... 
     hid_hw_raw_request(...); 
     ... 
} 

static int __init hid_work_init(void) 
{ 
     if (!hid_workqueue) 
       hid_workqueue = create_singlethread_workqueue("hid_workqueue"); 

     if (hid_workqueue) 
       queue_work(hid_workqueue, &hid_work); 

     return 0; 
} 

static void __exit hid_work_exit(void) 
{ 
     if (hid_workqueue) { 
       flush_workqueue(hid_workqueue); 
       destroy_workqueue(hid_workqueue); 
     } 
} 

module_init(hid_work_init); 
module_exit(hid_work_exit); 

MODULE_DESCRIPTION("hid_work_test"); 
MODULE_LICENSE("GPL"); 

Beachten Sie, dass für die eigentliche Implementierung Sie Ihre eigenen Daten-Struktur mit einer mitgelieferten struct work_struct in der Warteschlange erstellen müssen. Diese Datenstruktur enthält wahrscheinlich den Hiddev, den Puffer usw., den die hid_work_handler die tatsächliche Übertragung durchführen muss. Für weitere Details siehe LDD3 Kapitel 7 (obwohl die Syntax der Aufrufe veraltet ist, gilt die grundlegende Erklärung immer noch).

+0

Hallo, Vielen Dank für Ihre ausführliche Antwort! Ich werde so schnell wie möglich versuchen, aber es sieht genau das aus, was ich gesucht habe! – AlexJ

Verwandte Themen