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
"wenig Arbeitsspeicher"
26.11.2020, 21:59
Beitrag #1
"wenig Arbeitsspeicher"
Hallo,
ich bekomme beim Compilieren die Meldung "Wenig Arbeitsspeicher verfügbar, es können Stabilitätsproblemme auftreten".

Das bezieht sich doch auf den Arduino, nicht den PC!?
Was heißt "Stabilitätsprobleme"? Kann ein Prg. OHNE Fehlermeldung abstürzen?
Wie kann ich das Problem - ohne neue Hardware - entschärfen?
Ist die Länge der Bezeichner von Bedeutung?
Variablen möglichst lokal deklarieren?
Parameterübergabe bietet doch gegenüber globalen Variablen hier wohl keine Vorteile?
Danke!
Gruss, wonk
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.11.2020, 22:19 (Dieser Beitrag wurde zuletzt bearbeitet: 26.11.2020 22:22 von MicroBahner.)
Beitrag #2
RE: "wenig Arbeitsspeicher"
(26.11.2020 21:59)wonk schrieb:  Das bezieht sich doch auf den Arduino, nicht den PC!?
klar. Wobei der angezeigte verbrauchte Speicher nur die globalen Variablen umfasst. Während des Programmablaufes wird aber noch weiterer Ramspeicher benötigt.

(26.11.2020 21:59)wonk schrieb:  Was heißt "Stabilitätsprobleme"? Kann ein Prg. OHNE Fehlermeldung abstürzen?
natürlich! Ein Programm kann viele Fehler enthalten, die keine Fehlermeldung erzeugen. Wenn der Speicher kanpp wird, können Speicherbereiche überschrieben werden.

(26.11.2020 21:59)wonk schrieb:  Wie kann ich das Problem - ohne neue Hardware - entschärfen?
Kann man so allgemein nicht sagen - hängt vom Programm ab und wie großzügig Du mit dem Speicher umgegangen bist.
Edit: Ein Kandidat sind da z.B. Stringkonstante - die sollte man soweit möglich ins Flash verbannen.

(26.11.2020 21:59)wonk schrieb:  Ist die Länge der Bezeichner von Bedeutung?
nein

(26.11.2020 21:59)wonk schrieb:  Variablen möglichst lokal deklarieren?
Lokale Variable benötigen nur Platz im Ram während die Funktion ausgeführt wird ( es sei denn, Du hast sie 'static' deklariert )

(26.11.2020 21:59)wonk schrieb:  Parameterübergabe bietet doch gegenüber globalen Variablen hier wohl keine Vorteile?
Bezogen auf den Speicherverbrauch sind die Parameter wie lokale Variable zu sehen.

Gruß, Franz-Peter
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.11.2020, 22:21
Beitrag #3
RE: "wenig Arbeitsspeicher"
Ohne den Sketch zu sehen ist alles nur Kaffeesatzlesen.

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
26.11.2020, 22:44
Beitrag #4
RE: "wenig Arbeitsspeicher"
(26.11.2020 22:21)Tommy56 schrieb:  Ohne den Sketch zu sehen ist alles nur Kaffeesatzlesen.

Gruß Tommy

...und dann kommt es noch darauf an welche CPU verwendet wird.
lgbk


An alle Neuankömmlinge hier, wenn ihr Code(Sketch) hier posten wollt dann liest euch bitte diese Anleitung durch.

Ich spreche fließend Schwäbisch, Deutsch das Notwendigste und für die Begriffsstutzigen erprobtes Tacheles mit direkten Hinweisen ohne Schnörkel...

1+1 = 10 Angel ...und ich bin hier nicht der Suchmaschinen-Ersatz Dodgy...nur mal so als genereller Tipp..
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
26.11.2020, 22:51
Beitrag #5
RE: "wenig Arbeitsspeicher"
(26.11.2020 22:44)Bitklopfer schrieb:  ...und dann kommt es noch darauf an welche CPU verwendet wird.

Ja, auch das

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
27.11.2020, 11:35 (Dieser Beitrag wurde zuletzt bearbeitet: 27.11.2020 17:14 von wonk.)
Beitrag #6
RE: "wenig Arbeitsspeicher"
(26.11.2020 22:19)MicroBahner schrieb:  Edit: Ein Kandidat sind da z.B. Stringkonstante - die sollte man soweit möglich ins Flash verbannen.
Hallo,
was heißt das? Wenn ich das richtig verstehe hat ein Arduino uno (meiner) wie ein PC RAM und "HD", hier also 2KB SRAM und 32KB Flash. Beim Übersetzen wird das Programm im Flash abeglegt, die globalen Variablen im SRAM, die lokalen Variablen werden zur Laufzeit im SRAM angelegt. Richtig?
Wie bekomme ich dann z.B. Stringkonstanten in den flash?

Ich wollte es ja keinem Antuen, aber wer möchte, hier das Prog.:
Code:
#include <SPI.h>
#include <SD.h>      
const int chipSelect = 10;              //Chip Pin für die SD Karte bei UNO ohne Ethernet
File dataFile;
#include <Wire.h>
#include <RTClib.h>  
RTC_DS1307 RTC;                         //Instanziiert Variablenobjekt vom Typ RTC_DS1307
#include <OneWire.h>
#include <DallasTemperature.h>
#define ONE_WIRE_BUS 9                  //Pin9 OneWire-Bus
OneWire oneWire(ONE_WIRE_BUS);          //Instanziiert Variablenobjekt vom Typ OneWire
DallasTemperature sensors(&oneWire);
const int AnzahlSensoren = 5;           // Reihenfolge entspricht nicht Steckreihenfolge Stecker
struct Korrekturtyp {                  
          String Kennung;               //letzte beiden HEX-Buchstaben Adresse in Kleinschrift!!!
          float Summand;                //Temperatur Korrektursummand für jeweiligen Sensor
          String Name;
          };
Korrekturtyp Korrektur[5]= {{"60",-0.28,"RL RH"},{"57",0.46,"VL FH"},{"a0",-0.85,"VL RH"},{"26",0.38,"RL FH"},{"1f",0.43,"AT"}};
// Achtung!!  Die Reihenfolge der Elemente im array darf nicht verändert werden!
// Sie muss der Reihenfolge der gefundenen Devices entsprechen
const boolean korrigieren = true;       //gibt an, ob die Korrekturen durchgeführt werden sollen  
int numberOfDevices;                    // Number of temperature devices found
DeviceAddress tempDeviceAddress;        // We'll use this variable to store a found device address
const int StopPin = 2;                  // Anschluss Prg. +Pol Stop-Taste
const int LED = 3;                      // zeigt Schreibaktivitäten und Error an, +Pol
const int zeitspanne = 2;              // Messen alle x Minuten, mögliche Werte 1,2,3,4,5,6,10,12,15,30
                    

void setup() {
  pinMode(StopPin, INPUT_PULLUP);
  pinMode(LED, OUTPUT);
  digitalWrite(LED, LOW);
  Serial.begin(9600);
  // für RTC
  Wire.begin();
  RTC.begin();
  if (! RTC.isrunning()) {
    error("RTC läuft nicht!");
    }
    else {
    Serial.println("RTC ok!");
    };
  RTC.adjust(DateTime(__DATE__, __TIME__)); //sets RTC to the date, time of compiling, date, time from PC
  DateTime now = RTC.now();
  String Dateiname = String(now.day()) + "-";
  Dateiname = Dateiname + String(now.month()) + "-";
  Dateiname = Dateiname + String(now.year()) + ".csv";
  Serial.print(Dateiname);
  
  //für Temperatursensoren
  sensors.begin();
  numberOfDevices = sensors.getDeviceCount();
  if (AnzahlSensoren != numberOfDevices) {
     Serial.print ("Anzahl Sensoren: ");
     Serial.println(numberOfDevices, DEC);
     error ("falsche Sensoranzahl!");
     };
  for(int i=0;i<numberOfDevices; i++) {
    if(sensors.getAddress(tempDeviceAddress, i)) {
      Serial.print("Sensor ");
      Serial.print(i, DEC);
      Serial.print(" gefunden mit Kennung ");
      Serial.println(tempDeviceAddress[7], HEX);
      } else {
      Serial.print("Found ghost device at ");
      Serial.print(i, DEC);
      Serial.print(" but could not detect address. Check power and cabling");
      }
    };
  
  // für SD-Karte
  pinMode(chipSelect, OUTPUT);
  if (SD.begin(chipSelect)) { // Durch den Rückgriff auf den Programmblock "startSDCard" wird die SD-Karte geprüft.
    Serial.println("SD-Karte ok!");
    }
    else {
    error ("Problem mit SD-Karte!");
    };
  Serial.println("Ende Setup");
  if (SD.exists(Dateiname)){
    SD.remove(Dateiname);
    };
  dataFile = SD.open(Dateiname, FILE_WRITE); //*.csv-Datei anlegen 8.3 Dateinamen
                // Falls vorhanden: wird angehängt
  dataFile.print ("Datum");
  dataFile.print(";");
  dataFile.print ("Uhrzeit");
  dataFile.print(";");
  for (int i=0; i < AnzahlSensoren; i++){
      String text = "Temperatur " + Korrektur[i].Name;
      dataFile.print (text);
      dataFile.print(";");
      };
  dataFile.print("\n");
  dataFile.close();  
};

void error (String text) {
  Serial.println(text);
  Serial.println("Endlosschleife!");
  digitalWrite(LED,HIGH);
  while (true);  
};

float Messwert(int deviceNr) {    //Mittelwert aus 10 x Messen
  float temp;
  if(sensors.getAddress(tempDeviceAddress, deviceNr)){    //deviceNr aus Array-Reihenfolge, tempDeviceAddress zugehörige Adresse
      temp = sensors.getTempC(tempDeviceAddress);         // getTempC
      Serial.print(temp);
      Serial.print("   ");
      if (korrigieren){
         for (int k = 0; k < AnzahlSensoren; k++){
            if (Korrektur[k].Kennung == String(tempDeviceAddress[7], HEX)) {
               Serial.print(Korrektur[k].Kennung);
               Serial.print ("   ");
               temp = temp +  Korrektur[k].Summand;
               };
           };
      };    
  };
  Serial.println(temp);  
  return temp;
};

void Durchlauf () {
DateTime now = RTC.now();
int rest = now.minute()% zeitspanne;
if (rest == 0){
  digitalWrite(LED,HIGH);  
  dataFile = SD.open("TEMPERA.CSV", FILE_WRITE); //*.csv-Datei Öffnen oder anlegen 8.3 Dateinamen
  dataFile.print(now.day(), DEC);
  dataFile.print(".");
  dataFile.print(now.month(), DEC);
  dataFile.print(".");
  dataFile.print(now.year(), DEC);
  dataFile.print(";");
  dataFile.print(now.hour(), DEC);
  dataFile.print(":");
  dataFile.print(now.minute(), DEC);
  //dataFile.print(":");
  //dataFile.print(now.second(), DEC);
  dataFile.print(";");
  sensors.requestTemperatures(); // Send the command to get temperatures
  for(int i=0;i<numberOfDevices; i++) {  // Search the wire for address
      dataFile.print(Messwert(i),2);
      dataFile.print(";");
      };  
  dataFile.print("\n");
  dataFile.close(); // Die Datei wird vorrübergehend geschlossen.
  Serial.println ("");
  //Serial.println(now.hour(), DEC);
  delay(500);
  digitalWrite(LED,LOW);
  };  
};


void loop() {
  Durchlauf();
   for(int i=0;i<120; i++) {  // 1 Minute delay mit Abfrage Stop-Taster
      if (digitalRead(StopPin)) {
          error ("Programmende!");  
          };
      delay (500);    
      };
}
Gruss, wonk
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
27.11.2020, 11:52 (Dieser Beitrag wurde zuletzt bearbeitet: 27.11.2020 11:57 von Tommy56.)
Beitrag #7
RE: "wenig Arbeitsspeicher"
Speicher sparen:

1. Das F-Macro lagert Zeichenkettenkonstanten ins Flash aus. Sinnvoll ab 2 Nutzzeichen
Code:
Serial.println(F("Ende Setup"));

2. Einzelzeichen als Zeichen ausgeben
Code:
// 2 Bytes
dataFile.print(";");
// 1 Byte
dataFile.print(';');

3. Auf die Klasse String komplett verzichten, statt dessen mit char-Arrays arbeiten.

Infos zur Arbeit mit Zeichenketten gibt es hier.

Gruß Tommy

Edit: Die SD baucht allein schon 512 Bytes für den Sektorpuffer. Suche auch mal nach sprintf/snprintf

"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
27.11.2020, 18:00 (Dieser Beitrag wurde zuletzt bearbeitet: 27.11.2020 19:00 von wonk.)
Beitrag #8
RE: "wenig Arbeitsspeicher"
(27.11.2020 11:52)Tommy56 schrieb:  2. Einzelzeichen als Zeichen ausgeben
Code:
// 2 Bytes
dataFile.print(";");
// 1 Byte
dataFile.print(';');
Allein damit konnte ich 180 Byte gewinnen. Aber wieso?

1.Edit: Leider verloren. Auf meinem PC lief das so. Ich habe es dann auf mein altes Tablett (mit Arduino-IDE) kopiert, um es damit zu meinem jetzt fest verbauten Arduino zu "tragen" und dort zu flashen. Auf dem Tablett werden die Strings ' nicht akzeptiert. Fehlermeldung: "warning: character constant too long for its type"
Was soll deas denn? (Gleicher Version Arduino-IDE und Libs).

(27.11.2020 11:52)Tommy56 schrieb:  Infos zur Arbeit mit Zeichenketten gibt es hier.
Danke! Vor allem wegen der Erläuterungen! Smile

(27.11.2020 11:52)Tommy56 schrieb:  Edit: Die SD baucht allein schon 512 Bytes für den Sektorpuffer.
Das macht natürlich eine ganze Menge aus (hier 25% des SRAM) , und kleiner machen geht wohl nicht.
Gruss, wonk
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Attiny85 zu wenig Speicher Harry 36 8.164 20.01.2019 16:15
Letzter Beitrag: Harry
Sad zu wenig Speicher im Nano (Schulprojekt) Dock.Blanko 5 2.755 10.02.2018 12:00
Letzter Beitrag: rkuehle
  Button kurz drücken Variable wenig erhöhen, lange drücken mehr erhöhen facebraker 18 11.820 28.02.2015 15:37
Letzter Beitrag: HaWe

Gehe zu:


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