Forum: Mikrocontroller und Digitale Elektronik Stack auf dem AT91SAM7S256


von Peter P. (axis)


Lesenswert?

Hallo NG,

nach längeren Überlegungen möchte ich nun doch gerne den Stack 
verwenden. Es ist einfach am besten - so denke ich - die betroffenen 
Register vor einem Funkionsaufruf auf den Stack zu legen und danach 
wieder zu holen.

Kann mir jemand sagen, wo ich die Position und Größe des Stacks im 
Speicher definiere? Ich verwende die IAR Workbench4.

Vielen Dank für jeden Hinweis!
Peter

von Thomas P. (pototschnig)


Lesenswert?

In meinem Linker-File steht das hier:

MEMORY
{
  FLASH (rx) : ORIGIN = 0x00100000, LENGTH = 0x00040000
  DATA (rw)  : ORIGIN = 0x00200000, LENGTH = 0x00010000
  STACK (rw) : ORIGIN = 0x00210000, LENGTH = 0x00000000
}

Du brauchst also deinen Stack-Pointer nur mit 0x00210000 laden; Der 
stack wächst nach unten.

Mfg
Thomas Pototschnig

von Peter P. (axis)


Lesenswert?

>Du brauchst also deinen Stack-Pointer nur mit 0x00210000 laden; Der
>stack wächst nach unten.

Wenn ich für mich sage, dass in einem bestimmten Speicherbereich mein 
Stack sein soll, reicht es dann, dass ich nur den Stackpointer auf das 
Ende dieses Speicherbereichs Zeigen lasse? Kann ich dann theoretisch 
schon den Stack mit push und pop verwenden? Da müsste doch eigentlich 
der Assembler / Linker nicht zwingend davon wissen - gesetzt dem Falle, 
dass ich den Speicherbereich nicht anderswo benötige, oder?

von Thomas P. (pototschnig)


Lesenswert?

Du weißt aber schon wie ein Stack funktioniert? :-)

Mfg
Thomas Pototschnig

von Peter P. (axis)


Lesenswert?

Hey, coole Antwort. Bringt mich super weiter! Danke ;-)

- first in last out
- push: wert an SP-Zeiger-Adresse schreiben und SP ++ oder --
- pop: SP -- oder ++ und wert von SP-Zeiger-Adresse lesen

so ähnlich stelle ich mir nen Stack vor.

von Peter P. (axis)


Lesenswert?

OK, fürs Protokoll:

es scheint zu gehen.
r13 scheint mir der Stackpointer zu sein.

Beispiel, um r1 auf den Stack zu legen:

// Stackpointer ans Ende der 64KB SRAM setzen
LDR r13, =0x210000

// r1 auf den Stapel legen // SP(r13) ist danach 0x0020FFFC
PUSH {r1}

---> Hier kommt irgend ein Code

// r1 vom Stapel holen
POP {r1}

PS.: einen Stack habe ich im Assembler / Linker nicht definiert, da bei 
mir sowieso die ganzen 64KB ein Segment sind. Werde wohl später den 
Stack nach 1024+1000 legen...

von Thomas P. (pototschnig)


Lesenswert?

Du brauchst auch keinen Stack definieren - du musst nur den Stackpointer 
mit einer Adresse laden und das wars. Das einzig sinnvolle ist übrigens 
den Stack ans Ende des internen RAMs zu legen.

Mfg
Thomas

von Peter P. (axis)


Lesenswert?

> Das einzig sinnvolle ist übrigens
> den Stack ans Ende des internen RAMs zu legen.

für mich leider nicht :-(

ich möchte doch noch nen 6510-Emulator von C# nach ARM7 portieren, den 
ich geschrieben habe. Und die einzige Adresse, von der ich mit 
ziemlicher Sicherheit sagen kann, dass ich die nicht brauchen werde, ist 
der Bildschirmbereich ab 1024 vom C64-RAM. Deshalb denke ich, dass sich 
da mein ARM-Stack wohl fühlen wird müssen :-) Wobei es bestimmt auch 
ganz schön cool wäre, den Stack vom 64er gegen den vom ARM laufen zu 
lassen. Der ARM beginnt am oberen Ende und der 64er am unteren Ende - in 
der Hoffnung, dass sich die jeweiligen SPs nie kreuzen werden :-))))

Aber jetzt ist erst mal SD-Karte angesagt... Nachdem ich jetzt schon 
stolzerweise Strings und Werte (Hex und Binär) über RS232 senden kann, 
hoffe ich, dass ich da in 1-3 Wochen durch bin. Die Zeit ist leider sehr 
begrenzt hier :-)

von Thomas P. (pototschnig)


Lesenswert?

Ah, jetzt versteh ich auch deine vorherigen Fragen ...

6510-Emu in ARM7-Assembler? Hört sich interessant an ... Ist das nur die 
CPU oder VIC und/oder SID auch?

Mfg
Thomas Pototschnig

von Peter P. (axis)


Lesenswert?

naja, was es letztendlich werden soll steht hier:

http://www.pippinger.de/content/view/16/30/

Bis dahin wird wohl noch einiges an Zeit vergehen, aber das macht 
nichts. Ist nur so ein kleines Hobby von mir, wofür ich nicht allzuviel 
Zeit habe.

von Thomas P. (pototschnig)


Lesenswert?

Hmm ... das sieht sehr interessant aus :-)

Aber eins wundert mich ... Du sprichst C#, aber kein C/C++?

Mfg
Thomas Pototschnig

von Peter Pippinger (Gast)


Lesenswert?

Naja, ein bischen Nostalgie soll ja auch noch mit aufkommen. Früher hat 
man halt diverse Laufschriften etc in ASM programmiert (auch demos 
genannt :-)

Mir gehts auch nicht darum, das Ding so schnell wie möglich über die 
Bühne zu ziehen. Es macht einfach Freude, nach all dem 
Resourcenfressendem Zeug, mit dem ich immer täglich so arbeite, mal 
wieder zu sehen, was so ein kleiner Chip mit 18MHz alles kann. Bin nach 
wie vor total begeistert von dem kleinen ARM. Auch wenn ich ihn nicht 
100% verstehe, macht die Arbeit mit dem Teil echt Spaß!

von Thomas P. (pototschnig)


Lesenswert?

> kleiner Chip mit 18MHz

Verwendest du die PLL nicht? Ohne USB sind doch 55MHz möglich (mit USB 
48MHz)... Oder war das nur ein Verschreiber?

Ich komm ja auch noch aus der alten C64 Zeit ... damals versuchte ich 
mich mal an Assembler, habs aber nicht kapiert. War wohl noch etwas zu 
jung ...

Hin und wieder kram ich dann zB Zac McKracken raus und zock es nochmal 
im Emu :-)

Bin gespannt was da bei deinem SID-Player rauskommt!

Mfg
Thomas Pototschnig

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
Noch kein Account? Hier anmelden.