Stack kopieren!?
-
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;)