Forum: Mikrocontroller und Digitale Elektronik Allgemeines Verständnisproblem mit Interrupts (am Beispiel SPI)


von Andi Ü. (and0riz0r)


Lesenswert?

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? :)

von Stefan (Gast)


Lesenswert?

Ringpuffer ?
Stefan

von Krapao (Gast)


Lesenswert?

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.

von Andi Ü. (and0riz0r)


Lesenswert?

Krapao schrieb:
> Hilfeschrei mit Abschuss einer Signalrakete

:D - Danke für dieses anschauliche Beispiel.

Ok Ringpuffer ist wohl hier dann echt das Schlagwort :)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.