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
  while Schleife nach sleep mode interrupt tklaus 13 245 23.11.2016 17:40
Letzter Beitrag: Tommy56
  Fehler beim Kompilieren binderj1 5 293 03.10.2016 21:27
Letzter Beitrag: hotsystems
  Upload funktioniert nicht Levi 5 240 22.09.2016 20:19
Letzter Beitrag: hotsystems
  If-Bedingung funktioniert nicht bei Serial1.write Datatom 6 222 16.09.2016 20:36
Letzter Beitrag: Datatom
Question Keine Verbindung via USB nach flashen des Programms chaoscrack 5 203 23.08.2016 14:58
Letzter Beitrag: hotsystems
  Taster für mehrere Funktionen matthias3579 5 345 16.08.2016 16:00
Letzter Beitrag: StephanBuerger
  Adafruit SD-master / logger shield: Fehler beim 2. Kompilieren kl-ing 3 333 06.06.2016 16:07
Letzter Beitrag: Bitklopfer
  String nach UTF16 konvertieren (UTF-16) ThoEngel 0 299 20.02.2016 19:22
Letzter Beitrag: ThoEngel
  Fehler beim Kompilieren Rudi 4 893 05.02.2016 19:46
Letzter Beitrag: Rudi
  Fehler in WCharacter.h beim Kompilieren sfl 0 355 04.02.2016 14:52
Letzter Beitrag: sfl

Gehe zu:


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