Forum: Compiler & IDEs Große Arrays als Konstante im Flash ablegen


von Tom (Gast)


Lesenswert?

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


von pumpkin (Gast)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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

von Tom (Gast)


Lesenswert?

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.

von Tom (Gast)


Lesenswert?

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?

von Falk (Gast)


Lesenswert?

@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

von Tom (Gast)


Lesenswert?

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



von IAR-man (Gast)


Lesenswert?

Wen's interessiert und nicht ärgert: IAR-Compiler verdaut große Felder 
problemlos: __hugeflash char dummy[100000];

von Patrick D. (oldbug) Benutzerseite


Lesenswert?

Spam...

von Tom (Gast)


Lesenswert?

> 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
Noch kein Account? Hier anmelden.