2017-11-17 4 views
0

Ich arbeite an einem Gerätetreiber für ein Datenerfassungssystem. Es gibt ein PCI-Gerät, das in regelmäßigen Abständen gleichzeitig Ein- und Ausgabedaten bereitstellt. Und dann verwaltet der Linux-Mod die Daten in zirkulären Puffern, in die durch Dateioperationen gelesen und geschrieben wird.Korrekte Möglichkeit, Lesevorgänge bis zu einem externen Ereignis zu blockieren?

Der Datendurchsatz des Systems ist relativ gering, es empfängt etwas über 750.000 Bytes/Sekunde und überträgt etwas mehr als 150.000 Bytes pro Sekunde.

Es gibt ein kleines Benutzerspeicherprogramm, das Daten zu Testzwecken in einer Schleife schreibt und liest.

ist hier ein Abschnitt der Treibercode (der Code Alle in den Ringpuffer im Zusammenhang wurde der Einfachheit halber weggelassen. PCI-Gerät Initialisierung ist gesorgt anderswo und pci_interupt nicht die reale Einstiegspunkt für die Interrupt-Handler)

Der obige Code funktioniert gut für lange Zeiträume, aber alle 12-18 Stunden gibt es einen Datenunterlauffehler. Dies führt dazu, dass Nullen geschrieben werden.

Mein erster Gedanke ist, dass aufgrund der Userspace-Anwendung, die nicht wirklich in Echtzeit ist, die Zeitverzögerung zwischen Lese- und Schreiboperationen gelegentlich zu groß wird, was den Fehler verursacht. Allerdings habe ich versucht, die Größe der Lese- und Schreibvorgänge im Benutzerbereich zu ändern und die Benutzerfreundlichkeit der Anwendung zu ändern, was sich nicht auf die Häufigkeit des Fehlers auswirkt.

Tun Sie der Fehler Natur Ich glaube, es gibt eine Form der Rasse Bedingung in den drei oben genannten Methoden. Ich bin mir nicht sicher, wie die Wartewarteschlangen des Linux-Kernels funktionieren.

Gibt es eine vernünftige Alternative zu der oben genannten Methode zum Blockieren von Lesevorgängen oder gibt es etwas anderes, das falsch ist, könnte dieses Verhalten verursachen.

System Information:

Linux Version: Ubuntu 16.10

Linux Kernel: Linux-4.8.0-lowlatency

Chipsatz: Intel Celeron N3150/N3160 Quad Core 2,08 GHz SoC

TL; DR: Der obige Code trifft alle 12-18 Stunden auf Unterlauffehler, da es eine bessere Möglichkeit gibt, IO oder eine Race Condition im Code zu blockieren.

Antwort

0

Ein Standard-Weg in Linux kann auch in Ihrem Fall verwendet werden.

Benutzerraum Testprogramm: 1. Öffnen Sie Datei-Modus (Standard in Linux, bis Sie NONBLOCK Flag angeben) in Blocking 2. Aufruf select() zu blockieren auf Dateideskriptor.

Kernel-Treiber: 1. Register Interrupt-Handler, der aufgerufen wird, wenn es Daten zur Verfügung 2. Handler Sperre nehmen gemeinsamen Puffer zum Schutz zwischen liest/schreibt und Übertragung von Daten einen Blick auf diese Links für Quelle Nehmen Code von ldd3 Buch test und driver.

Verwandte Themen