Stack auf dem AT91SAM7S256

OP #607520
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
#607614
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
OP #608216
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?
OP #608283
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...
OP #608294
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 :-)
Gast #608435
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ß!
#608444
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren