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
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.
> 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.
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
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
Sag mal, hast du eigentlich jeden Thread der entfernt mit Speicher zu tun hat für deine Frage beschlagnahmt? Einer hätte auch gereicht!
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.
@Jadeclaw: Nun, ich denke, nach gut zweieinhalb Jahren sollte er es nun rausgefunden haben ^^
Aufs Datum guck Ups! Das kommt davon, wenn irgendjemand alte Threads wieder ausgräbt. Lassen wir das Teil mal wieder sanft einschlafen. Gruss Jadeclaw.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.