• Diese Seite verwendet Cookies. Indem du diese Website weiterhin nutzt, erklärst du dich mit der Verwendung von Cookies einverstanden. Erfahre mehr

Event Handler in C

Herakles

Profifragensteller
Themenstarter #1
Hallo!

Ich möchte gern einen Event Handler in C implementieren. Wozu? Ich schaue auf einem Bluetooth-Gerät nach Paketen, die auf dem Gerät hereinkommen und möchte immer dann, wenn ein Paket empfangen wurde, eine Aktion starten.

Kann mir jemand einen Hinweis geben, wie ich ein C einen Event-Handler programmiere? Ich will keinen poll in einer Endlosschleife. Hmmm, oder macht ein select() in einer Endlosschleife, was ich will?

Beim Schreiben kommt mir dennoch nicht die Antwort. Also: Kann man in C Event Handler implementieren und wenn ja, wie? Ich will keinen SIGNAL-Handler, sondern einen frei definierbaren Event Handler...

Komische frage, hm?

Grüße
Herakles
 

Crest

rm -rf /*
Mitarbeiter
#3
Klingt als wäre dein Problem nicht C sondern deine Erwartungshaltung, das was du dir unter einem Event vorstellst auch so in C existiert. Vermutlich wirst du das Bluetoothdevice einmalig öffnen müssen und anschließend blockierend davon lesen können. Sofern du den FD nicht auf non-blocking setzt blockiert ein Thread beim lesen von dem FD ohne das du CPU Take mit pollen verbrennst.
 

serie300

Well-Known Member
#5
Natürlich kann man in C Eventhandler programmieren (weil da kann man alles programmieren) :-).

Bei Embedded Sachen (wo ich mich besser auskenne wie auf großen BS) - evtl mit MicroKernel - wird das sogar sehr gut unterstützt. Auch wenn es dumm klingt, eigentlich ist das Sache des OS, inwieweit FreeBSD hier aber mit Threading und Semaphoren und Eventhandlern Unterstützung gibt weiß ich nicht. Evtl. geht was mit Mailboxsystemen auf Bussen(ich meine jetzt nicht email) ("When message received in box"). ADA hat zum Beispiel von Haus aus Unterstützung für sowas, Python müßte das auch haben.
- Wenn es total asynchron sein soll: In einem eigenen Thread warten, daß was reinkommt
- HW Interrupt oder SWI kommt wohl auf PC für sowas nicht in Frage
- Wenn das Programm was anderes macht kann man evtl. an entsprechender Stelle nachschauen (z.B. auch in einer pipe)
 

Vril

Well-Known Member
#7
1. weil ein polling meiner Auffassung nach inperformant ist, weil es aktives Warten ist.
2. weil ich lernen möchte, wie es richtig gemacht wird.

Herakles
Inperformantes aktives Warten?
Wir reden aber schon über C unter BSD und nicht MS-DOS? ;-)

Ich wuesste nicht, weshalb ein Prozess im Polling nicht "aktiv" warten sollte!
 
#8
1. weil ein polling meiner Auffassung nach inperformant ist, weil es aktives Warten ist.
2. weil ich lernen möchte, wie es richtig gemacht wird.
Hmmm, mir scheint dir ist die Funktion eines Event-Handlers nicht klar. Einen Event-Handler benutzt du wenn eine Event-Quelle ein Event sendet. Dafür gibt es dann entsprechende APIs, z.B. Callbacks oder Signals. Wenn das Device aber kein Event sendet, dann musst du den Datenstrom pollen, evtl. buffern und dann selbst ein Event senden. Erst den kann dann ein Event-Handler verarbeiten. Das sind also zwei ganz unterschiedliche Sachverhalte.

Kurz und gut: Wenn du einen Event-Handler schreiben willst, brauchst du erst mal eine Quelle für dein Event.
 
#11
1. weil ein polling meiner Auffassung nach inperformant ist, weil es aktives Warten ist.
Was heißt denn für dich "polling"? Die meisten nutzen select() einfach falsch, in dem Sie es in einer Schleife mit einem Timeout laufenlassen. Damit wird dann natürlich in der Schleife CPU-Zeit verbrannt. Ein select() mit einem Timeout von NULL blockiert ebenso gut wie ein read()fread() auf den Dateideskriptor und verbraucht genau garnix.

Kamikaze hat schon Recht mit seinem Vorschlag: Du willst ja eh nur lesen, also nimmst du einfach read()/fread().

Rob
 

Vril

Well-Known Member
#12
.... Darauf steht in der Regel der Tod durch Vierteilen.
:-)

Also bevor ich irgendwann gevierteilt werde, möchte ich dann hier doch noch 'mal konkreter nachfragen.

Der Threadersteller möchte von einem BT lesen - und dabei Polling vermeiden.
Üblicherweise wird doch mit Bluetooth über virtuelle serielle Schnittstellen kommuniziert,
so dass ich jetzt mal der Einfachkeitkeit halber bei einer physischen seriellen Schnittstelle bleibe.

Realisiert wird dieses Interface durch einen UART, eine paar externen Pegelwandlern, die dann halt die
Signale des UART auf RS232-C, TTY, oder was auch immer anpassen.

Nun wollen wir also Signale von daus dem UART-Baustein lesen,
was ich hier mal grob vereinfacht skizzieren will:

D.h. wir muessen dem Ding erstmal sagen unter welchen Rahmenbedingungen
Signale hereinkommen werden:
- Baudrate,
- Anzahl Datenbits, Stoppbits,
- welche Flusskontrolle
usw.
aber ich muss dem UART Baustein auch sagen,
ob und wie er seine Buffer fuer eingehende Daten nutzen soll und darf -
und ob und wann er einen Interrupt senden bzw. ausloesen soll, der dann
z.B. die Event-Handling-Funktion antriggert.

Wenn ich nun in C programmiere, muss ich also wissen in welcher Bibliothek
oder in welchem header-file sind die Dinge - und welche funktionen sind es? -
mit denen ich:

1. den UART Initialisieren kann
2. auslesen kann
3. wie mache ich einen Event-Handler, der von dem Interrupt des UART angestossen wird

ist das bis dahin soweit richtig?

und falls ja, wie geht es weiter?
 

Herakles

Profifragensteller
Themenstarter #14
Lang diskutierte Beitrag, kurzer Sinn: Ich denke, meine Lösung ist ein select mit timeout NULL. Wenn dann Daten auf dem Socket zu finden sind, kann ich die Aktionen durchführen, die ich brauche.

Danke an alle!