Forum: Compiler & IDEs Ansatz für einen Scheduler


von Alan (Gast)


Lesenswert?

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?

von Andreas K. (a-k)


Lesenswert?

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?

von Alan (Gast)


Lesenswert?

Nein, aber wikipedia ist mein Freund :)

von Peter D. (peda)


Lesenswert?

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

von Alan (Gast)


Lesenswert?

Reicht nen Atmgea8 @ 4MHz?

von yxz (Gast)


Lesenswert?

@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.

von Peter D. (peda)


Lesenswert?

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

von Andreas K. (a-k)


Lesenswert?

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.

von Alan (Gast)


Lesenswert?

Soll nur zu edukationellen Zwecken dienen.

von Andreas K. (a-k)


Lesenswert?

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.

von Alan (Gast)


Lesenswert?

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?

von Andreas K. (a-k)


Lesenswert?

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.

von Alan (Gast)


Lesenswert?

Und was sind diese ASM-Artefakte? Wenns nicht mehr als nen rjmp o.ä. 
ists nicht schlimm.

von Alex (Gast)


Lesenswert?

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.

von Alan (Gast)


Lesenswert?

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