mikrocontroller.net

Forum: Compiler & IDEs SRAM-Verbrauch für float division?


Autor: Eiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Könnte mir bitte jemand den folgenden Effekt erklären?

Sobald ich die Zeile
... = x / 3.40;
 im Program habe, sind laut AVR Studio auf einmal ca. 250 Bytes im SRAM 
mehr belegt.

Vermeide ich dabegen die float division mit
... = x * 100 / 340;
 is der RAM Verbrauch wieder wie vorher.

Gut, die zweitet Varinaten ist, sowieso besser, da ich damit auch Platz 
im flash spare.

Aber warum verbraucht das dazu linken der float Funktionen Speicher im 
SRAM? Ich bin verwirrt... ;)

Gruß
Eiko

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Weil "100" und "340" integers sind und "3.40" ein float ist. Somit ist 
"100"/"300" gar keine float sondern eine integer-division.

Autor: Dieter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, dass is mir schon klar. Deshalb hab ich die Zeile ja auch geändert.

Die Frage war:
> Aber warum verbraucht das dazu linken der float Funktionen Speicher im
SRAM?

Autor: Eiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
huch, 'Dieter' gehört zu nem anderen Forum. verdammte gespeicherte 
Formulareingaben. Die tauchen ständig in Feldern/Seiten auf, wo man sie 
gar nicht eingegeben hat ;)

Autor: Tim (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Compiler wird 100/340 als Konstante setzen...
Bei einer Integer-Division läuft das wohl auf eine Multiplikation mit 0 
heraus :)

Grüße

Autor: Ralf Schwarz (spacedog) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wäre noch interessant zu wissen, was in deiner Zuweisung vor dem '=' für 
ein Datentyp ist. Weist du das, was du geschickt mit '...' getarnt hast. 
Und was hat x für einen Datentyp?

irgendwas = (float) * (int) ist nämlich eine Floatingpointoperation.
(float) = irgendwas * (int) ebenso.

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tim wrote:
> Der Compiler wird 100/340 als Konstante setzen...
> Bei einer Integer-Division läuft das wohl auf eine Multiplikation mit 0
> heraus :)

Nein, wird er nicht, und läuft es nicht.

Autor: Micha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welche Optimierung verwendest Du? Eventuell werden beim Linken 
irgendwelche Konstanten aus der float-lib abgespeichert.

Autor: Andreas K. (a-k)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eiko wrote:

> Aber warum verbraucht das dazu linken der float Funktionen Speicher im
> SRAM? Ich bin verwirrt... ;)

Möglicherweise wird dabei die falsche Version einer Lib-Funktion 
reingezogen. Die generische GCC Version der Floating Point Funktionen 
benutzt eine 256 Byte Tabelle (=> __clz_tab oder so in der Art, zu 
finden im Map File). Nur sollte die nie zum Zuge kommen, weil eigentlich 
die Funktionen der avr-libc verwendet werden sollten.

Das war insbesondere ein fatales Problem der WinAVR Version von Dezember 
2007, wo die avr-libc nicht ganz zur Version des Compilers passte.

Autor: Eiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, das mit der Tabelle wird es sein. Findet sich auch im Map File 
wieder. Aber eigentlich dachte ich, ich hätte ne neuere Version. Muss 
ich morgen mal nach schauen.


Und wann eine Division eine float und wann eine int Operation ist, war 
hier gar nicht das Thema ;)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.