INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
Angabe des Dynamischen Speicherverbrauchs nach Compilieren
16.10.2019, 13:49 (Dieser Beitrag wurde zuletzt bearbeitet: 16.10.2019 13:52 von BennIY.)
Beitrag #1
Angabe des Dynamischen Speicherverbrauchs nach Compilieren
Guten Nachmittag,

ich habe derzeit ein größeres Projekt auf meinem Atmega328 bei dem ich den verfügbaren Arbeitsspeicher genau beobachten muss um entscheiden zu können wie groß ich diverse Buffer und Arrays letzten Endes auslege.
Nun verrät mir der Compiler nach dem Compiliervorgang wie viel Dynamischer Speicher bereits verbraucht ist und wie viel vorhanden.
Meine Frage ist, auf was sich diese Angabe bezieht. Rechnet der Compiler nur Globale Variablen zusammen oder kann er auch die größte Stackauslastung in der verzweigtesten Unterfunktion erkennen und zählt dieses hinzu.
Mein Programm braucht derzeit 1.5kb RAM, ich bin alle Libs. durchgegangen und kann mir nicht vorstellen so viel Global definiert zu haben. Was ich mir eher vorstellen kann ist, dass diese 1.5kb inkl. des maximalen Stacks sind, ich habe viel lokal definiert.

Der Compiler weiß ja durchaus wie viel gepusht und gepopt wird, er könnte also die maximale Stackauslastung ermitteln und hinzu rechnen. Ist das der Fall? Vielleicht kann mir jemand mehr über die Angabe erzählen.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.10.2019, 13:56 (Dieser Beitrag wurde zuletzt bearbeitet: 16.10.2019 15:24 von Tommy56.)
Beitrag #2
RE: Angabe des Dynamischen Speicherverbrauchs nach Compilieren
[quote='BennIY' pid='62612' dateline='1571230186']
Gerade Libs brauchen in der Regel einiges an Speicher.
Die IDE kann das berücksichtigen, was sie zur Kompilezeit sieht. Da dürfte der Stack noch nicht berücksichtigt sein.

Du kannst den freien RAM zur Laufzeit bestimmen:
Code:
// Quelle: https://jeelabs.org/2011/05/22/atmega-memory-use/
int freeRam () {
   extern int __heap_start, *__brkval;
   int v;
   return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.10.2019, 16:44 (Dieser Beitrag wurde zuletzt bearbeitet: 16.10.2019 16:45 von MicroBahner.)
Beitrag #3
RE: Angabe des Dynamischen Speicherverbrauchs nach Compilieren
(16.10.2019 13:49)BennIY schrieb:  Nun verrät mir der Compiler nach dem Compiliervorgang wie viel Dynamischer Speicher bereits verbraucht ist und wie viel vorhanden.
Genau das tut er nicht. Er verrät dir nur wieviel Speicher statisch verbraucht wurde. Das beinhaltet weder den dynamisch genutzten Speicher ( den Heap ) noch das, was auf dem Stack liegt ( Rücksprungadressen und lokal definierter Speicher ).

Den tatsächlich noch mindestens freien Speicher zu ermitteln ist nicht ganz einfach. Der aktuell freie Speicher schwankt aufgrund des Wachsens und Schrumpfens des Stacks je nach momentanem Programmzustand u.U. sehr stark. Die Funktion von Tommy zeigt dir den freien Speicher zu dem Moment, zu dem Du die Funktion aufrufst. Das heist nicht, das zu einem anderen Zeitpunkt nicht weniger Speicher frei sein kann. Im Prinzip müsstest Du die Funktion zu dem Zeitpunkt aufrufen, zu dem der Stack seine größte Tiefe erreicht hat. Diesen Punkt musst Du aber selbst ermitteln. Da hilft dir der Compiler nicht.
Und dann kommt es noch darauf an, inwieweit Du den Heap beanpruchst, z.B. durch Verwendung von String-Objekten. Das wird zwar auch von der freeRam Funktion berücksichtigt, zeigt aber eben auch nur eine Momentaufnahme zum Aufrufzeitpunkt.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.10.2019, 16:51 (Dieser Beitrag wurde zuletzt bearbeitet: 16.10.2019 16:53 von Tommy56.)
Beitrag #4
RE: Angabe des Dynamischen Speicherverbrauchs nach Compilieren
@TO: Wenn Du bereits bei 1,5 von 2 kByte RAM angelangt bist, solltest Du Dir Gedanken ums Speicher sparen machen.

-- Alle Variablen kleinstmöglich angelegt?
-- Alles als const deklariert, was konstant ist?
-- PROGMEM genutzt?
-- F-Macro konsequent genutzt?
-- Debugausgaben aus dem Kompilat rausnehmbar?

Wenn Du das alles bereits mit "Ja" beantworten kannst, ist der 328 zu klein.

Gruß Tommy

@Microbahner: Danke, dass Du explizit auf den Status Momentaufnahme hingewiesen hast.

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.10.2019, 17:01
Beitrag #5
RE: Angabe des Dynamischen Speicherverbrauchs nach Compilieren
(16.10.2019 13:49)BennIY schrieb:  Der Compiler weiß ja durchaus wie viel gepusht und gepopt wird,...
Nein, das weis er eben nicht. Der Compiler sieht immer nur eine 'Übersetzungseinheit', aber nie das ganze Programm. Dein Sketch wird z.B. vollkommen getrennt von den Libs übersetzt. Das wird erst später zusammengesetzt.

Der erste Schritt wäre auf jeden Fall die Liste von Tommy abzuarbeiten, und Ram zu sparen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.10.2019, 18:35 (Dieser Beitrag wurde zuletzt bearbeitet: 16.10.2019 18:37 von BennIY.)
Beitrag #6
RE: Angabe des Dynamischen Speicherverbrauchs nach Compilieren
-- Alle Variablen kleinstmöglich angelegt? JA
-- Alles als const deklariert, was konstant ist? JA
-- PROGMEM genutzt? AUCH
-- F-Macro konsequent genutzt? JAP
-- Debugausgaben aus dem Kompilat rausnehmbar? EBENSO
und auch sehr sehr viel lokal angelegt und nicht global.

ganz offensichtlich ist der 328 zu klein, ich habe für die nächsten Entwicklungen bereits den Atmega1284 angeschaut die SMD Variante davon ist aber 1-2mm größer und passt damit nicht in die bereits gefertigten Gehäuse das Projekt ist schon sehr fortgeschritten und mein Speicherproblem resultiert aus dem "hier noch was dazu und da noch eine Funktionalität". Zumindest für die nächste Version muss ich beim Atmega328 bleiben.
Die Lösung wird vermutlich sein die EEPROM mehr auszulasten. Ich habe große Arrays mit Benutzereingaben und Optionen die sich aber zur Laufzeit nicht ändern, zumindest sofern der Nutzer keine Änderung in den Settings macht. Diese befinden sich sowieso auf der EEPROM. Nun das ganze Zeug in den RAM zu laden wäre redudant. Ich habe gelesen das ein EEPROM Zugriff pro zu lesendes Byte 4 Cycles braucht (AddrL, AddrH, SetReadMemBit und Read). Rechenleistung hätte ich noch genug da viele Vorgänge nur alle 100 - 200ms angestoßen werden dafür natürlich millis() genutzt, so ist das der Kompromiss der nun hingenommen werden muss.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.10.2019, 18:42
Beitrag #7
RE: Angabe des Dynamischen Speicherverbrauchs nach Compilieren
Evtl. ein Umstieg auf ESP8266 (WEMOS D1 mini) ca. 50 KB RAM, allerdings alles 3,3V.
Der ist kleiner, als der UNO, hat aber weniger Pins.
WEMOS D1 mini als Master, NANO per I2C als intelligente Porterweiterung dran (dazwischen ein Pegelwandler), wäre auch ne Lösung oder I2C-Portexpander.

Ich weiß ja nicht, was Du machen willst.

Gruß Tommy

"Wer den schnellen Erfolg sucht, sollte nicht programmieren, sondern Holz hacken." (Quelle unbekannt)
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
16.10.2019, 18:49 (Dieser Beitrag wurde zuletzt bearbeitet: 16.10.2019 18:51 von BennIY.)
Beitrag #8
RE: Angabe des Dynamischen Speicherverbrauchs nach Compilieren
Das ist auch eine Idee doch ich habe keine Lust auf noch mehr Cips zumal das Zeug sehr klein sein soll es handelt sich um eine Art selbst gebauter UNO also ein Atmega328 mit Resonator dran. Am Ende hängt auch noch ein OLED Display dran, dessen Lib mir auch so 800byte klaut. Ich denke mal wenn ich den Kram auf der EEPROM lasse und nur auf den Ram kopiere wenn ich es brauch, bin ich zwar langsamer aber wie gesagt Rechenleistung hab ich genug. Das Display wird alle 200ms aktualisiert und der Rest ist weitestgehend interruptgesteuert.
Ich hatte nur die Hoffnung die Rest-Speicherangabe im Compiler beinhaltet mehr als nur statische Vars. vielleicht finde ich noch eine Lib die sich zu viel Buffer genehmigt oder ein anderen Speichersünder. Ich muss nochmal häufiger mal drüber schauen.
Ich schaue mir mal den Atmega1284 näher an, da hätt ich alles was ich brauche in einem Chip.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
Wink Solar Roboter- Servo dreht nach Stopp nicht weiter Stagneth.Alexander 37 2.855 20.08.2019 14:15
Letzter Beitrag: geist4711
  RTC MCP 7940 geht nach grobby 15 1.536 13.01.2019 15:01
Letzter Beitrag: grobby
  Leonardo macht keinen Auto-Reset (je nach Sketch) SebastianM 5 978 01.09.2018 07:49
Letzter Beitrag: amithlon
  am besten nur für Arduino MEGA compilieren ? uweq 12 1.796 17.08.2018 19:22
Letzter Beitrag: uweq
Question Arduino Due nach dem 2. Start Fehlermelddung beim flashen juergen001 2 1.319 03.03.2018 09:07
Letzter Beitrag: juergen001
  Schleife nach else beenden Chef_2 24 4.720 08.02.2018 23:28
Letzter Beitrag: Franz54
  Arduino zu MySQL via Wifi Fehler beim compilieren Franzel007 21 3.862 05.01.2018 20:24
Letzter Beitrag: Tommy56
  Fehlermeldung beim Compilieren DonCamillo 1 1.412 16.12.2017 21:04
Letzter Beitrag: Chopp
  String nach Byte Array in ASCII-Codierung nexus1212 7 3.196 05.11.2017 14:36
Letzter Beitrag: Tommy56
  char-Array nach int? torsten_156 8 2.841 04.11.2017 18:44
Letzter Beitrag: Tommy56

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste