2016-04-05 14 views
0

Ich bin mir bewusst, dass ich msleep oder usleep oder eine solche Funktion sicherlich nicht verwenden kann, um Verzögerungen in einer Kernel-ISR-Routine einzuführen.
Ich habe einen Kernel-Treiber, in dem bestimmte ISRs definiert sind. In einem der ISR-Blöcke muss ich eine bestimmte Verzögerung in der Größenordnung von Millisekunden einfügen. Sagen wir:Wie Verzögerungen im Kernel-Treiber verwendet werden ISR

{ 
//A 
//here I need sleep 
//B 
} 

kann ich etwas verwenden wie:

{ 
//A 
for(i=0;i<1000;i++); 
//B 
} 

sagen Lässt mein Prozessor bei 1 Gbps ausgeführt wird, wird mir die oben für Schleife geben eine Verzögerung von 1000 usecs, das heißt 1ms?

+1

Funktionen "udelay" und "ndelay" implementiert * busy-waiting * Verzögerungen, so dass Sie sie in ISR verwenden können. Das Warteintervall für die erste Funktion wird in Mikrosekunden (1/1 000 000), für andere - in Nanosekunden (1/1 000 000 000) gemessen. – Tsyvarev

+0

Ja, das habe ich später bemerkt. Das hat funktioniert. Vielen Dank. – mdsingh

Antwort

-2

Funktionen udelay und ndelay implementieren Wartezeiten, sodass Sie sie im ISR verwenden können. Wie von Tsyvarev vorgeschlagen.

+0

Ich bin es nicht, der diese Antwort abgelehnt hat. Und ich bin auch neugierig auf den Grund für diese Ablehnung. – Tsyvarev

0

Sie dürfen nicht in einem Interrupt-Handler schlafen.

Darüber hinaus sollten Sie lange in einem Interrupt-Handler warten; Dies würde alle Prozesse und alle anderen Interrupts auf derselben CPU blockieren.

Wenn der Fahrer zwei Dinge zu verschiedenen Zeiten machen muss, sollte er einen zweiten Interrupt oder einen Timer verwenden, um die zweite Sache zu machen.

0

Ich wäre interessiert, die Gründe für eine absichtliche Verzögerung in einem ISR zu hören. Im Allgemeinen ist es ein No-No. Wenn du denkst, dass du eins brauchst, dann bedeutet es höchstwahrscheinlich, dass du dein Code-Design überdenken musst.

Für die Einführung mikroskopischer Verzögerungen ist eine Sache, die ich verwendet habe, cpu_relax(). Diese Funktion wird auch im Kernel verwendet, um die oben erwähnten udelay() und ndelay() für einige CPU-Architekturen zu implementieren. Ich würde Ihnen raten, einen Blick darauf zu werfen, wo und wie diese Funktion im Linux-Kernel verwendet wird. Das könnte Ihnen einige Ideen für Ihre spezifische Situation geben.