Forum: Compiler & IDEs avr-gcc mit avr-libc select() Funktion (synchronous I/O multiplexing)


von Martin (Gast)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Martin schrieb:
> ist es möglich auf mehrer I/O Ereignisse gleichzeitig zu warten?

Sender Jerewan: "Im Prinzip ja, aber ...".

Du hast kein Betriebssystem.  Du musst dir das selbst organisieren.
select() bzw. poll() sind Systemaufrufe eines Betriebssystems, die
gibt's hier natürlich nicht.

von Falk B. (falk)


Lesenswert?

@  Martin (Gast)

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

Definiere "gleichzeitig".

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

Lass mich raten, das simultan ist eher "zeitnah". Wie man das macht? 
Siehe Multitasking.

MFG
Falk

von Peter D. (peda)


Lesenswert?

Martin schrieb:
> ist es möglich auf mehrer I/O Ereignisse gleichzeitig zu warten?

Ja, sowas mache ich in meinen Programmen ständig:
1
int main( void )
2
{
3
  // some init stuff
4
5
  for(;;){
6
    if( flag_1 )
7
      do_1();
8
9
    if( flag_2 )
10
      do_2();
11
12
    if( flag_3 )
13
      do_3();
14
    // usw.
15
  }
16
}


Peter

von Martin (Gast)


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.

von Falk B. (falk)


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

von Rolf M. (rmagnus)


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?

von Peter D. (peda)


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

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