Forum: Mikrocontroller und Digitale Elektronik SRAM Speicherbelegung


von Stefan (Gast)


Lesenswert?

Hallo,

ich benutze im Moment eine ATmega32 mit 2k internen SRAM,
mit diesem Controller läuft mein Programm wunderbar.
Da mein hex-File nur etwa 5,6 kByte groß ist möchte ich
gern auf einen ATmega8 umsteigen, der allerdings nur 1kByte
SRAM hat!

Meine Frage, kann ich mir irgendwie berechnen wieviel RAM-Speicher
ich für das Programm benötige? Mit den globalen Variablen und
einem Array hab ich schon 68 char-Variablen (544 Byte insgesamt).
Dann kommen noch ein paar Variablen aus den Funktionen dazu, deswegen
fürchte ich, dass der Speicher zu klein ist!

Würde beim kompilieren oder debuggen schon ein Fehler anzeigt,
wenn der Speicher zu klein wäre?

Hoffe jemand kann mir einen Tip geben!
Schon mal Danke im voraus!

Ciao Stefan

von Schmittchen (Gast)


Lesenswert?

Den Speicherverbrauch für globale Variablen hast du ja schon
ausgerechnet.

Hinzu kommt der Stackverbrauch (darunter fallen nicht nur die
gesicherten Register und Rücksprungadressen, sondern auch die lokalen
Variablen und Übergabeparameter...). Diesen kann man normalerweise soo
einfach nicht vorhersagen.

Möglichkeit 1: Den Stackpointer zur Laufzeit "ständig" auslesen und
den Tiefststand abspeichern (nicht zu "festen" Stellen im Code,
sondern z.B. in nem Timerinterrupt o.ä.). Diesen Wert dann irgendwie
ausgeben (LCD, RS232...). So hast du zumindest einen Anhaltspunkt
wieviel Stack verbraucht wird.
Wenn du schon eine Vermutung für eine stackfressende Routine hast, dann
kannst du natürlich auch darin zusätzlich den SP abspeichern.

Möglichkeit 2 (besser): Stack (bzw. RAM) mit festem Bitmuster (z.B.
0x55) befüllen. Am Meßende dann überprüfen, in wie weit dieses
Bitmuster überschrieben wurde... (nicht 100,0% wasserdicht, da auch
zufällig dieses Bitmuster abgelegt werden könnte).

Schmittchen.

von Rainer (Gast)


Lesenswert?

> Mit den globalen Variablen und
einem Array hab ich schon 68 char-Variablen (544 Byte insgesamt).

Sollten 68 char-Variablen nicht auch 68Byte sein?! Eigentlich ist char
(wenns nicht grad ein Unicode-System ist, und dass bezweifle ich am AVR
:) ) doch mit 1Byte fixiert?

Rainer.

von Stefan (Gast)


Lesenswert?

Oh, dann hab ich das wohl falsch verstanden!

Hab grad nochmal nen Blick aufs Datenblatt
geworfen:
ATmega8 hat 1k Byte Internal SRAM!
Zieh ich die Belegung für die Port ab, würd das
dann wohl bedeuten ich hab plus Stack Platz für
ca. 980 char-Variablen!

Dann fallen meine 68Byte wohl gar nicht ins Gewicht!

Stefan

von el gig (Gast)


Lesenswert?

hey!

würde gerne das 1k internal sram vom atmega8 nutzen, hab aber wenig
(bis keine ahnung von asm)...

könntet ihr mir 2 routinen zum schreiben und lesen ins intere sram vom
mega8 mailen, wenn möglich in c (für den gcc, winavr2006) ?
wenn asm, bitte dazusagen wo welche adressen einzutragen sind?


vielen dank&gruss,
peter

von Philipp B. (philipp_burch)


Lesenswert?

Sag mal, hast du eigentlich jeden Thread der entfernt mit Speicher zu
tun hat für deine Frage beschlagnahmt? Einer hätte auch gereicht!

von el gig (Gast)


Lesenswert?

jeden nicht, nein.
aber danke für die hilfe.
lg
peter

von Jadeclaw D. (jadeclaw)


Lesenswert?

Stefan schrieb: ""Zieh ich die Belegung für die Port ab,""
Nein, die ziehst du nicht ab.
Zu den 1kByte aus dem Datenblatt kmommen die Ports noch separat dazu.
Das heißt, bis auf den Stack hast du den vollen Bereich frei.
Das gilt auch für Controller mit erweitertem IO-Bereich, auch da ist
das SRam abzüglich Stack voll nutzbar.

Gruss
Jadeclaw.

von Philipp B. (philipp_burch)


Lesenswert?

@Jadeclaw:
Nun, ich denke, nach gut zweieinhalb Jahren sollte er es nun
rausgefunden haben ^^

von Jadeclaw D. (jadeclaw)


Lesenswert?

 Aufs Datum guck 
Ups!
Das kommt davon, wenn irgendjemand alte Threads wieder ausgräbt.
Lassen wir das Teil mal wieder sanft einschlafen.

Gruss
Jadeclaw.

von Thomas O. (Gast)


Lesenswert?

Für Variablen in ASM mach ich das so, ich muss mich dann garnicht drum
kümmern wo das ganze im SRAM liegt, für ein Array müsste man das aber
mit den Pointern machen.

.DSEG  ;Reserve jeweils 1 Byte / Variable im SRAM
Steuerbyte1:    .byte 1
Steuerbyte2:    .byte 1
Temperatur:    .byte 1
....
....

.CSEG
.ORG  0x00
Reset:
lds temp, Steuerbyte1 ;Lade Steuerbyte1(SRAM) nach temp
sts Steuerbyte1, temp ;Speichere temp ins Steuerbyte1(SRAM)

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.