1000Byte RAM durch #include einer Bibliothek verlieren?

Hi,

Da mir das RAM meines UNOs etwas knapp wurde, habe ich etwas reverse engineered.

Und da ist mir aufgefallen, dass alleine das Einfügen der IRremote-Bibliothek 1000Byte Arbeitsspeicher kostet.

#include <IRremote.h>

Zuerst habe ich alle Aufrufe zu dieser lib im Sketch ausmaskiert. Das brachte keine Änderung am freien Arbeitsspeicher.
Erst durch Löschen des includes wurden 1006Byte frei.

Das versteh ich ganz und gar nicht :~

Meine freien RAM berechne ich so: Das hab ich mal irgendwo im Inet gefunden. Hoffe die Berechnung ist auch verlässlich.

 int freeRam () {
  extern int __heap_start, *__brkval; 
  int v; 
  return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); 
}

Hat dazu jemand eine Idee?

1000 Byte scheint mir etwas viel, aber 200 Byte gehen für einen Puffer drauf der in IRremoteInt.h deklariert ist:

typedef struct {
uint8_t recvpin; // pin for IR data from detector
uint8_t rcvstate; // state machine
uint8_t blinkflag; // TRUE to enable blinking of pin 13 on IR processing
unsigned int timer; // state timer, counts 50uS ticks.
unsigned int rawbuf[RAWBUF]; // raw data
uint8_t rawlen; // counter of entries in rawbuf
}
irparams_t;

extern volatile irparams_t irparams;

Und RAWBUF ist in IRremote.h definiert:

#define RAWBUF 100

Serenifly:
1000 Byte scheint mir etwas viel,

Ja, wundert mich auch etwas. Konnte den Wert aber immer nachvollziehen,
Vllt. ist auch meine RAM-Berechnung fehlerhaft.

Äußerst seltsam ist auch, dass die lib komplett mitgelinkt wird, wenn keine Aufrufe stattfinden - das dürfte der Präprozessor nicht zulassen.

Hi,

hab lange rumgesucht. Bin dann letztlich zu der (weisen) Entscheidung gekommen, die lib nochmal runter zu laden.
Jetzt passt es. Ich seh nur noch das "Verschwinden" von 200 Byte beim Aufruf der lib. Und das ist aus dem Grund, den Serenifly genannt hat: der RawBuffer.

Wieso die 200 Byte trotzdem verbraten werden, obwohl nur ein include der lib, und kein aktives Anprechen eines Unterprogramms erfolgt, kann ich mit meinen sprälichen C-Kenntnissen nicht beantworten.

Das hängt damit zusammen, dass mit den Aufruf der #include bereits alle Bestandteile der Libary genutzt werden. Ob nun genutzt oder nicht, spielt keine Rolle. Es gab bei Mikrokontroller dazu mal einen Beitrag, in dem gezeigt wurde, wie man das verhindert. Dabei ging es darum, die Compiler entsprechende Anweisung zu geben, nur die Funktion zu kompilieren, die genutzt werden. Genaueres kann ich aber auch nicht dazu sagen. Serenfly oder jurs erklären das sicher schöner XD

Liegt das nicht einfach daran dass das struct in IRemote.cpp global als "volatile irparams_t irparams" definiert ist und damit sofort angelegt wird? Das existiert außerhalb aller Klassen und ist damit unabhängig von der Instantiierung von irgendwelchen Objekten.

So 100%ig kenne ich mich aber mit dem Zeug nicht aus.

ich denke, serenifly hat Recht.
Nur statische Variablen, die nicht benutzt / aufgerufen werden, würden in ANSI C vom Präprozessor gelöscht, also nicht angelegt und somit auch keinen Speicher benötigen.