Stack kopieren!?



  • 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