Hallo, ich möchte im Flash eines ATmega128 zwei große Arrays als Konstante ablegen. Die Zeilen const prog_uchar dsp_prog[49152]; const prog_uchar dsp_data[32768]; erzeugen aber die Fehlermeldung "size of array [...] ist too large". Wie kann ich das am besten machen? Oder ist das grundsätzlich nicht möglich? Gruß Tom
das thema wurde allein hier im GCC forum in letzter zeit mehrmals behandelt. z.b.: Beitrag "pgm_read_byte(); --> Nur für Lower 64k Flash (mega128)???" speziell für fälle wie deinen konnte "keine" lösung gefunden werden da sich das ablegen der großen arrays über die 64k grenze hinweg als stolperstein herausstellt (du wirst sicher festgestellt haben, dass EIN array ALLEIN problemlos abgelegt wird). laut aussagen des einen oder anderen users hier ist es machbar, aber wie das gemacht wird, wurde, wie gesagt, leider nicht geklärt. pumpkin
> du wirst sicher festgestellt haben, dass EIN array ALLEIN > problemlos abgelegt wird Ich habe festgestellt, dass ein Array max. 32767 Byte groß sein darf, denn ein const prog_uchar dsp_prog[32767]; sowie const prog_uchar dsp_data[32767]; const prog_uchar dsp_data1[32767]; const prog_uchar dsp_data2[32767]; wird fehlerfrei compiliert.
BTW: ich nutze ja das neuste AVR Studio zusammen mit WinAVR und habe gerade in den Projektoptionen festgestellt, dass hier als Flash-Size 64k eingetragen ist. Jetzt bin ich völlig verwirrt.
Ok, was habe ich eigentlich vor? Ich möchte einen DSP durch einen ATmega128 booten. Zu diesem Zweck wird der AVR an einen speziellen Port des DSP angeschlossen und nach einem Reset überträgt der AVR die Firmware an den DSP und nach Abschluß dieses Transfers startet der DSP. Der DSP verfügt über zwei Speicherereiche: Datenspeicher: 16k x 16 Programmspeicher: 16k x 24 Insgesamt: 16k x 40, also 81920 Byte bzw. 40960 Worte Diese 40960 Worte müssen im AVR im Flash gespeichert werden, damit sie nach dem Reset an den DSP gesendet werden können. Der AVR ist ja unterteilt in 64k x 16, also 131072 Byte bzw. 65536 Worte Meine Idee: ich nehme mir einfach das vom gcc erzeugte hex-File, und hänge an dieses File die Daten für den DSP dran. Ich glaube, ich kann diese Daten direkt vom DSP-Compiler als hex-File ausgeben lassen, dass Anhängen dürfte kein Problem sein. Die Startadresse dieser Daten wäre dann bei 131072-81920=49152. W. a. W. hätte ich dann ein hex-File, welches bis max. Adr. 49151 den AVR-Code enthält, und ab Adresse 49152 dann die Daten für den DSP. Diese könnte ich dann mit einer Assemblerroutine auslesen usw. Könnte klappen, oder?
@Tom >Ich möchte einen DSP durch einen ATmega128 booten. Zu diesem Zweck wird >der AVR an einen speziellen Port des DSP angeschlossen und nach einem Wäre es nicht sinnvoller die DSP-Firmware in nen seriellen EEPROM zu speichern. Dann tuts jeder kleine und billige AVR und Probleme mit grossen konstanten Arrays gibts auch nicht. MFG Falk
> Wäre es nicht sinnvoller die DSP-Firmware in nen seriellen EEPROM zu > speichern. Dann tuts jeder kleine und billige AVR und Probleme mit > grossen konstanten Arrays gibts auch nicht. Daran habe ich auch schon gedacht, nur ist die Schnittstelle zum DSP 16 Bit breit, zzgl. 4 Steuersignalen. Die Richtung µC->DSP könnte man mit 2 Schieberegistern lösen, allerdings möchte ich auch Daten zwecks Verifizierung vom DSP wieder lesen, was wiederum zusätzliche Hardware erfordern würde. Ich dachte, mit dem ATmega128 könnte man so zwei Fliegen mit einer Klappe schlagen. Der ATmega128 soll auch die Möglichkeit bieten, die DSP-Firmware vom PC aus über serielle Schnittstelle zu laden. Letztere Funktion ist ja überhaupt kein Problem und wenn ich dann mal ein fertiges DSP-Programm habe und es mir gelingt, dass sinnvoll ins hex-File zu bringen, dann ist das schon ok. Ist ja eine private Bastelei, da ist frickeln erlaubt :)
Wen's interessiert und nicht ärgert: IAR-Compiler verdaut große Felder problemlos: __hugeflash char dummy[100000];
> Wen's interessiert und nicht ärgert: IAR-Compiler verdaut große > Felder problemlos Jeder kostenpflichtige Compiler, den ich kenne, unterstützt das. Ist eigentlich auch selbstverständlich, wenn man schon so viel Geld dafür ausgibt.
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.