Forum: Compiler & IDEs ATtiny2313 & float


von mini b. (minibot)


Lesenswert?

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:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
#include <math.h>
5
#include <stdlib.h>  
6
#include <string.h>  
7
8
#include "includes/lcd-routines.h"
9
10
11
int _ftoa(char*, float , uint8_t);
12
13
int main(void){
14
15
  lcd_init();
16
17
18
  char buff[10];
19
  float nummer = 4.0/3.0;    
20
    
21
  _ftoa(buff, nummer, 0);
22
23
  lcd_setcursor(0,0);
24
  lcd_string(buff);
25
26
  for(;;){}
27
28
  return 0;
29
}
30
31
int _ftoa(char* buff, float num, uint8_t aftdot){
32
    
33
  float nummer = 4.0/3.0;
34
  
35
  uint8_t dezimal;
36
  dezimal = nummer;
37
  itoa(dezimal, buff, 10);
38
39
  return 0;
40
}
-> Gibt 1 aus
1
int _ftoa(char* buff, float num, uint8_t aftdot){
2
    
3
  //float nummer = 4.0/3.0;
4
  
5
  uint8_t dezimal;
6
  dezimal = num;
7
  itoa(dezimal, buff, 10);
8
9
  return 0;
10
}
-> Lastet speicher aus



Mfg Minibot

von jo (Gast)


Lesenswert?

evtl. nen pointer benutzen?

von R. M. (rmax)


Lesenswert?

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.

von ... (Gast)


Lesenswert?

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.

von Floh (Gast)


Lesenswert?

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

von ... (Gast)


Lesenswert?

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ß.

von ... (Gast)


Lesenswert?

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 :)

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

... 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.

von mini b. (minibot)


Lesenswert?

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

von mini b. (minibot)


Lesenswert?

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

von technikus (Gast)


Lesenswert?

Warum überhaupt Float auf einem tiny.
Winzig und groß, wie passt das zusammen ?

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

von mini b. (minibot)


Lesenswert?

Hallo,

Kurze Frage zu den Interrupts.
Wenn ich einen Pin z.B. für INT0 oder ADC nutze, muss ich ihn dann auch 
als Eingang konfigurieren?



Mfg. minibot

von Klaus W. (mfgkw)


Lesenswert?

1. Hat das irgendwas mit diesem Thread zu tun?
Vielleicht wäre ein neuer besser...

2. Hast du im tiny2313 überhaupt einen AD-Wandler?

von ... (Gast)


Lesenswert?

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)

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.