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
RAM-Grenze erreicht ???
28.12.2014, 13:04
Beitrag #1
RAM-Grenze erreicht ???
Hallo,

ich habe einen Programmteil in dem ich viele (lokal definierte) String-Array's verwende.
Wenn ich in diesem Programmteil eine Teilmenge der Array's temporär ausblende (also /* ... */) dann bekomme ich den Inhalt der Variablen korrekt zurück. Sobald ich alle Programmteile aktiv schalte ist der Inhalt von vielen Variablen 'null' - also leer.
An der Programmierung an sich kann es nicht liegen, jeder Programmteil separat funktioniert - nur eben wenn alle / viele kompiliert werden passiert dieses Verhalten.

Mein Verdacht ist, dass der RAM-Speicher des Arduino nicht ausreicht um alle Inhalte dieser Variablen zu speichern.

- Weiss jemand, wie man den "Füllgrad" des Speichers messen / anzeigen kann?
- Hatte schon mal jemand ein solches Verhalten - ist mein Verdacht mit dem RAM überhaupt zutreffend?
- Hat jemand eine Lösung (ausser den Code auf noch mehr Programmteile zu verteilen) ?

Danke schon mal für eure Hilfe
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2014, 13:38
Beitrag #2
RE: RAM-Grenze erreicht ???
Hallo,

Code:
int freeRam ()
{
extern int __heap_start, *__brkval;
int v;
return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
bau den Teil mal in deinen Code ein.
Der Aufruf erfolgt dann z.B. mit Serial.print(freeRam());
Je nachdem an welcher Stelle im Programm der Aufruf erfolgt bekommt man auch unterschiedliche Ergebnisse.

Viele Grüße
Arne


(28.12.2014 13:04)Foto-Ralf schrieb:  Hallo,

ich habe einen Programmteil in dem ich viele (lokal definierte) String-Array's verwende.
Wenn ich in diesem Programmteil eine Teilmenge der Array's temporär ausblende (also /* ... */) dann bekomme ich den Inhalt der Variablen korrekt zurück. Sobald ich alle Programmteile aktiv schalte ist der Inhalt von vielen Variablen 'null' - also leer.
An der Programmierung an sich kann es nicht liegen, jeder Programmteil separat funktioniert - nur eben wenn alle / viele kompiliert werden passiert dieses Verhalten.

Mein Verdacht ist, dass der RAM-Speicher des Arduino nicht ausreicht um alle Inhalte dieser Variablen zu speichern.

- Weiss jemand, wie man den "Füllgrad" des Speichers messen / anzeigen kann?
- Hatte schon mal jemand ein solches Verhalten - ist mein Verdacht mit dem RAM überhaupt zutreffend?
- Hat jemand eine Lösung (ausser den Code auf noch mehr Programmteile zu verteilen) ?

Danke schon mal für eure Hilfe

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2014, 13:43
Beitrag #3
RE: RAM-Grenze erreicht ???
@Foto-Ralph:
ohne Code bleibt uns ansonsten nur die Kristall-Kugel ...
hab gerade mal nachgeguckt:
ich sehe da drohende Düsternis und Ungemach !

Confused
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2014, 13:51 (Dieser Beitrag wurde zuletzt bearbeitet: 28.12.2014 13:53 von rkuehle.)
Beitrag #4
RE: RAM-Grenze erreicht ???
Hallo Ralf,

mit folgendem Code kannst du dir den verfügbaren Variablenspeicher anzeigen lassen:
Code:
int freeRam () {
   extern int __heap_start, *__brkval;
   int v;
   return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval);
}
// Aufruf zB: Serial.println(freeRam())
Alles kleiner 400 ist gewöhnlich kritisch.
Tipps:
- Bei Print-Ausgabe von festen Werten das F-Makro benutzen
Was geht:
Code:
Serial.print(F("bla bla"));
Was geht nicht:
Code:
text="bla bla";
Serial.print(F(text));
- konstante Werte wirklich als const deklarieren oder eben per #define
- Werte <=255 als uint8_t definieren
- Funktionen als static definieren insofern sie in einer Sketch-Datei stehen.

Hope it helps!
Grüße Ricardo
PS: Upps, leichte zeitliche Überlappung mit Arne Smile

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2014, 17:11 (Dieser Beitrag wurde zuletzt bearbeitet: 28.12.2014 17:12 von Foto-Ralf.)
Beitrag #5
RE: RAM-Grenze erreicht ???
Hallo,

vielen Dank für eure Antworten.
Es hat sich meine Vermutung bestätigt: der kleinste Wert den ich gesehen hatte war 117 - da hatte die Variablen noch Werte. Bissel später hatten die Variablen keine Werte mehr, da konnte ich jetzt aber auf die Schnelle auch keine Werte mehr sehen - wobei dann vermutlich auch die Variable "freeRam" keinen plausiblen Inhalt mehr gehabt hätte.

Dann muss ich mir jetzt wohl was einfallen lassen, wie ich das Programm umbaue...

Unten habe ich mal ein Stück Code eingefügt.
Habe ich das richtig verstanden, dass jedes String-Array innerhalb derselben Funktion (also wenn ich noch if (variant == 2), ... mit demselben Aufbau habe) im Ram Speicherplatz verbraucht? Wenn ich dann den Code innerhalb von if (variant == 1) in eine extra Funktion auslagern würde wäre das Problem erledigt?

Danke nochmals.

Gruss Ralf



Code:
if (variant == 1) {
                    if (serial_message_level >= 2) {
                            serial_message (50, "LED-Ausgaenge testen", 2);
                        }
                    if (serial_message_level >= 3) {
                            serial_message (0, "LED-Ausgang waehlen und mit Select ansteuern", 2);
                        }
                                    //   1234567890123456                            // 16 Stellen des LCD
                    String text1[]={    "verlassen       ",                     // Variante 0
                                            "LED gruen       ",                          // Variante 1
                                            "LED gelb        ",                          // Variante 2
                                            "LED rot         "};                         // Variante 3
                                                //   1234567890123456                    // 16 Stellen des LCD
                    int fkt99_1 = lcdRequest_x_String("LED Ausgang     ", text1, 4, 0);    // Frage, s. o., Anzahl, Def-Parameter
                    lcd.clear();
                    if (fkt99_1 == 0) {
                        return;
                    }
                    
                    if (fkt99_1 == 1) {
                        output = led_abgeschlossen_gruen;
                        lcd.print("LED gruen       ");
                    }
...
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2014, 17:40 (Dieser Beitrag wurde zuletzt bearbeitet: 28.12.2014 18:11 von ardu_arne.)
Beitrag #6
RE: RAM-Grenze erreicht ???
Hallo Ralf,

wie Ricardo schon schrieb gibt es normalerweise die Möglichkeit statt:
Code:
Serial.print("LED-Ausgang waehlen und mit Select ansteuern")
das F-Makro zu verwenden.
Das sieht dann so aus:
Code:
Serial.print(F("LED-Ausgang waehlen und mit Select ansteuern"))
Dadurch wird der Text nicht im RAM-Speicher sondern im Programmspeicher abgelegt.

Probiere mal aus ob das mit deiner "serial_message" Funktion funktioniert.
Ändere mal einige längere Texte derart und beobachte was "freeRam" dazu sagt.

Gruß
Arne

ExclamationMit zunehmender Anzahl qualifizierter Informationen bei einer Problemstellung, erhöht sich zwangsläufig die Gefahr auf eine zielführende Antwort.Exclamation
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2014, 17:52
Beitrag #7
RE: RAM-Grenze erreicht ???
Naja, und wie schon gesagt, konstante Werte auch als solche deklarieren (dazu können auch String Arrays gehören). Dies, da bei mehrfachen Bezug auf diese Werte trotzdem nur eine Kopie der Werte im Speicher gehalten wird (im Gegensatz zu #define-Statements)
RK

Nüchtern betrachtet...ist besoffen besser Big Grin
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
28.12.2014, 19:08
Beitrag #8
RE: RAM-Grenze erreicht ???
Jetzt habe ich ein ganz komisches Verhalten:

Wenn ich in der Setup-Routine nach der Initialisierung der seriellen Schnittstelle die Abfrage nach freeRam laufen lasse und Anzeige bekomme ich da schon 'nur' 549 - vorher waren's da noch 1037.

Kann es sein, dass der Arduino sich da was über den Reset hinaus abspeichert?

Eigentlich müssten doch am Beginn der Setup-Routine annähernd 4096 zur Verfügung stehen, oder?
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Gehe zu:


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