Forum: Compiler & IDEs Programmspeicher beim Tiny26 voll


von Ingo L. (grobian)


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)

von ... .. (docean) Benutzerseite


Lesenswert?

rofl

 sinus auf einem tiny...

+ float Rechnung (dein PI)...

von Walter T. (nicolas)


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.

von Ingo L. (grobian)


Lesenswert?

mit der Tabelle hatte ich ja schon gemacht..ging ja auch ganz gut. 
Wollte aber von der Tabelle weg.
Also ist es die math.h die mir den Flash vollstopft, sehe ich das 
richtig ?

von Timmo H. (masterfx)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.

von Peter D. (peda)


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

von Ingo L. (grobian)


Lesenswert?

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

kannst Du mir das genauer erklären?

von (prx) A. K. (prx)


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.

von Ingo L. (grobian)


Lesenswert?

habe jetzt die libm.a im AVR hinzugefügt und jetzt funktioniert alles 
:-) FREU

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.