Stack kopieren!?
-
CDiscoverer schrieb:
ja jeder thread hat doch seinen eigenen progamm instruktion stack!?!? oder welche stack gibts es den noch??
Was ist denn ein instruction stack?
Jeder Thread hat einen User Mode Stack, das ist der, den du als "Stack" kennst. Allerdings gibt es mindestens auch noch einen Kernel Mode Stack, der benötigt wird wenn dein Thread einen Syscall ausführt. Auf den hast du aber natürlich keinen Zugriff...
-
hehe.. ja mir is da grad kein bessere begriff eingfallen^^
ok, sagen wir mal ich hab nen ganz simplen microcontroller, und will preamtives mutlitrheading machen, muss ich ja den "stack" beim taskwechsel zwischenspeichern! und auch noch "sämpliche" register?
wie komm ich den an den stackpointer? wie heist der den?
-
CDiscoverer schrieb:
ok, sagen wir mal ich hab nen ganz simplen microcontroller, und will preamtives mutlitrheading machen, muss ich ja den "stack" beim taskwechsel zwischenspeichern! und auch noch "sämpliche" register?
Der Stack ist doch einfach nur ein Speicherbereich. Du brauchst also nicht den ganzen Stack kopieren, das wär doch unglaublich langsam. Alles was du tun musst ist, den Stackpointer des aktuellen Thread sichern und durch den Stackpointer des nächsten Thread zu ersetzen...
CDiscoverer schrieb:
wie komm ich den an den stackpointer? wie heist der den?
Das hängt wohl von der Architektur deines Mikrocontrollers ab...
-
hmmm ?? schau doch mal da:
http://wiki.osdev.org/Multitasking_Systems
Bei: "How does it work!"
Da wird beschrieben, dass der ganze stack inhalt gespeichert wird, und der von nem anderen task geladen wird (das alles in nem interrupt) danach spring er wieder aus dem interrupt, und der cpu arbeitet mit dem geladen stack an der stelle weiter..
versteh ich da was falsch?
-
Ja. Wo liest du das denn dort?
-
oh du hast recht:
If you still want to figure out, imagine a machine with an accumulator and a stack pointer.
wie würd ich den auf meinem rechner in nem c pogramm den stack pointer speichern?=
-
Mit purem Standard C gar nicht. Entweder über irgendwelche Compiler Intrinsics (siehe Doku deines Compilers), Assembler (Assembler lernen) oder entsprechende Funktionalität deines Betriebssystems (siehe Doku deines Betriebssystems).
-
Ja verstehe. Wen ich mit pro "Task" nur den Stack Pointer merken muss, wie ist dann gewährleist, das die beiden Stacks der jweiligen Task sich nich gegenseitig im Speicher überschreiben!? is das ne Doofe Frage? wenn ja, dann hab ich es nich verstanden^^
-
CDiscoverer schrieb:
Ja verstehe. Wen ich mit pro "Task" nur den Stack Pointer merken muss, wie ist dann gewährleist, das die beiden Stacks der jweiligen Task sich nich gegenseitig im Speicher überschreiben!?
-
Ja das versteh ich. aber der virtual memory gibts es ja nur auf ner höheren abstraktion ebene.. Anwedungs schicht.. überm kernel. Aber wenn ich nen primitven microcontroller habe, auf dem ich multithreadin realsieren möch, da muss ich doch den gesamen prozess-kontext (+ stack) des cpus pro task speicheren.. beim prozessswitch!
Hier ein ausschnitte aus freeRTOS.. (hier wird unten der hardware stack gsichert)
#define portSAVE_CONTEXT( ucForcedInterruptFlags ) \ { \ _asm \ /* Save the status and WREG registers first, as these will get modified \ by the operations below. */ \ MOVFF WREG, PREINC1 \ MOVFF STATUS, PREINC1 \ /* Save the INTCON register with the appropriate bits forced if \ necessary - as described above. */ \ MOVFF INTCON, WREG \ IORLW ucForcedInterruptFlags \ MOVFF WREG, PREINC1 \ _endasm \ \ portDISABLE_INTERRUPTS(); \ \ _asm \ /* Store the necessary registers to the stack. */ \ MOVFF BSR, PREINC1 \ MOVFF FSR2L, PREINC1 \ MOVFF FSR2H, PREINC1 \ MOVFF FSR0L, PREINC1 \ MOVFF FSR0H, PREINC1 \ MOVFF TABLAT, PREINC1 \ MOVFF TBLPTRU, PREINC1 \ MOVFF TBLPTRH, PREINC1 \ MOVFF TBLPTRL, PREINC1 \ MOVFF PRODH, PREINC1 \ MOVFF PRODL, PREINC1 \ MOVFF PCLATU, PREINC1 \ MOVFF PCLATH, PREINC1 \ /* Store the .tempdata and MATH_DATA areas as described above. */ \ CLRF FSR0L, 0 \ CLRF FSR0H, 0 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF POSTINC0, PREINC1 \ MOVFF INDF0, PREINC1 \ MOVFF FSR0L, PREINC1 \ MOVFF FSR0H, PREINC1 \ /* Store the hardware stack pointer in a temp register before we \ modify it. */ \ MOVFF STKPTR, FSR0L \ _endasm \ \ /* Store each address from the hardware stack. */ \ while( STKPTR > ( unsigned char ) 0 ) \ { \ _asm \ MOVFF TOSL, PREINC1 \ MOVFF TOSH, PREINC1 \ MOVFF TOSU, PREINC1 \ POP \ _endasm \ } \ \ _asm \ /* Store the number of addresses on the hardware stack (from the \ temporary register). */ \ MOVFF FSR0L, PREINC1 \ MOVF PREINC1, 1, 0 \ _endasm \ \ /* Save the new top of the software stack in the TCB. */ \ _asm \ MOVFF pxCurrentTCB, FSR0L \ MOVFF pxCurrentTCB + 1, FSR0H \ MOVFF FSR1L, POSTINC0 \ MOVFF FSR1H, POSTINC0 \ _endasm \ }
-
CDiscoverer schrieb:
Ja das versteh ich. aber der virtual memory gibts es ja nur auf ner höheren abstraktion ebene.. Anwedungs schicht.. überm kernel.
Nein. Virtual Memory ist ein Feature der Hardware. In Software wäre das viel zu lahm...
CDiscoverer schrieb:
Aber wenn ich nen primitven microcontroller habe, auf dem ich multithreadin realsieren möch, da muss ich doch den gesamen prozess-kontext (+ stack) des cpus pro task speicheren.. beim prozessswitch!
Ich kenn deine Mikroarchitektur nicht. Vielleicht musst du ja wirklich, wer weiß...
-
Ahh Virtual Memory gibts auch auf Hardware Ebene:) danke Dot:) Ja das Code Beispiel ist von nem PIC 18F...! Vll. hat der keinen Virtuellen Speicher.. hmm
-
Virtual Memory funktioniert nur mit Hardwaresupport, alles andere wäre unpraktikabel was die Performance betrifft.
Ich bin ehrlich gesagt kein Experte für Mikrocontrolleprogrammierung, aber anstatt Beispiele für irgendeine Architektur zu suchen, solltest du dich wohl besser einfach mal mit der konkreten Architektur auseinandersetzen für die du dein Betriebssystem bauen willst...
-
Ja dot , danke:) Ich setzt ,ich jetzt auch mal mit hardware architekturen und assembler auseinander;) danke für die infos;)