fifo mit irq

Gast #237677
Wie schon in einem anderen Thread in anderen Zusammenhäängen
beschrieben, habe ich mit der seriellen einen FIFO-Puffer
zusammengebastelt. Da das Ganze aber Interruptgesteuert werden soll.
Also eben der FIFO zum senden und ein anderer zum empfangen benutzt
werden soll, wollte ich mal wissen wie man das am Besten handeln kann.
Ich muss gestehen ich habe da eine echte Denkblockade. Die Problematik
ist einfach, dass ein IRQ in den Empfangspuffer schreibt und ich immer
wieder aus diesem lese. Da kommt es mal zu Überschneidungen und ich
weiß beim besten Willen nicht, wie ich dem aus den Weg gehen kann. Die
entsprechnen Quellen liegen hier:

http://mitglied.lycos.de/projectsilence/syscontrol/source/serial.c
http://mitglied.lycos.de/projectsilence/syscontrol/source/serial.h
http://mitglied.lycos.de/projectsilence/syscontrol/source/fifo.c
http://mitglied.lycos.de/projectsilence/syscontrol/source/fifo.h

Und so dieht mein Loop aus, um Zeichen zu lesen von der seriellen:

while (!(serial_getc(&serial_inchar) & (1<<FIFO_SIG_EMPTY_ERR))) {
 ... mach was und werte Zeichen aus ...
}

Problem ist, dass manchmal ASCII 0 durchrutscht, obwohl nur Buchstaben
getippt werden. Da muss ein Fehler sein und der kommt durch IRQs ...
ich hab Null Plan, wie ich das unterbinden soll. Ich habe schon
Busyflags in der FIFO-Struktur gesetzt. Aber das hilft auch nichts,
weil während der Abfrage genau dazwischen auch ein IRQ reinrutschen
kann.... und mit cli() und sei() wollte ich da eher ungern arbeiten.
Gast
Nachtrag: Prinzipiell arbeite ich ja im Moment schon mit cli() und
sei(), damit es halbwegs funktioniert. Aber so richtig geht es
immernoch nicht. Und eigentlich wäre es gut, wenn ich cli() und sei()
vermeiden könnte.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 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.