Wie kann ich auf 8052 eine dritte Interrupt-Prioritätsstufe erreichen?

Die meisten Standard-8052-Plattformen erlauben dem Benutzer, Interrupts mit zwei möglichen Prioritäten zu konfigurieren: höher, währenddessen jeder anhängige Interrupt warten muss, und niedriger, der durch die Interrupts höherer Ebene unterbrochen werden kann, aber Interrupts niedrigerer Ebene können warten.

Wenn Sie nun einen Job innerhalb des Interrupts erledigen müssen, der einige Zeit in Anspruch nimmt, nicht absolut zeitkritisch ist und durch andere Interrupts unterbrochen werden kann, besteht der übliche Ansatz darin, alle Daten, die der Interrupt gesammelt hat, in einen Puffer zu legen und zu setzen ein Flag, dass die Bearbeitung eines Jobs anhängig ist, und lassen Sie dann die Hauptschleife eine Prüfung auf das Flag erreichen und diesen Job ausführen.

Es gibt jedoch einen Trick, der es ermöglicht, etwas Zeit zu sparen und den Job direkt vom Interrupt-Vektor ausführen zu lassen, jedoch mit Hauptschleifenpriorität - unterbrechbar durch beide Interrupt-Ebenen, wodurch im Wesentlichen eine dritte Interrupt-Ebene unterhalb der beiden vorhandenen Ebenen erstellt wird.

Wie erreicht man das?

Antworten (1)

Hier ist der Trick:

  • Sie konfigurieren Ihren "Extra-Low-Priority-Interrupt" als normalen Low-Pri-Interrupt: Richten Sie den Vektor ein, aktivieren Sie den Interrupt, all das Standardzeug.
  • Schreiben Sie die Handler-Prozedur wie gewohnt an eine beliebige Adresse. Es gelten die üblichen Interrupt-Einschränkungen – Speichern/Wiederherstellen von Registern, Stack-Disziplin usw. Beenden Sie es mit RET, nicht mit RETI.
  • Führen Sie an der Interrupt-Vektoradresse drei Operationen durch:
    • Schieben Sie das untere Byte Ihrer Handler-Adresse
    • Schieben Sie das höhere Byte Ihrer Handler-Adresse
    • RETI

Auf diese Weise wird das Interrupt-Flag gelöscht und die normale Ausführung fortgesetzt, aber nicht von der Adresse, an der der Interrupt aufgetreten ist, sondern von Ihrem Handler-Vektor. Sie können den Rest der Interrupt-Aktivität ausführen und dann einfach die Hauptschleife an der Stelle fortsetzen, an der sie unterbrochen wurde, indem Sie ein Standard-RET ausführen - die vom Interrupt auf dem Stack gespeicherte Adresse ist immer noch vorhanden.