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
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.
@ 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
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
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.
@ 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
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.