mikrocontroller.net

Forum: Compiler & IDEs AVRGCC code zu gross...


Autor: MArkus Gross (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich entwickele gerade ein Projekt mit einem ATMEGA48.
ICh wuerde gerne floats verwenden nd diese auf das display ausgeben.
Doch reicht fuer diese "einfache" aufgabe der speicher bereits (oder
fast) nichtmehr aus.
Da ich newbe in uC programmierung in C bin, wollte ich fragen wo mein
Fehler liegt, oder ob das normal ist??

Danke,
Markus

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du eine grössere Menge Standard-Funktionenen (printf etc)
verwendest, schleppst du möglicherweise eine Menge unnötigen Ballast
mit dir rum.

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
1.: Compiler-Optimierung eingeschaltet? Wenn nicht, dann ist es normal,
dass der Code sehr groß wird.

2.: Floats lassen sich in vielen Fällen geschickt vermeiden. Wenn der
Speicherplatz wirklich knapp wird, dann versuchen, alle Berechnungen in
Integer durchzuführen. I.d.R. sind floats auch gar nicht sinnvoll. Je
nach Anwendung (Ich weiß ja nicht, wofür Du floats zu brauchen
meinst...) kann man sehr einfach die Berechnungen in int durchführen
(Bsp: Es soll eine Anzeige in Volt ausgegeben werden, mit
Millivolt-Auflösung. In dem Fall nicht in float rechnen, sondern
ganzzahlig direkt in Millivolt (also alle Volt-Werte mit 1000
multiplizieren). Bei der Ausgabe muss dann nur noch das Komma an die
richtige Stelle gesetzt werden, was mit einer "modulo (%) 1000" und
einer "durch (/) 1000"-Operation kein Problem ist).

Autor: johnny.m (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja,
3.: Es gibt hier ein extra GCC-Forum, da sind solche Fragen i.d.R.
besser aufgehoben...

Autor: Markus Gross (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hmm,

Optimierung ist an (-Os) aber ich verwende die fprintf aus der lib ->
ca 40 % belegt.

Ich werde es nun mit ints machen, aber das ist nicht so einfach, da ich
eine genauigkeit von 24 bit benoetige...
also int32_... Dort sind Multiplikationen auch nicht gut, denn dann
bekommt man u.u. 64 bit integer. Wenn ich diese implementiere ist der
speicher auch voll...

Gibt es eine moeglickeit nicht verwendete funtionen (der genannte
ballast) rauszuwerfen ???

Gruss,
Markus

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich werde es nun mit ints machen, aber das ist nicht so einfach, da
ich
>eine genauigkeit von 24 bit benoetige
die wirst du mit einem float sowieso nicht erreichen
1 sign bit, 8 exponent ,23bit mantisse

wenn du fprintf benutzt musst du dich nicht wundern das dein Platz
nicht reicht, so etwas ist eine sehr komplexe Funktion.

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> also int32_... Dort sind Multiplikationen auch nicht gut,

Naja, sie sind jedenfalls viel einfacher, als welche mit
Fließkommazahlen.

> denn dann bekommt man u.u. 64 bit integer.

Nicht in C. Da ist das Ergebnis immer vom selben Typ, wie die
Operanden.

> 1 sign bit, 8 exponent ,23bit mantisse

Ist auch nicht weniger Genauigkeit, als bei einem vorzeichenbehafteten
24-bit-Integer. Ich werde wohl nie verstehen, warum das Vorzeichen hier
so unglücklich abgetrennt wurde.

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe den Eindruck, dass du das Pferd von hinten aufgezäumt
hast.  Du hast bestimmte (nicht gerade 08/15-)Forderungen an
die Genauigkeit und sonstige Funktion, dich aber gleich erstmal
auf einen der kleinsten Prozessoren festgelegt, ohne überhaupt
zu wissen, ob dieser die Aufgabe mit vertretbarem Aufwand
erfüllen kann.

Eigentlich wählt man eher den umgekehrten Weg: der Prototyp wird
auf einem hinreichend großen Prozessor grob zusammengenagelt,
also vielleicht auf einem ATmega128.  Der hat nicht nur JTAG,
was das Debuggen vereinfacht, sondern auch genügend Reserven an
RAM und ROM im Vergleich zu deinem Zielprozessor, dass man nicht
bei der Entwicklung sofort anfangen muss, jedes klitzekleine
Eckchen zu optimieren.

Wenn man dann weiß, was man ungefährt braucht, kann man sich an
den Zielprozessor machen.

In deinem Fall hast du zumindest dahin gehend Glück, dass du ohne
sonstige Änderungen einen ATmega168 nehmen kannst für die
Entwicklung.  Ist (bis auf Kleinigkeiten wie den Bootloader)
pin- und funktionskompatibel mit dem ATmega48, bietet aber die
Freiräume für Resourcen, die man während der Projektentwicklung
einfach mal braucht.

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.