Hallo,
Ich arbeite derzeit mit C auf AVR. Dafür nutze ich AVRStudio 4.18 und
einen Attiny2313.
Problem: übergebe ich eine float Variable an eine Funktion und
verarbeite diese, springt das Programm auf ca. 130% Speicherauslastung.
Erzeuge ich in der Funktion jedoch eine separate float Var. (mit
gleichem Wert) funktioniert alles.
Code:
Im einen Fall muß der Compiler die Laufzeitbibliothek für
Float-Berechnungen hinzunehmen, was wohl den Flash des 2313 sprengt, im
anderen Fall findet die Float-Berechnung zur Compilezeit statt, deshalb
reicht der Speicher.
Aber beschreibe doch erstmal das Problem, das Du eigentlich lösen
willst, denn es gibt fast immer auch eine Lösung, die ohne Float
auskommt.
R. Max schrieb:> Im einen Fall muß der Compiler die Laufzeitbibliothek für> Float-Berechnungen hinzunehmen
Vorausgesetzt, man vergisst nicht die richtige (libm.a) im AVRStudio
explizit mit anzugeben. Ansonsten wird die noch viel größere und
langsamere generische Bibliothek vom gcc verwendet.
R. Max schrieb:> im> anderen Fall findet die Float-Berechnung zur Compilezeit statt
Aber nur, wenn der Compiler auch optimieren darf. Bei -O0 nicht.
@mini bot:
Wozu eine selbstgeschrieben 'ftoa' Funktion???
Dafür gibts doch in der avr-libc schon dtostrf/dtostrfe.
Deine ftoa ist doch eigentlich ein verkapptes itoa.
Warum verwendest du dann überhaupt float?
float heißt im blöden Falle schon ca 2kB Code zusätzlich, daher gibts ja
Festkommaarithmetik. :-)
http://www.mikrocontroller.net/articles/Festkommaarithmetik
Was natürlich noch merkwürdiger ist, wenn ich obiges Progamm (die zu
große Variante) mit AVRStudio 4.18 compile, kommt sowas raus:
1
AVR Memory Usage
2
----------------
3
Device: attiny2313
4
5
Program: 826 bytes (40.3% Full)
6
(.text + .data + .bootloader)
7
8
Data: 0 bytes (0.0% Full)
9
(.data + .bss + .noinit)
10
11
12
Build succeeded with 0 Warnings...
Passt also locker in einen Tiny2313. Hab, mangels original benutzten,
als LCD-Routinen die von Peter Fleury benutzt. Selbst wenn ich die
fehlenden Teile in ftoa noch ergänze, komme ich auf 1638 bytes (80.0%
Full).
Ok, mit dtostrf/dtostre statt selbsgeschriebene ftoa wird es dann doch
zu groß.
Floh schrieb:> Deine ftoa ist doch eigentlich ein verkapptes itoa.
Da fehlt aber offensichtlich noch ein Teil, der Parameter 'aftdot' wird
wohl nicht umsonst da sein. Denk Dir die fehlenden 5-10 Zeilen einfach
noch dazu :)
... schrieb:>> im>> anderen Fall findet die Float-Berechnung zur Compilezeit statt>> Aber nur, wenn der Compiler auch optimieren darf. Bei -O0 nicht.
Nicht notwendigerweise. Konstanten werden auch mit -O0 gefaltet.
Hallo,
Den Festkommaartikel hab ich schon durchgelesen, jedoch wolte ich ne
Funktion schreiben die eine Float auf dem LCD ausgibt, da sprintf zu
groß wird und ich nicht ftoa gefunden habe.
Mich wundert nur wie BASCOM das macht, da kann man doch auch die eine
oder andere Floatvar. benutzen ohne den Rahmen zu sprengen.
mfg. Minibot
Guten Morgen!
Scheint zu klappen, ich habe nun die libm.a eingebunden und der Speicher
sieht so aus:
Device: attiny2313
Program: 772 bytes (37.7% Full)
(.text + .data + .bootloader)
Data: 0 bytes (0.0% Full)
(.data + .bss + .noinit)
Binde ich aber libprintf_flt.a auch ein und schreibe "-Wl,-u,vfprintf"
ists wieder zu viel.
Kenne mich leider noch nicht mit diesen Bibliotheken aus, was macht denn
eigentlich die libm.a?
Mfg. Minibot
mini bot schrieb:> Kenne mich leider noch nicht mit diesen Bibliotheken aus, was macht denn> eigentlich die libm.a?
Die stellt speziell für AVRs optimierte Funktionen für
Floatingpointberechnungen zur Verfügung. Das fängt u.a schon bei so
einfachen Sachen wie den Grundrechenarten (+-*/) an, geht über
Typkonvertierungen (wie bei Dir nach uint8_t), bis hin zu den
üblicherweise in math.h zu findenden Funktionen.
Wenn Du wissen willst, welche Funktionen aus welchen Libraries Dein
Programm benutzt, dann laß Dir ein Mapfile erzeugen (AS4:
Project->Configuration Options->General->Generate Map File)