www.mikrocontroller.net

Forum: Compiler & IDEs Was mach ich mit Fließkomma Falsch (Speicher)


Autor: Pier S. (bigpier)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
ich habe ein Problem mit dem Speicher meines Mega 168 ! Also ich habe 6 
Ntc's an meinem MC mit dennen ich eine Temperaturmessung  mache und auf 
dem Display ausgebe , das klapt soweit auch gut bis auf den 
Speicherverbarauch ! Ich komme auf 46% ! Da ich aber noch Menuaufbau und 
eine regelung programieren muß mach ich mir sorgen. Die Platinen hab ich 
leider schon bestückt auf dem Tisch ! Hab das Ganze wohl unterschätzt ! 
Nun ich hoffe das mir jemand sagen kann was ich falsh mache und wie mein 
Code effizienter wird !

Großen Dank im Voraus

Gruß Pier

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

Bewertung
0 lesenswert
nicht lesenswert
Mit .map und .lss Files wird es einfacher zu analysieren.

Allerdings benötigt man für sowas meistens keine Fliesskommaarithmetik, 
weil es Festkommaarithmetik genauso tut.

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
das Grundproblem Deines Speicherverbrauchs ist die float-Bibliothek und 
sprintf beide nehmen Dir sehr viel Speicher.

Schmeiß als erstes die doubles raus, die Berechnungen kannst Du direkt 
mit den ADC Werten machen.

Die Ausgabe des double auf dem LCD ist mit sprintf einfach aber 
speicherintensiv.

Schau mal in diesen Artikel:

http://www.mikrocontroller.net/articles/Festkommaarithmetik

Gruß
Frank

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habs mit Festkomma probiert aber im unteren temperatur Bereich bin 
ich zu ungenau !

/Mit .map und .lss Files wird es einfacher zu analysieren./
was meinst du damit ???

Autor: Rene B. (themason) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
mit map und lss files sieht man was wieviel spiecher belegt ...

aber mal ehrlich : kommst du mit single nicht aus ? double ist 
eigentlich fast immer oversized.
sprintf ist (wie frank schon sagte) auch ein richtiger speicher-fresser. 
wenn du den einsparst/selbstbaust kannst du ne menge speicher sparen.

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Endschuldige bitte aber wo finde ich diese besagten Fils ?

Was würdest du mir empfehlen ,ich meine wie würdest du die umwandlung in 
Grad machen ?? So wie ich das mit Festkomma gelöst habe hatte ich von 
Minus 20 Grad bis 30 Grad nur noch 5 grad schritte da der abstand zu 
klein ist !!!

Vielen Dank fürGruß
Pier

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

Bewertung
0 lesenswert
nicht lesenswert
Pier S. wrote:

> Endschuldige bitte aber wo finde ich diese besagten Fils ?

Project - Configuration Options - Generate Map File & Generate List File

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

Bewertung
0 lesenswert
nicht lesenswert
Pier S. wrote:

> Grad machen ?? So wie ich das mit Festkomma gelöst habe hatte ich von
> Minus 20 Grad bis 30 Grad nur noch 5 grad schritte da der abstand zu
> klein ist !!!

Hast du den Artikel Festkommaarithmetik gelesen und verstanden?

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Pier,

> Ich habs mit Festkomma probiert aber im unteren temperatur Bereich bin
> ich zu ungenau !

Das musst Du mir bitte erklären, ich sehe da erstmal keinen Unterschied.

Mach doch mal eine Beispielrechnung.

Gruß
Frank

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rene Böllhoff wrote:
> aber mal ehrlich : kommst du mit single nicht aus ? double ist
> eigentlich fast immer oversized.
Die meisten Bibliotheksfunktionen arbeiten standardmäßig mit double 
und beim AVR-GCC sind double und float eh dasselbe, weshalb es 
wurscht ist, was man nimmt.

> sprintf ist (wie frank schon sagte) auch ein richtiger speicher-fresser.
> wenn du den einsparst/selbstbaust kannst du ne menge speicher sparen.
Die Funktionen aus der stdlib.h sind spezialisierter und deshalb 
deutlich genügsamer im Ressourcenverbrauch.

Ansonsten schließe ich mich den anderen an: In diesem Fall müsste das 
eigentlich optimal mit Festkommaarithmetik machbar sein. Gerade bei 
Temperaturen hat man eigentlich nie hohe Anforderungen an die Auflösung 
und v.a. keine Zahlenwerte, die um mehrere Zehnerpotenzen auseinander 
liegen (was den Gebrauch von Gleitkommageschichten sinnvoll machen 
kann).

BTW: "to float" heißt auf deutsch "gleiten" und nicht "fließen". 
Dementsprechend sind das Gleit -kommazahlen...

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

Bewertung
0 lesenswert
nicht lesenswert
Johannes M. wrote:

> BTW: "to float" heißt auf deutsch "gleiten" und nicht "fließen".
> Dementsprechend sind das Gleit -kommazahlen...

Und wenn man die dann ins Englische zurück übersetzt, dann werden 
sliding point numbers daraus. Als Alternative könnte ich auch mit 
Schwimmkommazahlen dienen.

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Andreas Kaiser wrote:
> Johannes M. wrote:
>
>> BTW: "to float" heißt auf deutsch "gleiten" und nicht "fließen".
>> Dementsprechend sind das Gleit -kommazahlen...
>
> Und wenn man die dann ins Englische zurück übersetzt, dann werden
> sliding point numbers daraus. Als Alternative könnte ich auch mit
> Schwimmkommazahlen dienen.
Na, wir wollen es mal nicht übertreiben... Fest steht nur: float ist 
nicht gleich flow (wobei letzteres tatsächlich fließen heißt...) Ich 
vermute, dass da die Verwechslung ihren Ursprung hat.

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für Eure Hilfe bzw Ratschläge !!
Also wenn ich mit Festkommaarithmetik auf die gleich weise rechne wie in 
meinem Code dann hab ich 5 Grad Schritte ! Ich glaub ich steh auf der 
Leitung könnte mir jemand eine Beispiel machen wie ich richtig rechne 
????

Wo finde ich die besagte stdlib.h ???

Vielen Dank für Eure Hilfe

Gruß
Pier

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

Bewertung
0 lesenswert
nicht lesenswert
Festkommarechnung heisst nicht, dass du auf ein Komma verzichtest. Du 
legst nur fest, wo es liegt.

Ansatz: Wenn du den ADC-Wert mit 100 multiplizierst, den Kram ganzzahlig 
mit 32bit "long" rechnest, und hinterher als hunderstel Grade verstehst, 
dann hast du wenn es vorher 5-Grad-Schritte waren nun 0,05-Grad-Schritte 
und wohl kein Problem mehr.

Die stdlib.h liegt genau da wo inttypes.h liegt.

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man Man bin ich ein Depp!!
Hab alle variablen mit 100 multiplizert !!! und bei stdlib.h < 
>vergessen also ist verständlich wieso der compiller diese lieb nicht 
fand !!!

Vielen DANK für Eure hilfe


Noch eine lezte frage stdlib.h wird diese Header mit einer anderen 
ersetzt oder zu den anderen dazu eingebunden ???

Autor: Frank Link (franklink)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
dazu eingebunden, der Linker holt aus der Bibliothek das was erbraucht

Gruß
Frank

Autor: Pier S. (bigpier)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für Eure Hilfe jetzt werde ich wohl Festkommaarithmetik verwenden

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.