Echtzeit Betriebsystem

Gast #328455
Lesenswert?

Hallo Leute,
Ich bin grad am Betriebsystem portieren. Ich habe mir gedacht den Stack
brauche ich doch nicht retten oder? da bei Atmegas genug gross ist kann
ich doch den Stack pointer so verbigen das eine neue gestartete Task
einen Bereichbekommt, wenn die Task beendet wird dann frei gegeben.
Also kurz gesagt ich Teile den Stack in Bereiche.
#328456
Lesenswert?

Ja, jeder Prozess hat seinen eigenen Stack.

Beim Taskwechsel speicherst du alle Register in dem Stack des gerade
verlassenen Prozess, dann wechselst den Stackpointer zum nächsten
Prozess und holst die Register vom neuen Stack und verlässt den
Taskwechsel und der neue Prozess wird ausgeführt.

wenn du Beispielcode brauchst kann ich mal was suchen.

Gruß
Roland
Gast #328458
Lesenswert?

Ja ok du ich rette eigentlich den ganzen prozess auf Ram aber den Stack
will ich dabei belassen. Ich will anders als OSII den hier wird nicht
nur der Prozess sondern auch der Stack mit in Ram gerttet wenn du etwas
brauchbare code hast dann hier damit.
Gast #328459
Lesenswert?

Ob du die Stacks statisch allozierst, dynamisch, oder irgendwie den
"normalen" Stack zerschnipselst, das ist der Maschine egal.

Statische Speicherbelegung erleichtert freilich die Abschätzung der
benötigten Speicherkapazität, da der Linker die Grösse der
Speichersegmente anzeigen kann. Bei einer wie auch immer realisierten
dynamischen Allokation merkt man das erst zur Laufzeit.
Gast #328462
Lesenswert?

Naja um dynamische Speichterverwaltung zu Programmieren gehört doch
einbißchen zu viel unter Umständen muss man dann schon bereits
existierende Stacks verschieben und wie du schon breits erwähnt hast
Laufzeit......Diese fehler kennen wir doch von einen gewissen
Betriebsystem oder? Ich mach was ganz einfachen mit einen kleinen
Scheduler und Kernel.
#328463
Lesenswert?

Hab hier noch eine Version die ich dir schicken kann, weiß jetzt nicht
wie viele Fehler da noch drin sind ;-) aber als Inspiration kanns
vielleicht helfen.

Beginnen tust du so:
void Task1(void) {
for(;;) {
 mach irgendwas, gib den Task dann wieder mit usleep frei
}
}

void Task2(void) {
for(;;) {
 mach irgendwas, gib den Task dann wieder mit usleep frei
}

}
CreateTask(96, Task1); // Stack mit 96 Byte für Task1
CreateTask(64, Task2); // 64 Byte für Task2
StartTasks();

Da die Stackgrößen der einzelnen Tasks statisch fest gelegt werden ist
man halt relativ eingeschränkt, da die Sache abschmiert, wenn ein
Prozess zu viel Stack braucht.
Gruß
Roland
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren