Forum: Compiler & IDEs Compilerfehler? Speicherproblem? Sobald das Array zu groß wird funktioniert das Programm nicht mehr


von Bernd (Gast)


Lesenswert?

Hallo Zusammen,

ich hab mit GCC eine Programm für einen Atmega64 AU geschrieben.
Sobald ich per Include ein großes Array einbinde mit 350 Double
einträgen, klappt nichts mehr....
Vorab verwende ich schon zwei Array mit je 500 Int Einträgen.

In der Summe als
Array 350 * double
Array 1000 * int

Kann es sein das da irgendwie eine Sperre ist?
Insg. ist das Programm nur
1
avrdude: 16832 bytes of flash written
groß. Hat Atmega hat ja 64kb, sollte eigentlich reichen.
GCC hat hat auch keine Fehler ausgegeben.

Die Array werden 'dynamisch' definiert.
z.B. so für die 350 Double einträge
1
void calculate(void) {
2
3
        //...
4
5
  static double cos[171]; // SIN COS
6
  static double sin[171];
7
8
  cos[0] = 0.08716; // -85
9
  cos[1] = 0.10453; // -84
10
  cos[2] = 0.12187; // -83
11
  cos[3] = 0.13917; // -82
12
  cos[4] = 0.15643; // -81
13
  cos[5] = 0.17365; // -80
14
  cos[6] = 0.19081; // -79
15
        //...
16
}

Gleiches für die Int Array.

Weiß wirklich nicht weiter, akutelle GCC Version hat nichts gebracht,
sobald ich das Double Array (siehe oben) nicht verwende funktioniert
alles besten.

Über Hilfe würde ich mich super freuen.

Vielen Danke & Viele Grüße
Bernd

von Marvin M. (Gast)


Lesenswert?

Wow. Die paar Zeilen Code produzieren 16832 Bytes auf dem Atmel?

von (prx) A. K. (prx)


Lesenswert?

Bist du schon auf die Idee gekommen, dass deine Arrays im kleinen RAM 
liegen, nicht im grossen Flash?

von Ben (demonk)


Lesenswert?

Ja dann rechne doch mal nach...

double gibt es afaik in der avr-libc eh nicht, da wird ein normaler 
single precision Float verwendet.

Der Mega64 hat 4KB SRAM.

int array1[1000] -> 1000*16 bits ~ 2 KB

double (float) array2[350] -> 350*32 bits ~ 1.5 KB

zusammen schonmal 3.5 KB verwendeter RAM

ich würde sagen dein RAM läuft einfach über. Schau dir mal in der LibC 
Doku an, wie du das Array ins Flash schieben kannst. Bei ner 
SinusTabelle ist alles andere Quatsch

Benjamin

von Falk B. (falk)


Lesenswert?

@  Bernd (Gast)
1
void calculate(void) {
2
3
        //...
4
5
  static double cos[171]; // SIN COS
6
  static double sin[171];
7
8
  cos[0] = 0.08716; // -85
9
  cos[1] = 0.10453; // -84
10
  cos[2] = 0.12187; // -83
11
  cos[3] = 0.13917; // -82
12
  cos[4] = 0.15643; // -81
13
  cos[5] = 0.17365; // -80
14
  cos[6] = 0.19081; // -79
15
        //...
16
}

 Benjamin Schmidt (demonk) hat das Problem ja schon benannt. Aber schau 
dir mal in einem C-Buch an, wie man konstante Arrays RICHTIG anlegt und 
mit Daten füllt.

MFG
Falk

von Bernd (Gast)


Lesenswert?

Hi,

super vielen Dank, klappt jetzt wieder, apropos Array Deklaration
1
float PitchKurve[171] PROGMEM = {0.08716,0.10453,0.12187,0.13917,0.15643...}

ohne Index super unübersichtlich. Geht das nicht auch besser?
(bis dato nichts gefunden)

Nochmals vielen Dank

von (prx) A. K. (prx)


Lesenswert?


von T. H. (pumpkin) Benutzerseite


Lesenswert?

Wieso überhaupt einmal Sinus und einmal Cosinus? Das eine lässt sich mit 
einfachsten Mitteln aus dem anderen ableiten. Alles andere ist 
verschenkter Programmspeicher!

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.