www.mikrocontroller.net

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


Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: pumpkin (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 :)



Autor: IAR-man (Gast)
Datum:

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

Autor: Patrick Dohmen (oldbug) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Spam...

Autor: Tom (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.