Forum: Compiler & IDEs Stackumschaltung - internes RAM


von Werner B. (Gast)


Lesenswert?

Hallo,

Umgebung:
MCU = ATmega128, 4kB internes RAM, 60kB externes RAM

Problem:
ich versuche jetzt seit einiger zeit den task stack für ein
multitasking system in das mcu interne ram zu verlegen.

Lösungsansatz:
Dazu habe ich mir diese 4kB in einer neuen section ".faststack"
reserviert.

static unsigned char task_stack[4096] _attribute_ ((section
(".faststack")));

Im makefile habe ich jetzt den allgemeinen datenbereich ins externe RAM
ab 0x1100 verlegt (-Tdata=0x802000),
den heap_end nach 64kB und den avr-libc stack ans ende des RAM
(--defsym=__stack=0x80ffff) und den .faststack nach 0x800100

EXTMEMOPTS = -Wl,-Tdata=0x801100,--defsym=__heap_end=0x80ffff,
  --section-start=.faststack=0x800100,--defsym=__stack=0x80ffff

Phänomen:
Das ganze funktioniert hervorragend solange ich meinen task_stack[]
ohne das _attribute_... verwende, sobald ich mit dem .faststack
übersetzte, wird ein reset produziert sobald der stack umgeschaltet
wird.

Was mach ich noch falsch ?

von Jörg Wunsch (Gast)


Lesenswert?

Meiner Erinnerung nach kann man ohne manuell angepasste Linkerscripts
nur neue sections im ROM anlegen, nicht im RAM.

Warum überhaupt eine eigene section?  Du kannst doch auf der
Linkerkommandozeile Symbole frei definieren und diese dann für
deinen Stack benutzen.

von Werner B. (Gast)


Lesenswert?

Ich hab' mir erst mal ein neues linker script gebaut und definiere auch
die symbole auf der Linkerkommandozeile.
Kann ich aber erst heute abend testen.

<cut>
     _etext = . ;
  }  > text
  .faststack    : AT (ADDR (.text) + SIZEOF (.text))
  {
    *(.faststack)
  }  > data
  .data     SIZEOF (.faststack) + ADDR (.faststack) :
  {
     PROVIDE (__data_start = .) ;
</cut>

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.