Forum: Compiler & IDEs zu große Daten


von Mark (Gast)


Lesenswert?

Mit meinem Programm möchte ich AD/Wandeln und anschließend den 
Mittelwert und die Standardabweichung bilden.

Jedoch funktioniert das aus irgendeinem Grund nicht. Beim builden zeigt 
mein AVR Studio 4 keine Fehlermeldung, jedoch schreibt das Programm im 
Build Fenster:
Data:        264 bytes (103.1% Full)

Wie kann das bei so einem kleinem Programm sein? Wo liegt der Fehler.

Ich verwende einen attiny45.

Hier mein bescheidenes Programm:

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <math.h>

int main(void)
{

unsigned ergebnis, ergebnisalt, i;


    ADMUX = 0x96;
    ADCSRA = 0x87;
    ADCSRB = 0x00;
    DIDR0 = 0x3F;

    DDRB = 0x07;

    ergebnis = 0;
    ergebnisalt = 0;


    PORTB |= 0x02;


    int data [10];

    for (i = 0; i < 10; i++)

    {
      ADCSRA |= 0x40;

      while (ADCSRA & 0x40);

      data [i] = ADCW;

    }


    double xm;
    int sum = 0;

    for (i=0; i<10; i++)

    {
      sum += data[i];
    }


    xm =  (double) sum / 10;

    double stabw = 0;
    double qsum = 0;

    for  (i=0; i<10; i++)

    {
      qsum += pow(data [i] - xm,2);
    }


    stabw = sqrt(1.0/9*qsum);

    if (stabw > 3) PORTB |= 0x01;

    ergebnis = xm;
}

Kann mir jemand bei meinem Problem helfen?

von Peter II (Gast)


Lesenswert?

Mark schrieb:
> Kann mir jemand bei meinem Problem helfen?

ja, verzichte auf double dann passt es ohne probleme.

von Stefan E. (sternst)


Lesenswert?

Mark schrieb:
> Data:        264 bytes (103.1% Full)
>
> Wie kann das bei so einem kleinem Programm sein? Wo liegt der Fehler.

libm.a nicht mit gelinkt.

von Peter II (Gast)


Lesenswert?

Mark schrieb:
> stabw = sqrt(1.0/9*qsum);
>     if (stabw > 3) PORTB |= 0x01;

das ist zum beispiel sehr ungünstig für den kleinen µC. Das kann man 
sehr viel einfacher machen, in dem man schon mal die Wurzel entfernt

> stabw = 1.0/9*qsum;
>     if (stabw > 9) PORTB |= 0x01;

das ganze kann man noch weiter treiben in dem man jetzt noch die 
multiplikation wegnimmt.

von Karl H. (kbuchegg)


Lesenswert?

> qsum += pow(data [i] - xm,2);

das ist jetzt aber nicht dein Ernst, oder?
Für ein simples Quadrat die pow() Funktion einzusetzen.

Hast du eine Ahnung davon, was die alles treiben muss um x hoch 0.78 
berechnen zu können? Und denselben Aufwand muss sie auch bei dir 
treiben, selbst wenn dein Exponent 2 ist.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Stefan Ernst schrieb:
> Mark schrieb:
>> Data:        264 bytes (103.1% Full)
>>
>> Wie kann das bei so einem kleinem Programm sein? Wo liegt der Fehler.
>
> libm.a nicht mit gelinkt.

...was dann u.a. zu http://gcc.gnu.org/PR29524 führt.

Mit der AVR-Libc ist selbst auf keinen Tinys float einsetzbar, falls man 
es richtig angeht: 4000 Stellen von Pi mit ATtiny2313.

Wenn man allerdings blindlinks alles ins Programm reinzieht was geht ... 
dann nicht.

von Walter S. (avatar)


Lesenswert?

bei diesem Programm kann man sehr gut auf Wurzel, Power und auch auf 
Gleitkomma verzichten

von Mark (Gast)


Lesenswert?

Danke für die Tipps mit der Wurzel und dem Quadrat, ich bin ein 
absoluter Anfänger und weiß darüber noch wenig. Jedoch löst dies mein 
eigentliches Problem nicht, nämlich warum der Datenspeicher so voll ist.
Ich habe versucht das double wegzulassen doch auch dann funktioniert es 
nicht.

Was soll
"libm.a nicht mit gelinkt."
bedeuten?

von Peter II (Gast)


Lesenswert?

Mark schrieb:
> Ich habe versucht das double wegzulassen doch auch dann funktioniert es
> nicht.

glaube ich nicht, zeigt bitte den code dazu.

von Heinz (Gast)


Lesenswert?

Habe das obige Programm durchlaufen lassen.

Make meldet:

Program: 1508
Data   : 0

Auszug aus dem MAP-File:

Memory Configuration

Name             Origin             Length             Attributes
text             0x00000000         0x00002000         xr
data             0x00800060         0x0000ffa0         rw !x
eeprom           0x00810000         0x00010000         rw !x
fuse             0x00820000         0x00000400         rw !x
lock             0x00830000         0x00000400         rw !x
signature        0x00840000         0x00000400         rw !x
default        0x00000000         0xffffffff

von Mark (Gast)


Lesenswert?

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <math.h>


int main(void)
{

unsigned ergebnis, ergebnisalt, i;


    ADMUX = 0x96;
    ADCSRA = 0x87;
    ADCSRB = 0x00;
    DIDR0 = 0x3F;

    DDRB = 0x07;

    ergebnis = 0;
    ergebnisalt = 0;


    PORTB |= 0x02;


    int data [10];


    for  (i=0; i<10; i++)

    {
      ADCSRA |= 0x40;

      while (ADCSRA & 0x40);

      data [i] = ADCW;
    }


    int xm;
    int sum = 0;



    for  (i=0; i<10; i++)

    {

      sum += data[i];
    }



    xm =  sum / 10;

    int stabw = 0;
    int qsum = 0;

    for  (i=0; i<10; i++)

    {
      qsum += ((data [i] - xm)*(data [i] - xm));
    }


    stabw = (1.0/9*qsum);


    if (stabw > 9) PORTB |= 0x01;



    ergebnis = xm;
}

von Oliver (Gast)


Lesenswert?

Da ist immer noch ein float drin, und du hast libm.a nicht dazu gelinkt.

>Program:    2428 bytes (59.3% Full)
>(.text + .data + .bootloader)

>Data:        264 bytes (103.1% Full)
>(.data + .bss + .noinit)


mit libm.a ergibt das

>Program:     972 bytes (23.7% Full)
>(.text + .data + .bootloader)

>Data:          0 bytes (0.0% Full)
>(.data + .bss + .noinit)

Oliver

von Mark (Gast)


Lesenswert?

wie geht das libm.a dazulinken?

von Εrnst B. (ernst)


Lesenswert?

Mark schrieb:
> wie geht das libm.a dazulinken?

-lm als Linkeroption.

von Oliver (Gast)


Lesenswert?

Im Studio unter Project->Configuration Options, Tab "libs".

oliver

von Peter II (Gast)


Lesenswert?

> stabw = (1.0/9*qsum);
>  if (stabw > 9) PORTB |= 0x01;
diese Rechnung braucht den ganzen platz. Kürze sie weg.

if (qsum > 27) PORTB |= 0x01;

(keine ahnung ob das jetzt stimmt, bitte selber nachrechnen)

von Walter S. (avatar)


Lesenswert?

Mark schrieb:
> stabw = (1.0/9*qsum);

Oliver schrieb:
> Da ist immer noch ein float drin

das muss aber nicht drin sein
stabw = qsum/9 tuts ja auch

oder noch einfacher
   if (qsum > 81) PORTB |= 0x01;

von Mark (Gast)


Lesenswert?

Danke für eure Hilfe. Jetzt funktionierts bei mir auch :)

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.