Hi,
ich muss die Steuerleitungen der seriellen Schnittstelle recht
zeitkritisch abfragen. Da ich das nicht unbedingt per Polling machen
will, die Frage: Gibt es für C unter Linux da eine Interrupt-gesteuerte
Möglichkeit?
LG
traffic
Die gibt's im normalen Posix-Modell nur für die DCD-Leitung: im
„normalen“ Modembetrieb bekommst du ein SIGHUP (“hangup”), wenn
DCD verschwindet.
Allerdings muss der zugrhörige Prozess zuvor der process group leader
für das entsprechende Terminal geworden sein (via setpgid() und
tcsetpgrp()).
H. K. schrieb:> Logischerweise musst du dann diesen Syscall in einen Child-Prozess> auslagern, wenn du nicht willst, dass dein Programm blockiert...
Linux kann doch mittlerweile auch Threads.
traffic schrieb:> ich muss die Steuerleitungen der seriellen Schnittstelle recht> zeitkritisch abfragen.
Wie kritisch ist denn die Zeit? Linux ist, wie alle andere Desktop und
Server OS-en, nicht gerade ausgelegt für zeitkritische (Real-time)
Anforderungen.
traffic schrieb:> ioctl(fd,TIOCMIWAIT,0);
Nun, wenn du auf nichts wartest (0), dann ist das wohl wenig
sinnvoll. Die Funktion kann daraus zwei Entscheidungen treffen:
sofort zurückkehren („nichts“ ist ja bereits eingetreten), oder
unendlich warten („nichts“ kann nie eintreten). Offenbar tut sie
letzteres.
traffic schrieb:> zeitkritischtraffic schrieb:> "/dev/ttyUSB0"
Bist du dir mit den zeitkritisch sicher? So recht passt das nicht
zusammen. Wie viel Zeit kannst du dir denn gönnen?
nicht“Gast“ schrieb:> So recht passt das nicht zusammen.
Die Zeiten, die für die Meldung über den USB benötigt werden, dürften
im Bereich 10 ms liegen (hängt natürlich vom konkreten Device ab, das
er uns nicht genannt hat). So schnell muss man es erstmal auf der
Ebene des Programms schaffen in einem nicht-realtime-OS.
Wenn eine Handshake Funktion zeitkritisch ist, sollte sie bereits im
Treiber implementiert sein, und nicht im Benutzerprogramm. Db das Buffer
Full, im RTS/CTS. Sonst kann man im UART Fall von einem PC wenig
erwarten. Versuch mal eine zunehmend laengere Blochnachricht zu
uebertragen. Die kommt dann ploetzlich in einzelne Bloecke zerhackt. Mit
einem eigenen Timing. Ich hab die Details dazu leider vergessen. Und der
USB treiber macht auch noch seine Spielchen.
Fazit. Man sollte von einem PC keine Echtzeitleistungen erwarten.