www.mikrocontroller.net

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


Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
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
void calculate(void) {

        //...

  static double cos[171]; // SIN COS
  static double sin[171];

  cos[0] = 0.08716; // -85
  cos[1] = 0.10453; // -84
  cos[2] = 0.12187; // -83
  cos[3] = 0.13917; // -82
  cos[4] = 0.15643; // -81
  cos[5] = 0.17365; // -80
  cos[6] = 0.19081; // -79
        //...
}

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

Autor: Marvin M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wow. Die paar Zeilen Code produzieren 16832 Bytes auf dem Atmel?

Autor: A. K. (prx)
Datum:

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

Autor: Benjamin Schmidt (demonk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Bernd (Gast)
void calculate(void) {

        //...

  static double cos[171]; // SIN COS
  static double sin[171];

  cos[0] = 0.08716; // -85
  cos[1] = 0.10453; // -84
  cos[2] = 0.12187; // -83
  cos[3] = 0.13917; // -82
  cos[4] = 0.15643; // -81
  cos[5] = 0.17365; // -80
  cos[6] = 0.19081; // -79
        //...
}

 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

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

super vielen Dank, klappt jetzt wieder, apropos Array Deklaration
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

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: T. H. (pumpkin) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.