mikrocontroller.net

Forum: PC-Programmierung Empfangspuffer serielle


Autor: malt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

auf einem sehr lahmen System (Geode 300, Debian) lese ich ständig Daten 
von der seriellen Schnittstelle mit Baudrate 38400 ein, ohne 
Flußkontrolle. Die Datenrate beträgt etwa 600 Byte/sec. Wenn die 
Prozessorlast durch andere Prozesse für längere Zeit sehr hoch wird, 
gehen Teile der seriellen Daten verloren. Ich habe das überprüft mit 
"cat /dev/ttyS0 > test.dat". In test.dat sieht man dann bei hoher 
Prozessorlast die Lücken.

Wenn ich die gleichen Daten über einen Ethernet Port einlese, gibts 
keine Lücken.

Ich habe gelesen, dass die UART Bausteine einen Empfangspuffer von nur 
16Byte besitzen. Habe aber nichts drüber gefunden, wie man diesen Puffer 
irgendwie vergößern kann. In setserial oder stty gibts dafür keine 
Optionen.

Hat jemand eine Idee zur Lösung des Problems?

Gruß
Malte

Autor: Bobby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Linux-Systeme haben einen zusätzlichen Datenpuffer,
der aber nur dann gefüllt wird, wenn von der
seriellen Schnittstelle Interrupts durchkommen.

Festplatteninterrupts haben eine höhere Priorität
als die der seriellen Schnittstellen.
Das verhindert oft das Durchkommen der seriellen INTs.

Eine Lösung kann darin bestehen, die Platten in den
DMA-Modus zu versetzen. "man hdparm", Option -d.

Autor: malt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Tip. DMA-Modus ist bereits aktiviert. Hast du noch eine 
andere Idee?

Gruß
Malte

Autor: Bobby (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst noch versuchen, deinem Leseprogramm
eine höhere Priorität zu verschaffen.
Dazu dient das Programm nice.

Aufrufbeispiel:  nice -n -10 deinprog

Der Wert muss negativ sein! Gelingt aber nur als root.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
malt wrote:
> Hi,
>
> auf einem sehr lahmen System (Geode 300, Debian) lese ich ständig Daten
> von der seriellen Schnittstelle mit Baudrate 38400 ein, ohne
> Flußkontrolle.

Im 'schlimmsten' Fall könnte man eine Flusskontrolle
aktivieren bzw. implementieren.
Den die gibt es genau aus dem Grund der jetzt deinen
Fehlerfall darstellt.

Autor: malt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

nice hat kaum Wirkung gezeigt, leider. Kann es sein, dass nice nur die 
Prozessorzeit anders aufteilt, und dies keine Auswirkung auf die 
Reaktion auf Interrupts hat?

Ja, eine Flusskontrolle waere gut in diesem Fall. Mir graut aber vor der 
Implementierung, von den Aenderungen in der Hardware ganz zu 
schweigen...

Es wundert mich, dass die eth-Ports so gaenzlich anders behandelt werden 
als die seriellen. Haben die einfach mehr Speicher im Chip?

Gruss
Malte

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
malt wrote:
> Hallo,
>
> nice hat kaum Wirkung gezeigt, leider. Kann es sein, dass nice nur die
> Prozessorzeit anders aufteilt, und dies keine Auswirkung auf die
> Reaktion auf Interrupts hat?
>
> Ja, eine Flusskontrolle waere gut in diesem Fall. Mir graut aber vor der
> Implementierung, von den Aenderungen in der Hardware ganz zu
> schweigen...
>
> Es wundert mich, dass die eth-Ports so gaenzlich anders behandelt werden
> als die seriellen. Haben die einfach mehr Speicher im Chip?
>
> Gruss
> Malte

Soweit ich weiß werden die Daten von der Netzwerkschnittstelle per DMA 
direkt in den Hauptspeicher kopiert, ohne dass der Prozessor was machen 
muss.

Autor: nop(); (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Beim 16byte FIFO kann man den triggerlevel setzen. Auf 4,7,10,14, soweit 
ich mich erinnere. Diese Zahl sollte man kleiner waehlen. ZB von 10 auf 
7 erniedrigen. Wenn die Festplatte, alllerdings das system zu macht, 
hilft das nicht viel. In dem Falle eine externe Schnittstellenkarte, zB 
ISA oder PCI, die haben beliebig viel Buffer drauf.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.