Ich will einen Scheduler probieren und suche dazu nach einem Ansatz. Keine Fertiglösungen. Das ganze stell ich mir so vor: Ein Timerinterrupt speichert die aktuelle Position im Programm und alle Register und wechselt zum nächsten Task. Ist dieser Ansatz praktikabel? Wenn nein, warum nicht?
Ja, ist praktikabel. Jedes preemptive RTOS arbeitet so, wobei die meist auch andere Interrupts dafür nutzen können. Den so gerne im Detail steckenden Teufel wirst du dann allerdings erst so richtig kennenlernen. Sagen dir die Begriffe "Semaphore" und "atomarer Datenzugriff" etwas?
Alan wrote:
> Ist dieser Ansatz praktikabel? Wenn nein, warum nicht?
Praktikabel wofür?
Wenn Du nur zeitgesteuerte Funktionen aufrufen willst, geht das
wesentlich einfacher und resourcenschonender.
Wenn Du echtes Multitasking (wozu braucht man das schon?) machen willst,
dann ja.
Allerdings mußt Du dazu in die Untiefen Deines C-Compilers abtauchen,
damit ihr euch nicht gegenseitig den Speicher überschreibt.
In jedem Fall brauchst Du massig RAM, da ja jede Task ihren eigenen
Stack benötigt.
Und ordentlich MIPS in der CPU, so ein Taskswitching braucht ja massig
Rechenleistung.
Und weiter gehts mit der Peripherie (Timer, Portpins, I2C, SPI usw.),
die darf ja ne Task dann nicht mehr so einfach direkt ansprechen, immer
schön ordentlich über Devicetreiber, sonst krachts gewaltig.
Globale Variablen gibts dann auch nicht mehr.
Peter
@Alan: Wie Peter oben schon gesagt hat kommt es darauf an, was Du wirklich willst. Nur einen Scheduler selbst programmieren, um das Prinzip zu verstehen ? Oder willst Du echtes Multitasking auf einem µC haben, weil Du mehrere Programme "gleichzeitig" laufen lassen willst ? Im ersteren Falle kannst Du's mit dem Mega8 probieren und verschiedene LEDs oder so "gleichzeitig" blinken lassen. Im letzteren Falle muß Dir klar sein wie groß Deine Programme die "gleichzeitig" laufen sollen sein werden. Von der Synchronisierung der einzelnen Prozesse/Tasks mal ganz abgesehen. Viel Spaß beim proggen.
Alan wrote:
> Reicht nen Atmgea8 @ 4MHz?
Reicht wofür?
Multitasking macht man seit es Rechner gibt.
Allerdings hat zu Anfang ein Taskswitching (Wechseln des
Lochkartenstapels) ganz schön lange gedauert.
Peter
Peter Dannegger wrote: > In jedem Fall brauchst Du massig RAM, Wenn du die zu 2/3 belegten 2KB eines Mega32 für 5 Tasks als massig ansiehst... > Und ordentlich MIPS in der CPU, so ein Taskswitching braucht ja massig > Rechenleistung. Ein AVR Interrupt-Handler sichert locker seine 10-20 Register weg, wenn er nicht nur aus ein paar Befehlen besteht. Mit Taskswitcher sind es dann gegen 40. Viel mehr ist es nicht. > Und weiter gehts mit der Peripherie (Timer, Portpins, I2C, SPI usw.), > die darf ja ne Task dann nicht mehr so einfach direkt ansprechen, immer > schön ordentlich über Devicetreiber, sonst krachts gewaltig. Da verwechselst du einen einfachen Taskswitcher / ein einfachst-RTOS mit einem kompletten Betriebssystem. > Globale Variablen gibts dann auch nicht mehr. Dito. Wobei sich übrigens shared memory auch bei grossen Betriebssystemen einer gewissen Beliebtheit erfreut.
Für edukative Zwecke, um mit beispielsweise 3 Tasks ein paar Licher blinken zu lassen, oder ähnlich komplexe Aufgaben, wird ein Mega8 ausreichen. Das in Assembler (für C Anwendungen) geschriebene einfache RTOS AvrX verbrät selber um die 1,5KB. In C geschrieben wird es allerdings etwas voluminöser, da wäre ein 16KB Gerät möglicherweise sinnvoller.
Können wir jetzt mal zur Sache kommen? Der Scheduler soll mit GCC realisiert werden. Wie kann ich die Stelle, an der sich das Programm befand speichern?
Die Return-Adresse steht im Interrupt auf dem Stack. Bis ATmega128 sind das 2 Bytes, darüber 3 Bytes. Einen Zahn will ich dir vorsorglich gleich ziehen: Ganz in reinem C, ohne Assembler-Einsprengsel, ist das nicht realisierbar.
Und was sind diese ASM-Artefakte? Wenns nicht mehr als nen rjmp o.ä. ists nicht schlimm.
Was du suchst ist hier: http://www.avrfreaks.net/index.php?module=FreaksArticles&func=viewArticles Letzter Artikel: "Multitasking on an AVR" Ist verständlich geschrieben, wenn man englisch kann.
Jup, scheint nicht übel zu sein, werde ich morgen mal genauer lesen :)
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.