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
@ 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
>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.)
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.