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
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.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.