Hallo, ich habe eine kleine Verständnisfrage zu den verschiedenen Speichern im Mikrocontroller. Wenn ich eine Variable während der Laufzeit berechnen lasse, liegt sie zu diesem Zeitpunkt ja im SRAM. Was ist aber, wenn ich eine Variable mit einem festen Wert belege? Wird diese in den SRAM geladen, damit mit ihr gearbeitet werden kann oder wird dabei auf den Flash zugegriffen? Hintergrund: Ich will mein späteres Programm möglichst Ressourcensparend programmieren. Dabei habe ich zb. einen Wert, mit dem etwas verglichen wird. Ist es SRAM schonender, wenn ich den Festwert als Zahl benutze oder kann ich, um die Konfiguration nachher zu erleichtern, eine Variable dafür nehmen? Und wie sieht es eigentlich mit der Benutzung von Arrays aus? Brauchen sie mehr oder weniger Speicher als einzelne Variablen? Gruß, Holger
RTFM zum Compiler + uController den Du verwendest! Falls Du 8 Bit AVR mit dem GCC verwendest: http://www.nongnu.org/avr-libc/user-manual/index.html
Ja, ich verwende einen 8bit AVR mit GCC und programmier ihn mit AVR Studio. Ich werde mir den Link mal anschauen, danke!
@ Holger (Gast) >Wenn ich eine Variable während der Laufzeit berechnen lasse, liegt sie >zu diesem Zeitpunkt ja im SRAM. Ja. >Was ist aber, wenn ich eine Variable mit einem festen Wert belege? Liegt sie immer noch im SRAM. >Ich will mein späteres Programm möglichst Ressourcensparend >programmieren. Dabei habe ich zb. einen Wert, mit dem etwas verglichen >wird. Dafür gibt es feste Werte, die man sinnvoll mit #define darstellt.
1 | #define MAXIMUM 100 // define kostet keinen Speicher
|
2 | int meine_variable; // variablen kosten echten Speicher |
3 | |
4 | if (meine_variable > MAXIMUM) blub(); |
>Und wie sieht es eigentlich mit der Benutzung von Arrays aus? >Brauchen sie mehr oder weniger Speicher als einzelne Variablen? Was wohl? Mal in ein C-Buch geschaut? Was ist denn ein Array? MFG Falk
>Wenn ich eine Variable während der Laufzeit berechnen lasse, liegt sie >zu diesem Zeitpunkt ja im SRAM. Ja >Was ist aber, wenn ich eine Variable mit einem festen Wert belege? >Wird diese in den SRAM geladen, damit mit ihr gearbeitet werden kann >oder wird dabei auf den Flash zugegriffen? JA, wenn Du keine speziellen Vorkehrungen triffst, wie z.B. das Attribute "PROGMEM" verwendest, werden ALLE Variabeln im RAM initialisiert oder in einem der CPU-Register. Selbst Variabeln die CONST sind. Lokale Vaiabeln auf dem Stack, Globale oder Static Variabeln im Heap. >Ist es SRAM schonender, wenn ich den Festwert als Zahl benutze oder kann >ich, um die Konfiguration nachher zu erleichtern, eine Variable dafür >nehmen? Ja, dann werden sie schon vom Compiler ausgewertet und fest in die ASM-Instruktionen eingebaut und belegen kein zusätzliches RAM >Und wie sieht es eigentlich mit der Benutzung von Arrays aus? >Brauchen sie mehr oder weniger Speicher als einzelne Variablen? Nein, es wird immer exakt so viel Speicher belegt, wie die Variabeln benötigen
Deine Frage lässt mich vermuten daß du Anfänger bist. Mein Tipp, nicht so viel theoretisieren und schon vor den ersten Zeile Code Optimierungsüberlegungen anstellen, sondern üben lesen üben lesen ... Und dann wenn es konkret knapp wird über Optimierungen nachdenken, nicht vorher! Du bekommst für unbenutzten Speicher kein Geld zurück.
Sorry, dass ich mich jetzt erst melde und vielen Dank für eure Antworten! Udo Schmitt schrieb: > Deine Frage lässt mich vermuten daß du Anfänger bist. > Mein Tipp, nicht so viel theoretisieren und schon vor den ersten Zeile > Code Optimierungsüberlegungen anstellen, sondern > üben > lesen > üben > lesen > ... > > Und dann wenn es konkret knapp wird über Optimierungen nachdenken, nicht > vorher! > Du bekommst für unbenutzten Speicher kein Geld zurück. Ich bin zwar nicht der erfahrenste, gerade was C angeht, aber als blutigen Anfänger würde ich mich auch nicht sehen. Das Problem ist, dass man in der Windowsprogrammierung (kleine Programme zum üben) nicht auf Teufel komm raus Ressourcen sparen muss und man sich daher nicht allzu viele Gedanken drum macht, was ein wenig sparsamer wäre. ;) Mein Problem ist, dass ich ein Array zur Laufzeit berechne und dieses mit anderen festen Arrays vergleichen wollte. Aber es bleibt mir wohl nichts anderes übrig, als jeden Wert einzeln mit einem Festwert zu vergleichen, oder? (Es sind zu viele, als das sie als Array in den SRAM passen würden, daher mein Wunsch der Optimierung.)
Hier ist was du suchst: http://deans-avr-tutorials.googlecode.com/svn/trunk/Progmem/Output/Progmem.pdf mit EEMEM geht das analog, darfst dann nur nicht vergessen auch die .eep Datei mit zu flashen.
So isses; PROGMEM und EEMEM sind die Stichworte. Konkret: Das feste Array im FLASH ablegen und dann byteweise mit dem dynamischen Array (im SRAM) vergleichen.
Das scheint genau das zu sein, was ich suche. Besonders der Link von dir, Martin, war wirklich Hilfreich! Ich danke euch! :)
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.