Forum: Mikrocontroller und Digitale Elektronik Echtzeit Betriebsystem


von monk (Gast)


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.

von Roland P. (pram)


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

von Thomas (Gast)


Lesenswert?

Ist eine nicht unübliche Vorgehensweise Stackframes für die Tasks.

von monk (Gast)


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.

von A.K. (Gast)


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.

von Ulrich (Gast)


Lesenswert?

Welches Hardware oder Software System? Unter windows XP? ;-) (Gibts auch
und läuft recht gut)

von monk (Gast)


Lesenswert?

Ist doch egal um sich inspirieren zu lassen. Hauptsache gute ideen.

von monk (Gast)


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.

von Roland P. (pram)


Angehängte Dateien:

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

von monk (Gast)


Lesenswert?

Genau so hab ich auch angefangen vielen dank meine idee hat sich doch
bestätigt danke für den Code.

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.