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
  Funktionen mit der millis() Funktion Zis 3 208 16.05.2018 21:50
Letzter Beitrag: Tommy56
  ATMega 328P Bootloader funktioniert nur 1x Gelegenheitsbastler 4 286 08.04.2018 16:09
Letzter Beitrag: Chopp
  Bootlader Brennen funktioniert nicht Ardusil 6 462 18.03.2018 10:53
Letzter Beitrag: hotsystems
Question Arduino Due nach dem 2. Start Fehlermelddung beim flashen juergen001 2 268 03.03.2018 09:07
Letzter Beitrag: juergen001
  Rotaryencoder funktioniert nicht richtig 123clever 19 931 20.02.2018 22:22
Letzter Beitrag: rpt007
  Schleife nach else beenden Chef_2 24 1.164 08.02.2018 23:28
Letzter Beitrag: Franz54
  Funktionen und deren Rückgabewerte, Verständnisproblem HarryS 6 403 07.02.2018 22:58
Letzter Beitrag: Tommy56
  Uhr funktioniert nicht Jakob 8 818 30.12.2017 00:15
Letzter Beitrag: hotsystems
  Neuling Fehler beim Kompilieren guenni71 6 917 26.11.2017 16:48
Letzter Beitrag: hotsystems
  Fehlermeldung beim Kompilieren Arduino/Genuino Uno Otto 12 1.648 21.11.2017 20:30
Letzter Beitrag: Tommy56

Gehe zu:


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