avr-gcc mit avr-libc select() Funktion (synchronous I/O multiplexing)

Gast #1987826
Lesenswert?

Hallo,

ist es möglich auf mehrer I/O Ereignisse gleichzeitig zu warten?

Unter Posix Systemen gibt es die Funktion select() auf verschiedene I/O 
Ereignisse zu warten. Könnte man so etwas auch mit der avr-libc 
realisieren?

Mein Anwendungsfall wäre simultan von einem UART und einem parallel FIFO 
zu lesen und zu schreiben.


Grüße
Martin
Gast #1987978
Lesenswert?

Natürlich ist es "nur" zeitnahe, aber ich weiß nicht welche I/O Quelle 
zuerst zur weiteren Verarbeitung bereit ist.

Mich hat nur interessiert ob es bereits eine generische Lösung gibt. So 
weit ich das im Code von der avr-libc erkennen kann, fehlt die 
Möglichkeit abzufragen ob eine I/O Quelle bereit zum lese / schreiben 
ist oder einen Fehler liefert. Wenn dafür Callbacks in der FILE struct 
registriert werden können, kann im Prinzip eine generische ähnlich zur 
Version von Peter Dannegger implementiert werden.
#1988076
Lesenswert?

@  Martin (Gast)

>Natürlich ist es "nur" zeitnahe, aber ich weiß nicht welche I/O Quelle
>zuerst zur weiteren Verarbeitung bereit ist.

Mach mal keine Wissenschaft draus, so komplex ist der AVR bei weitem 
nicht.
Ausser einer Handvoll Statusbits braucht man da nichts abzufragen.

MFG
Falk
#1988087
Lesenswert?

Martin schrieb:
> Unter Posix Systemen gibt es die Funktion select() auf verschiedene I/O
> Ereignisse zu warten. Könnte man so etwas auch mit der avr-libc
> realisieren?

Naja, die Idee von select() ist, daß dein Programm dort stehenbleiben 
und auf mehrere Quellen gleichzeitig warten kann, ohne dabei anderen 
Tasks Rechnzeit wegzunehmen. Nun ergibt sich das in der Regel auf einem 
AVR nicht, wenn du nicht gerade irgendein RTOS drauf laufen läßt. Du 
kannst also einfach, wie es Peter schreibt, in einer Schleife die 
unterschiedlichen Quellen pollen.

Martin schrieb:
> Mich hat nur interessiert ob es bereits eine generische Lösung gibt. So
> weit ich das im Code von der avr-libc erkennen kann, fehlt die
> Möglichkeit abzufragen ob eine I/O Quelle bereit zum lese / schreiben
> ist oder einen Fehler liefert.

Brauchst du extra eine lib-Funktion, um ein Flag in einem I/O-Register 
abzufragen?

> Wenn dafür Callbacks in der FILE struct registriert werden können, kann
> im Prinzip eine generische ähnlich zur Version von Peter Dannegger
> implementiert werden.

Generisch ist halt immer ganz nett, aber dafür halt meist komplizierter 
und mit einem Overhead verbunden. Ob es das auf einem AVR wert ist?
#1988105
Lesenswert?

Martin schrieb:
> Wenn dafür Callbacks in der FILE struct
> registriert werden können

Callback ist doch nur ein anderer Name für Funktionspointer.
Ist im Prinzip möglich, hat aber einige Nachteile.
Ein Callback in einem Interrupt bewirkt, daß sämtliche 
Scratchpad-Register gesichert werden müssen.
Außerdem besteht die Gefahr, daß mehrere Instanzen einer Funktion 
möglich sind. Z.B. 2 Instanzen der UART ergibt einen hübschen 
Zeichensalat.
Man sollte also genau überlegen, ob diese erhöhte Komplexität auch 
wirklich nötig ist.

Ich habe mal nen Callback für zeitgesteuerte Funktionen an den AVR 
angepaßt. Ich benutze ihn allerdings im Main, so daß es keine Probleme 
mit mehreren Instanzen gibt:
Beitrag "Wartezeiten effektiv (Scheduler)"


Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren