Forum: Mikrocontroller und Digitale Elektronik UART 16550 Interrupt


von Dexter (Gast)


Lesenswert?

Hi

ich hab ein verständnisproblem zwecks der Interrupts beim 16550
und zwar habe ich einen Treiber geschrieben(linux) mit einem 
Software-Fifo

nach der Initialisierung und dAnmeldung des Interrupts im BS geht er in 
einer endlosschleife in read und liest 8 Zeichen ein aber nur wenn ein 
Empfangsinterrupt kommt danach soll er sie wieder ausgeben somit geht er 
in Write routine und schreibt sie wieder in den Sendepuffer aber nur 
wenn ein Sendeinterrupt ausgelöst wird dies macht er aber irgendwie 
nicht. kann mir jemand erklären wie das genau mit dem Sendeinterrupt 
funktioniert?

nochmal zur übersicht

in funktion Read-->
Interrupt kommt
zeichen wird in Empfangspuffer geschrieben
zeichen wird aus Empfangspuffer gelesen und in Anwendungsbereich 
gebracht

in funktion write

zeichen wird in Sendefifo geschrieben und sobald Sendeinterrupt kommt 
wird es
zum UART übertragen indem aus aus dem Sendefifo gelesen wird.


mfg dexter

von nop(); (Gast)


Lesenswert?

Endlosschleife ? Was soll das ?

Aus dem UART liest man nicht 8 byte, sondern soviele wie da sind. Man 
kann das in der Fifotiefe einstellen. Die Fifotiefe als 4, 7 oder 14, 
glaub ich.

Den UART TX interrupt muss man natuerlich enablen. Wenn's ein PC ist, 
ist da noch was mit einem externen gate, hab ich aber vergessen. Der 
TxInterrupt kommt wenn das THR leer ist. Schau dir das Datenblatt an.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Nicht die Fifotiefe wird eingestellt, sondern der Füllstand, bei dem der 
Interrupt ausgelöst wird.
Allerdings wird der Interrupt auch ausgelöst, wenn der Füllstand nicht 
erreicht ist, aber eine gewisse Zeit verstreicht.

Somit muss im Interrupthandler der aktuelle Füllstand abgefragt werden, 
da sowohl weniger als auch mehr Zeichen vorhanden sein können, als der 
Triggerpegel für den Interrupt beschreibt.

BTW: Warum für Linux das Rad neu erfinden? 16c550 ist die Standard-UART 
jedes PCs, und jedes PC-Linux hat bombenstabile Devicetreiber gerade 
für diese UART.

von nop(); (Gast)


Lesenswert?

Ja. Genau. Der Trigger zum Fifo wird eingestellt. Meist falsch, da die 
Leute das zuwenig verstehen. Die Leute denken, wenn sie den Trigger hoch 
setzen bekommen sie weniger interrupts. Ja. moeglicherweise zuwenige. 
Wenn das System stark belastet ist sollte der Triggerwert bei hohen 
Baudraten klein sein. Dies, da in der Zeit, wo der interrupt ansteht, 
und bis das UART ausgelesen wird etwas Zeit verstreichen kann, und 
nochmals ein parr Zeichen kommen koennen.

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.