Forum: Mikrocontroller und Digitale Elektronik Verständnisfrage zum Speicher


von Holger (Gast)


Lesenswert?

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

von Peter S. (psavr)


Lesenswert?

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

von Holger (Gast)


Lesenswert?

Ja, ich verwende einen 8bit AVR mit GCC und programmier ihn mit AVR 
Studio.

Ich werde mir den Link mal anschauen, danke!

von Falk B. (falk)


Lesenswert?

@  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

von Peter S. (psavr)


Lesenswert?

>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

von Udo S. (urschmitt)


Lesenswert?

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.

von Holger (Gast)


Lesenswert?

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

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

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.

von Patrick (Gast)


Lesenswert?

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.

von Holger (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.