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


von Bj (Gast)


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
von Klaus W. (mfgkw)


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).

von Bj (Gast)


Lesenswert?

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

Bj.

von egberto (Gast)


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

von Christian T. (shuzz)


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.

von (prx) A. K. (prx)


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])

von Bj (Gast)


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 !!

von (prx) A. K. (prx)


Lesenswert?

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

von egberto (Gast)


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

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.