www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik SRAM Speicherbelegung


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Schmittchen (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rainer (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: el gig (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Philipp Burch (philipp_burch)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: el gig (Gast)
Datum:

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

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Philipp Burch (philipp_burch)
Datum:

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

Autor: Jadeclaw Dinosaur (jadeclaw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Thomas O. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.