Arraygröße AVR--GCC

Gast #1472167
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
Gast #1472675
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
#1472677
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.
#1472686
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])
Gast #1472791
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 !!
Gast #1472803
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

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.