Allgemeines Verständnisproblem mit Interrupts (am Beispiel SPI)

OP #2596566
Hallo an diesem sonnigen Tag :).
Wie der Titel schon sagt habe ich ein Verständnisproblem bzgl. 
Interrupts.
Interrupts sind meines Wissens heutzutage absolut notwendig, um Polling 
vermeiden zu können.

Um mein Problem zu schildern, gebe ich mal ein kurzes Beispiel:

Es sollen Daten über die SPI geschickt werden.

Die Daten werden in den Puffer der SPI gelegt
Ein Interrupt wird ausgelöst, wenn das Senden fertig ist.
Jetzt kommen neue Daten in den Puffer.

Nur: Was sollte hier dann in der ISR passieren? Wenn hier einfach ein 
"Gesendet"-Flag gesetzt wird, das besagt, dass das Senden fertig ist, 
dann gewinnt man ja gar nichts.
Dann müsste mein Haupprogramm ja trotzdem dieses Flag andauernd pollen. 
Dann könnte man genauso das SPI-Busy-Flag pollen. Das würde ja keinen 
Sinn machen - im Gegenteil.

Demnach würde ich nun vermuten, dass alle Daten die geschickt werden 
über die ISR in den Puffer gelegt werden. Die ISR müsste also irgendwie 
über einen globalen Zeiger auf die Adresse des nächsten zu sendenen 
Wortes zeigen, und diesen Zeiger nach dem Befüllen des SPI-Sendepuffers 
inkrementieren. Ist das so?

Wie geht man aber dann damit um, wenn konstant Daten zum Weiterschicken 
generiert werden (zum Beispiel über einen ADC)?
Diese Daten müsste ich ja dann immer weiter hinten im Speicher 
anstellen. Irgendwann ist dann der Speicher voll.
Ich muss also irgendwann wieder vorne anfangen.... macht man das so? :)
Gast
Genauso. Fast.

Den Sendepuffer füllt allerdings nicht die ISR, sondern das 
Userprogramm. Die ISR leert den Sendepuffer, indem sie bei jedem IRQ 
"Zeichen verschickt" das nächste zu verschickende Zeichen aus dem 
Sendepuffer entnimmt und auf die Reise schickt.

Umgekehrt bei einem Empfangspuffer. Hier füllt die ISR den 
Empfangspuffer und das Userprogramm entnimmt daraus.

Den Puffer kann man z.B. als FIFO (First in first out) Puffer einrichten 
oder als Ringpuffer. Beispiel findet man haufenweise im Netz besonders 
im Zusammenhang mit UART/RS232.

Das Verhalten bei "Puffer voll" kannst du je nach Gusto implementieren. 
Das ist frei wählbar; von "Still drüber hinweggehen und Daten 
wegschmeissen" bis zum "Hilfeschrei mit Abschuss einer Signalrakete" ist 
alles möglich.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.