mikrocontroller.net

Forum: Compiler & IDEs Arraygröße AVR--GCC


Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Forum,

ich möchte mit einem AVR Mega128 einen Sound abspielen und habe diesen 
als PCM array im Flash definiert. (AVR-Studio mit AVR-GCC)

Funktioniert auch alles gut bis zu einer gewissen Array-Größe.
Ein 32kB Array hat noch funktioniert, aber jetzt bei ca 80kB meckert der 
Compiler "error: size of array is too large"

Gibt's da irgendwo eine maximale Array-Größe zu beachten oder ggf. zu 
konfigurieren ?? Wie definiere ich so ein großes Array für den AVR ??

#include <avr/pgmspace.h>
//Sound Daten
const unsigned char sound1[] PROGMEM = {
0xA7, 0x54, 0x71, 0x92, 0x8B, 0x88, 0x7B, 0x59, 0x88, 0x84, 0x82, 0x86, 
0x7E, 0x83, 0xA4, 0x41, 0xA0, 0x66, 0x73, 0xAC, 0x66, 0x7B, 0x79, 0x9E,
:
:
:
0x71, 0x7E, 0x4C, 0x49, 0x53, 0x54, 0x04, 0x00,
0x00, 0x00, 0x49, 0x4E, 0x46, 0x4F
};

Danke vorab - Bj

: Verschoben durch Admin
Autor: Klaus Wachtler (mfgkw)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mehr als 32 k geht m.w. nicht mit dem AVR und gcc in einem Feld,
weil der Compiler nur 2 Byte lange Werte zur Adressberechnung
hat (mit Vorzeichen, um damit vorwärts und rückwärts rechnen zu
können).

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Info.
Kann man das irgendwo umkonfigurieren oder ist das Limit unumgänglich ?

Bj.

Autor: egberto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wenn du z.B. 2 Arrays direkt hintereinander deklarierst, stehen sie auch 
(normalerweise) hintereinander im Speicher.....man braucht dann nur noch 
einen Pointer...

Grüße,

egberto

Autor: Christian T. (shuzz)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Theoretisch solltest Du das Limit austricksen können indem Du ein 
zweidimensionales Array anlegst.
Dann werden halt zwei Indizes benutzt, ist vermutlich umständlicher für 
den Compiler (d.h. die Zugriffe auf das Array werden bissle langsamer), 
müsste aber funktionieren.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
2-dimensionales Array wird wohl auch nicht helfen, wohl aber ein Array 
aus Pointern auf ein Array. Also beispielsweise:

char array0[16384] PROGMEM = ...;
char array1[16384] PROGMEM = ...;
char array2[16384] PROGMEM = ...;
char array3[16384] PROGMEM = ...;
char *array[4] = { array0, array1, array2, array 3 };

Wenn wie hier array selbst nicht im progmem ist wird der Zugriff 
einfach:
  pgm_read_byte(&array[i/16384][i%16384])

Autor: Bj (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit dem 2-dimensionalen Array wird wohl nicht klappen. Hatte schon 
versucht statt 32k Bytes mal 32k Integer bzw. Long anzulegen. Sobald das 
gesamte Array 32k Größe übersteigt kommt die Fehlermeldung.

Bleibt nur die Lösung mehrere Arrays nacheinander im Flash abzulegen.
Da der Zugriff auf die Array im Interrupt stattfinden will ich die 
Division bei der Pointer-Array Lösung eigentlich nicht umsetzen.

Danke an alle !!

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Eine Division durch eine konstante Zweierpotenz wird nicht als Division 
implementiert, sondern als weitaus effizientere Schiebeoperation. 
Vorteilhafterweise ist der Index dabei unsigned.

Autor: egberto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde die Lösung von A. K. nun doch meiner (Arrays hintereinander) 
vorziehen - dann kann man den Code auch noch jemandem zeigen....-;

Grüße,

egberto

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.