Programmspeicher beim Tiny26 voll

#1134508
Lesenswert?

Wie kann es denn kommen, dass bei diesem Programmchen der Speicher 
restlos voll ist und die unten genannte Fehlermeldung ausgibt?


#include <avr/io.h>
#include <math.h>
#define PI 3.1415926
#define SINUS(b) ((sin(2*PI*b/360)))
int a;


 int main(void)
  {
   DDRB  = 0xff;

    for (a=0;a<=360;a++)
        {
            PORTB = SINUS(a)*127+128;
        }

    return 0;
  }

Device: attiny26
Program:    4932 bytes (240.8% Full)
(.text + .data + .bootloader)
Data:        266 bytes (207.8% Full)
(.data + .bss + .noinit)
#1134522
Lesenswert?

Hallo,

es gibt Libraries, die es allein schon schaffen, den Flash 
vollzukriegen.
1
stdio.h
 ist z.B. so ein Kandidat. Versuch das Ganze mal mit einer Sinustabelle, 
die 360 Werte (komische Zahl) nehmen mit Sicherheit weniger Platz ein 
als sämtliche mathematischen Funktionen zusammen.
#1134551
Lesenswert?

>Also ist es die math.h die mir den Flash vollstopft, sehe ich das
>richtig ?
Die math.h selbst nicht, aber das was der linker dazulinkt. Du kannst im 
Listfile auch sehen welche Funktionen das sind. Aber das mit 
Floatingpoint kannst du auf nem tiny vergessen. Da muss man schon selber 
etwas tricksen. Ist doch auch viel schöner wenn man vor einem Problem 
steht, das gelöst werden muss.
Moderator Persönliche Seite #1134562
Lesenswert?

Nicolas S. wrote:

> es gibt Libraries, die es allein schon schaffen, den Flash
> vollzukriegen.
1
stdio.h
 ist z.B. so ein Kandidat.

Das ist, mit Verlaub, Quatsch.

Erstens ist stdio.h keine Library, sondern ein Headerfile (welches
das Interface zu Teilen der Standard C Library beschreibt).  Von
einem Headerfile allein entsteht (in aller Regel) kein einziges Byte
an Code.

Zweitens entsteht durch das Linken eine Library selbst auch kein
zusätzlicher Code.  Den muss man erst aus dieser anfordern.  Ganz
nebenbei, die printf- & Co.-Routinen passen entgegen deiner
Behauptung (bis auf die Gleitkommaoption natürlich) in der Tat
sogar noch in einen ATtiny26 hinein.  Nicht, dass ich es in irgend-
einer Weise für sinnvoll hielte, aber so riesig sind sie halt auch
nicht.
#1134571
Lesenswert?

Ingo Laabs wrote:
> Device: attiny26
> Program:    4932 bytes (240.8% Full)
> (.text + .data + .bootloader)
> Data:        266 bytes (207.8% Full)
> (.data + .bss + .noinit)

Die 266 Bytes SRAM sagen, daß Du den Linkerschalter -lm nicht benutzt 
hast.
-lm ist ne deutlich schlankere Float-Lib.

Standardmäßig wird leider eine nicht für den AVR optimierte Lib 
eingebunden.
Deshalb auch der extreme SRAM-Bedarf.


Peter
#1134578
Lesenswert?

Es gibt eine generische nicht optimierte Lib in der libgcc. Und eine 
optimierte in der libm. Markenzeichen der libgcc Version ist eine 256 
Byte grosse Tabelle im SRAM.

Die libm kriegst du mit -lm in der Library-Liste vom Studio (nicht in 
den Linker-Optionen), bzw hinten dran im Aufruf beim Linken.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren