Stack kopieren!?



  • 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!?

    So: http://en.wikipedia.org/wiki/Virtual_memory



  • 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;)


Anmelden zum Antworten