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.
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.
NeonMan
gbulmer
Benutzer.1
NOP
Anweisungen (oder hundert) ein, wenn Sie eine Chance von 90 (oder 99) Prozent haben möchten, den Interrupt abzufangen, ohne dassJMP
Sie von einer Anweisung gestört werden.Kenny
MarkU