SCHLAFEN oder fleißig warten. Was würde einen Interrupt schneller bedienen?

Ich programmiere einen PIC-Mikrocontroller, um zwei Ereignisse über Interrupts in einer sehr zeitbeschränkten Umgebung zu bedienen.

PIC-Mikrocontroller ermöglichen einen SLEEP-Modus, der die PCU bei jedem externen Interrupt (INTn) aufweckt, aber abhängig vom ausgewählten Oszillatormodus eine Aufwachverzögerung hat.

Ich möchte wissen, welche Option die Interrupts schneller bedienen würde. Eine Hauptschleife wie diese:

//CPU never goes to sleep, keeps executing a jump
void main(){
    while(1){}
}

oder eine Hauptschleife wie diese:

//CPU goes to sleep (idle), waits for INTn interrupts.
void main(){
    while(1){
     asm SLEEP;
    }
}

Das Aufwachen aus dem Ruhezustand scheint laut PIC18F4XK22 2 Zyklen zu dauern, während ein Sprungbefehl (einer unendlichen While-Schleife länger dauern kann und möglicherweise auf halbem Weg in die Ausführung des Sprungs unterbrechbar ist oder nicht.

Antworten (1)

Sie haben es selbst gesagt, das Aufwachen aus dem Schlaf verursacht je nach Oszillator eine gewisse Verzögerung. Die Verzögerung ist für RC-Oszillatoren relativ klein und für Kristalloszillatoren viel länger.

Die zweite Methode verbraucht weniger Strom, vorausgesetzt, Sie können im Durchschnitt lange genug schlafen, damit der reduzierte Strom sinnvoll ist.

Idle Sleep scheint in ~2 Taktzyklen aufzuwachen. Wenn Sprungbefehle nicht auf halbem Weg unterbrochen werden können (ich weiß es nicht), ist Leerlauf möglicherweise eine bessere Option. Stromverbrauch, kein Problem.
@NeonMan - fügen Sie Ihrer Frage diese Informationen über 2-Uhr-Wach hinzu. Vielleicht eine Unterfrage zum ununterbrechbaren Sprung hinzufügen.
Fügen Sie auch den Teil über "Stromverbrauch, kein Problem" hinzu. Ich sage voraus, dass Sie fast überall Zustimmung finden werden, das Ding wach zu halten. Geben Sie 10 NOPAnweisungen (oder hundert) ein, wenn Sie eine Chance von 90 (oder 99) Prozent haben möchten, den Interrupt abzufangen, ohne dass JMPSie von einer Anweisung gestört werden.
@OlinLathrop interessant. Können Sie Details dazu hinzufügen, warum ein Kristall länger dauern würde? Ich stelle mir vor, dass der RC nur die Zeit benötigt, um die Kappe aufzuladen. Ignorieren der Chipzyklen, um aus dem Schlaf zu kommen.
Interrupts können zwischen Anweisungen bedient werden. Wenn eine Unterbrechungsanforderung auftritt, während ein Befehl ausgeführt wird, muss der Befehl vollständig ausgeführt werden, bevor der Interrupt bedient werden kann. Ich denke, die Frage, über die Sie sich tatsächlich Sorgen machen, ist, wie hoch die minimale / maximale Interrupt- Latenz für PIC18F ist.