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.
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
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.
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.
Welches Hardware oder Software System? Unter windows XP? ;-) (Gibts auch und läuft recht gut)
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.