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
Wie Funktioniert die Speicherverwaltung von Funktionen (nach dem Kompilieren)?
07.05.2014, 17:30 (Dieser Beitrag wurde zuletzt bearbeitet: 07.05.2014 17:31 von itsy.)
Beitrag #1
Wie Funktioniert die Speicherverwaltung von Funktionen (nach dem Kompilieren)?
Hallo,

nachdem ich bei meinem MiniPro am Ende meines SRAM war, habe ich herausgefunden, dass die Zeichenkette des Serial.print-Befehls als Variable im SRAM gespeichert wird. Dann habe ich die Möglichkeit gefunden über Serial.println(F("Text")) diese "Variable" in meinem Flash-Speicher zu speichern, der nun auch knapp ist ;-)

Jetzt suche ich natürlich nach weiteren Möglichkeiten, um bei diesem kleinen Board bleiben zu können. Die Lösung könnte der integrierte EEPROM-Speicher oder sogar ein externen EEPROM-Speicher sein. Erste Tests mit int funktionieren bereits (nutze ich auch für eine andere Funktion des Sketches).

Bevor ich nun aber meine seriellen Ausgaben komplett umstelle, möchte ich hier die Frage stellen, wie Funktionen überhaupt Variablen verwalten d.h. was macht der Compiler daraus?

Hierzu habe ich unterschiedliche Infos gelesen.

Nehmen wir folgendes Beispiel:

Serial.println(eepromAuslesen(20);
Serial.println(eepromAuslesen(50);
Serial.println(eepromAuslesen(80);

Die Funktion hierzu würde beispielhaft so ausschauen:

String eepromAuslesen(byte adresse) {
String MeineAusgabe;
x Bytes - Byte für Byte aus EEPROM ab Adresse in MeineAsugabe einlesen;
return MeineAusgabe;
}

Wird bei diesem Beispiel trotzdem 3x ein String der Größe x belegt oder nur 1x?

Der Sketch zum Anzeigen des freien Speicherplatzes des SRAM funktioniert bei mir leider nicht vernünftig und die Ausgabe mit Serial.println(F("Text")) funktioniert auch nicht mit Variablen, dass ich ein Ergebnis gleich beim kompilieren sehen würde.

Vielen Dank
itsy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
07.05.2014, 20:51
Beitrag #2
RE: Wie Funktioniert die Speicherverwaltung von Funktionen (nach dem Kompilieren)?
Hollo itsy,

mal ein paar Worte worauf ich immer so achte um den Code klein zu halten:
- alle Funktionen die in einer .ino-Datei stehen kannst du mit "static void Function" deklarieren. Wobei anstatt "void" natürlich auch die Rückgabeinfo stehen kann. Dadurch sparst du etwa 200-300 Byte an Code, da der Compiler das ganze Popin/Popout einer Funktion nicht generiert.
- Variablen die ausschließlich in einer Funktion deklariert werden auch nur dort definieren. Ansonsten erzeugt der Compiler Anweisungen/Tabellen die die Zuweisung "Welche Variable wird in welcher Funktion benutzt" enthalten.
- int Variablen die nie außerhalb 0-255 liegen lieber als uint8_t deklarieren
- Variablen die nie negativ werden als unsigned... definieren

Was den F() - Makro angeht lohnt es sich hier zu lesen (englisch): http://www.baldengineer.com/blog/2013/11...o-f-macro/ . Lohnt sich aber erst wenn die Strings selbst ingesamt größer 28 Byte sind, da der F() - Makro selbst widerum 28 Byte an Code verbraucht.
Zitat:Wird bei diesem Beispiel trotzdem 3x ein String der Größe x belegt oder nur 1x?
Das hängt davon ab wie die Funktion eepromAuslesen() aufgebaut ist.
Wie man es verhindern kann, die ausgelesenen Bytes extra auf verschiedene Variablen im SRAM zu legen und diese dann erst anzuzeigen, kann man gut hier sehen: http://fluuux.de/2013/04/daten-im-eeprom...-zuweisen/ .Dort wird immer der gleiche Buffer benutzt.

Hoffe das hilft irgendwie ein bischen weiter Huh

Grüße Ricardo

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
08.05.2014, 20:28
Beitrag #3
RE: Wie Funktioniert die Speicherverwaltung von Funktionen (nach dem Kompilieren)?
Hallo Ricardo,

hab vielen Dank :-)

Meine Funktionen habe ich jetzt mit static versehen, konnte aber an der Größe nach dem kompilieren keine Änderung sehen - oder bezieht sich das auf RAM?

Der erste Link war wirklich sehr interessant - habe gleich mal einige const gesetzt ;-)

Den 2. Link kannte ich bereits. Hier wollte er aber kein Speicherplatz sparen, da es eigentlich den gleichen Platz im RAM benötigt, ob er nun die Variable über EEPROM oder direkt zuweist ...

Viele Grüße
itsy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Werden ungenutzte Funktionen weg optimiert? BennIY 1 191 03.10.2017 09:06
Letzter Beitrag: Tommy56
Lightbulb mehrere Funktionen mit Schalter mechastef 7 715 21.08.2017 22:34
Letzter Beitrag: SkobyMobil
  Arduino funktioniert immer erst nach reset Maxi290997 11 900 25.07.2017 09:38
Letzter Beitrag: Maxi290997
  LEDs und Sound synchron nach kurzem Tastendruck Thor Wallhall 32 1.596 24.06.2017 21:01
Letzter Beitrag: georg01
Sad Sketch funktioniert auf dem Mega 2560 nicht Frank1234 16 1.119 26.03.2017 14:15
Letzter Beitrag: oOSpikeOo
  Neustart nach SD-Kartentausch erforderlich? Retian 10 685 27.02.2017 20:41
Letzter Beitrag: Retian
  Code aus 1.6.9 geht mit 1.8.1 nicht mehr zu kompilieren DL1AKP 7 730 02.02.2017 12:16
Letzter Beitrag: Tommy56
  [Gelöst] SD Card (Ethernet Shield) IO funktioniert nicht __jb__ 7 851 05.01.2017 09:51
Letzter Beitrag: rpt007
Wink Funktioniert, funktioniert nicht. clandestino 7 753 04.01.2017 22:54
Letzter Beitrag: renid55
  Fehlermedungen beim Kompilieren Franz54 7 1.330 07.12.2016 14:29
Letzter Beitrag: Pit

Gehe zu:


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