PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Arduino Speicherverbrauch



danst
18.02.2008, 21:23
Hallo,

programmiere im Moment gerade einen Arduino und komme langsam in Speichernöte. Daher meine Frage: Wieso kostet der folgende Code so viele Bytes? 178 um genau zu sein.
Und ich habe Wire.h (die I2C Library) sowieso schon eingebunden... Ist da irgendeine Optimierung beim Compiler nicht eingeschalten?
Außerdem benutze ich die Funktion noch nicht einmal... müsste gcc das nicht von sich aus weglassen?



byte read_Motor_Amp() {
// erster Motor
Wire.beginTransmission(MOTOR_address);
Wire.send(11); // Batterieregister
Wire.endTransmission();

// Jetzt Daten bekommen
Wire.requestFrom(MOTOR_address, 1);
byte rdata = 0xff;
if (Wire.available()) rdata = Wire.receive();
// Zweiter Motor
Wire.beginTransmission(MOTOR_address);
Wire.send(12); // Batterieregister
Wire.endTransmission();

// Jetzt Daten bekommen
Wire.requestFrom(MOTOR_address, 1);
byte rdata2 = 0xff;
if (Wire.available()) rdata2 = Wire.receive();
if (rdata > rdata2) return rdata;
else return rdata2;
}



Wäre schön, wenn mir jemand helfen könnte!
Viele Grüße,

Daniel

m.a.r.v.i.n
19.02.2008, 09:41
Hallo Daniel,


Außerdem benutze ich die Funktion noch nicht einmal... müsste gcc das nicht von sich aus weglassen?

Dem ist leider nicht. so. Der Compiler bindet alle Funktionen ein, unabhängig davon, ob sie überhaupt verwendet werden. Das läßt sich auch nicht durch einen Optimierungsschalter ändern.

Um das zu umgehen müßte man Libraries benutzen. Dazu müßte man die Funktionen auf mehrere Sourcefiles aufsplitten (ideal wäre 1 Funktion je Sourcefile). Daraus dann eine Object Library erstellen und diese dann zu jedem Projekt dazulinken. Dann werden nur noch Funktionen eingebunden, die auch aufgerufen werden (streng genommen werden alle Funktionen aus einem Sourcefiles mitgelinkt, auch wenn nur eine einzelne davon verwendet wird).

Die Arduino Core Library oder die Math Lib vom avr-gcc sind z.B. Objekt Librarys.

ogni42
19.02.2008, 09:55
Vielleicht spart es ein bisschen, wenn Du die Konstanten auf byte castest. Ansonsten werden die intern m.W. als 16bit Int behandelt.

vollkontakt
24.04.2008, 23:43
Hallo Daniel,

du koenntest den arduino auch ohne bootloader benutzen um etwas mehr platz zu verfuegung zu haben. Siehe http://www.arduino.cc/en/Hacking/Programmer

Lg Till

SprinterSB
25.04.2008, 23:58
Wo der Platz vertrödelt wird, kann man nur nach einem Blick ins erzeugte Assembler genau zuordnen. In Deiner Funktion gibt's immerhin 12 C++-Funktionsaufrufe. Ein Teil des Platzes geht wohl auf Kappe von C++-Overhead.