mikrocontroller.net

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


Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter Dannegger (peda)
Datum:

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

Ja, sowas mache ich in meinen Programmen ständig:
int main( void )
{
  // some init stuff

  for(;;){
    if( flag_1 )
      do_1();

    if( flag_2 )
      do_2();

    if( flag_3 )
      do_3();
    // usw.
  }
}


Peter

Autor: Martin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rolf Magnus (rmagnus)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.