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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.