Frage:
Was ist der effektivste Weg, um ein PIC-Statusbit zu speichern / wiederherzustellen?
mmccoo
2010-07-13 20:08:47 UTC
view on stackexchange narkive permalink

Ich möchte das Übertragsbit des PIC speichern / wiederherstellen. Ich verwende den 16F628A.

  SAVE_CARRY btfss STATUS, 0 gehe zu CARRY_OFF CARRY_ON bsf Carry, 0 returnCARRY_OFF bcf Carry, 0 returnRESTORE_CARRY btfss Carry, 0 gehe zu RESTORE_CARRY_OFFRESTORE_CARRY_ return  

Es muss einen besseren Weg geben. Gibt es?

Zwei antworten:
#1
+5
Daniel Grillo
2010-07-13 21:16:27 UTC
view on stackexchange narkive permalink

Eine Möglichkeit, die Sie ausführen können:

  SAVE_CARRY: bsf-Übertrag, 0 btfss-Status, c bcf-Übertrag, 0 returnRESTORE_CARRY bsf-Status, c btfss-Übertrag, 0 bcf-Status, c return  

Wenn Sie die Register "W" und "Status" speichern müssen, bevor Sie einen Interrupt-Code ausführen, gibt es eine andere Möglichkeit:

  Save_Context: movwf w_temp swapf status, w movwf status_temp; Ihr Interrupt-Code hier. Restore_Context: swapf status_temp, w movwf status swapf w_temp, f swapf w_temp, w retfie  
#2
+3
supercat
2011-08-29 22:09:15 UTC
view on stackexchange narkive permalink

Wenn Sie nur das Übertragsbit speichern / wiederherstellen möchten und es Ihnen nichts ausmacht, den Wert beim Speichern zu verlieren und den gespeicherten Wert beim Wiederherstellen zu löschen, verwenden Sie einfach "rlf saved_carry, f", um es zu speichern und "rrf saved_carry, f", um es wiederherzustellen. Keine anderen Register oder Flags betroffen.

Wenn die Geschwindigkeit von größter Bedeutung ist und Sie ein anderes Bit speichern / setzen und später wiederherstellen müssen (z. B. RP0), können Sie Folgendes tun:

 Int_Entry: btfss STATUS, RP0 gehe zu Version_with_RP0_clear bcf STATUS, RP0 do_interrupt_logic bsf STATUS, RP0 retfieInt_with_RP0_Clear: do_interrupt_logic bcf STATUS, RP0; Wenn die Interrupt-Logik sie möglicherweise verlassen hat, setzen Sie retfie 

. Dies sind insgesamt vier Zyklen, um RP0 nicht nur zu speichern / wiederherzustellen, sondern es auch auf einen bekannten Zustand für das ISR zu setzen (wenn die Verzweigung genommen wird, ist RP0 bereits im richtigen Zustand, daher muss es nicht eingestellt werden). Wenn die Interrupt-Logik W oder andere Flags nicht beeinflusst (z. B. wenn für fast alles bsf / bcf / btfss / btfsc / incfsz / decfsz verwendet wird), kann diese Logik vier Zyklen speichern, während W und Status gespeichert, Status gelöscht und ausgeführt werden unterbrechen und dann Status und W wiederherstellen. Solche Einsparungen sind in vielen Fällen nicht wichtig, können aber sehr wichtig sein, wenn man versucht, z Verwenden Sie einen TMR2-Interrupt, um alle 50 Zyklen etwas zu tun. Da sich TMR2IF in einem Bankregister befindet, muss RP0 gelöscht werden, um TMR2IF zurückzusetzen. Wenn TMR2 alle 50 Zyklen tickt und der ISR 26 Zyklen mit der Verbesserung oder 30 Zyklen ohne benötigt, könnte das Speichern dieser drei Zyklen im ISR die Verfügbarkeit der Hauptleitungs-CPU um 20% erhöhen.



Diese Fragen und Antworten wurden automatisch aus der englischen Sprache übersetzt.Der ursprüngliche Inhalt ist auf stackexchange verfügbar. Wir danken ihm für die cc by-sa 2.0-Lizenz, unter der er vertrieben wird.
Loading...