Hallo Leute,
nachdem ich mein Programm fertig auf meinen µC geflasht habe, steht der
Speicherverbrauch da bzw. wird mir angezeigt (siehe Bild).
Was heißen die zwei Angaben ? Bin relativ neu, daher entschuldigt, wenn
das eine dumme Frage ist. Jedoch denke ich, kann man mir hier helfen.
Zu meinen Speichern des Arduino-Board kann ich folgendes sagen:
Flash Memory 256 KB of which 8 KB used by bootloader
SRAM 8 KB
EEPROM 4 KB
Benjamin schrieb:> Hallo Leute,> nachdem ich mein Programm fertig auf meinen µC geflasht habe, steht der> Speicherverbrauch da bzw. wird mir angezeigt (siehe Bild).>> Was heißen die zwei Angaben ? Bin relativ neu, daher entschuldigt, wenn> das eine dumme Frage ist. Jedoch denke ich, kann man mir hier helfen.>> Zu meinen Speichern des Arduino-Board kann ich folgendes sagen:>> Flash Memory 256 KB of which 8 KB used by bootloader> SRAM 8 KB> EEPROM 4 KB
Einmal ist ja das Data und einmal das Programm angegeben, was ist
wichtiger von beiden ?
Wenn 6666 Bytes 2.5% sind ... wieviele Bytes sind dann 100%?
Und wenn 773 Bytes 9.4% sind ... wieviele Bytes sind dann 100%?
Damit solltest Du selbst herausfinden können, welcher Speicher womit
gemeint ist.
Rufus Τ. Firefly schrieb:> Wenn 6666 Bytes 2.5% sind ... wieviele Bytes sind dann 100%?
der Flash-Speicher ?
Rufus Τ. Firefly schrieb:> Und wenn 773 Bytes 9.4% sind ... wieviele Bytes sind dann 100%?
SRam ?
Frage dbzgl.: Welches der beiden Speicher ist wichtiger ?
Und wenn ich eine Zustandsreglung aufbauen möchte, was ist da wichtiger
? Sram oder Flash?
@ Benjamin (Gast)
>> Wenn 6666 Bytes 2.5% sind ... wieviele Bytes sind dann 100%?>der Flash-Speicher ?
Jo.
>> Und wenn 773 Bytes 9.4% sind ... wieviele Bytes sind dann 100%?>SRam ?
Jo die 2.
>Frage dbzgl.: Welches der beiden Speicher ist wichtiger ?
Wenn einer von beiden >100% ausgelastet ist, hast du ein Problem.
Meistens hat man eher Probleme mit dem SRAM als dem Flash. Siehe
Speicher.
>Und wenn ich eine Zustandsreglung aufbauen möchte, was ist da wichtiger>? Sram oder Flash?
Kann man so allgemein nicht sagen. Eine Statemachine braucht eher
mehr Flash als SRAM.
Na, die beiden Speichertypen hast Du ja schon mal zuordnen können.
Deine Frage allerdings ...
Also: Im Flash wird Dein Programm abgelegt, und konstante (d.h.
unveränderliche) Daten, wie Texte etc.
Im RAM werden Daten abgelegt, die sich während der Laufzeit Deines
Programmes ändern können, d.h. unter anderem Deine Variablen, und --sehr
wichtig-- der Stack.
Man kann nicht festlegen, was "wichtiger" ist -- beides ist wichtig,
aber das RAM ist deutlich knapper bemessen.
Hier gibt es eine Besonderheit der AVR-Architektur zu berücksichtigen;
wenn Du mit Stringkonstanten arbeitest, landen diese nicht nur im Flash,
sondern belegen zusätzlich noch RAM -- das ist etwas, was man nur mit
Klimmzügen umgehen kann.
Siehe hierzu:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Flash_mit_PROGMEM_und_pgm_read
und
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Flash_mit_flash_und_Embedded-C
Rufus Τ. Firefly schrieb:> Hier gibt es eine Besonderheit der AVR-Architektur zu berücksichtigen;> wenn Du mit Stringkonstanten arbeitest, landen diese nicht nur im Flash,> sondern belegen zusätzlich noch RAM -- das ist etwas, was man nur mit> Klimmzügen umgehen kann.
Das ist keine Besonderheit der AVR, sondern eine Besonderheit der
gewählten Programmiersprache/Compiler.
Das kann man ohne Klimmzüge mit der richtigen Programmierumgebung
beheben.
Der Compiler zeigt dir an wie viel Flashspeicher das eigentliche
Programm belegt.
Und wie viel Ram durch Variablen und Konstanten beim Start des Programms
bereits belegt werden.
Den weiteren RAM verbrauch während der Ausführung deines Programms kennt
der Compiler natürlich nicht. Der wird durch den Stack verbraucht, der
wächst mit jedem Funktionsaufruf (und schrumpf mit dem beenden einer
Funktion)
Und den Heap, der wird durch 'new', malloc(), etc. verbraucht.
Der Stack wächst von oben, und der Heap von unten, das dazwischen ist
dein freier RAM. Sobald Stack und Heap sich überschreiben stürzt dein
Programm ab.
Da man dynamischen Speicher, also 'new', malloc() usw. auf einem µC
meistens nicht verwendet, muss man nur auf den Stack achten der
eigentlich nur durch unkontrollierte rekursive Funktionsaufrufe zu groß
wird.
Beim Aufruf einer Funktion werden folgende Daten auf dem Stack
gespeichert:
die Rücksprungadresse
die übergeben Variablen
eventuelle Register die gebackupt werden
die lokalen Variablen der Funktion
Alles wird beim verlassen der Funktion wieder freigegeben.