Forum: Compiler & IDEs Programmspeicherverbrauch bei Funktionsaufruf


von Michael F. (resistor)


Lesenswert?

Hallo,
ich habe einen ATTiny45PU20. Wieso steigt der Programmspeicher um mehr 
als 3600Byte wenn ich die Funktion "sqrt32_floor()"so hier aufrufe:


uint16_t calcRmsVal(uint16_t *adresse) // Berechnet den RMS-Wert
{
  uint8_t i;
  uint16_t effektiv;
  uint32_t sum_quadrat;
  sum_quadrat=0;
  for( i=0; i<ANZ_MESSWERTE; i++ )
    {
      sum_quadrat+=pow(*adresse,2); // Summe der Quadrate
  }
  effektiv=sqrt32_floor(sum_quadrat); // Wurzel
  //effektiv=sqrt32_floor(4294967295);
  return effektiv;
}

Im Gegensatz, wenn ich einfach mal als Parameter anstatt "sum_quadrat"

effektiv=sqrt32_floor(4294967295);

eingebe sind es 3600Byte ProgMem weniger. Woran könnte das liegen?

Danke & Grüße sendet
 Micha

von Timmo H. (masterfx)


Lesenswert?

Ganz einfach. Wenn du einen konstanten Wert übergibst, dann wird die 
Wurzel bereits beim Kompilieren berechnet.
Aus
effektiv=sqrt32_floor(4294967295);
wird dann
effektiv=65535;

Wenn der Wert, der übergeben wird erst zur Laufzeit bekannt ist, dann 
wird die gesamte Lib mit eingebunden.

von Falk B. (falk)


Lesenswert?

@  Michael Förster (resistor)

>ich habe einen ATTiny45PU20. Wieso steigt der Programmspeicher um mehr
>als 3600Byte wenn ich die Funktion "sqrt32_floor()"so hier aufrufe:

Ich tippe mal darauf, dass pow() eine Fließkommafunktion ist. Damit 
ziehst du dir die Floating Point Lib ins Programm.
Versuch mal

      sum_quadrat+=(*adresse) * (*adresse); // Summe der Quadrate

Ach ja, deine Schleife ist recht sinnlos, weil weder der Index verwendet 
noch dein Zeiger erhöht wird ;-)

Allgemein sollte man erstmal prüfen, ob man mit Festkommaarithmetik 
auskommt.

MfG
Falk

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.