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
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).
Danke für die Info. Kann man das irgendwo umkonfigurieren oder ist das Limit unumgänglich ? Bj.
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
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.
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])
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 !!
Eine Division durch eine konstante Zweierpotenz wird nicht als Division implementiert, sondern als weitaus effizientere Schiebeoperation. Vorteilhafterweise ist der Index dabei unsigned.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.