Daten im Flash Speichern

Gast #358620
Lesenswert?

Hallo,

ich habe einen ATMEGA2561 mit 256kB Flash. Ich möcht in diesem Flash
ein WAV File speichern(ca:220kB).
Als erstes wollte ich das in ein BYTE Array[2][110000](16Bit/Sample) im
Headerfile legen und gut. Da reichen anscheinen die Adressen nicht.
(geht nur bis ca 30000).
Dann wollte ich das Array verbreitern (Array[6][30000]). Da gibt dann
der Compiler auf. Danach dachte ich 6x Array[30000] aber das mag der
Compiler auch nicht.
Jetzt dachte ich noch mehrere Headerfiles zu nehmen(für jedes Array
eines, oder den Flash so vollschreiben und mit Pointern arbeiten.

Hat jemand einen Tip für mich? Bin für jeden Rat dankbar

Tobias
Gast #358626
Lesenswert?

Genau, sollte.
So weit bin ich schon. Das geht auch im kleinen Rahmen (ca 30000). Ich
tippe sogar dass es genau bis 32768 (2^15) geht. Dann kann man in der
Hilfe lesen, dass Arrays auf eine Dimension limitiert sind. Hat es denn
von euch schon mal jemand mit größeren Datenmengen hinbekommen? Ich
überlege schon auf den WINAVR Gcc Compiler und AVR Studio zu wechseln.
Gast #358627
Lesenswert?

Also man kann Variablen im Flash über "const" oder "flash"
speichern.
const int sample[]={....};
Wenn man dies tut, muss man den Variablen schon beim Deklarieren Werte
zuweisen. So entsteht dann eine sehr lange Zeile. Ich glaube, dass der
Compiler da irgendwann aufgibt.
Gast #358629
Lesenswert?

Memory model ist auf small gestell, aber in der Drop down liste kann man
beim Mega2561 auch nur small auswählen. Habs auch schon mit mehreren
Feldern a 30000 Werte probiert und dann bringt er immer die
Fehlermeldung: missing '}' obwohl alles passt. Lösche ich dann einige
Werte aus den geschweiften Klammer dann gehts irgendwann wieder.
Gast #358630
Lesenswert?

Des Rätsels Lösung:

Ich hab mir eine neuere Version des CodeVisions C Compiler besorgt.
1.25.1 Pro. Da war das Problem aber noch das selbe. Also habe ich bei
der Initialisierung nicht den Hex-Wert (0x23) sonder den Int-Wert
angegeben. Das spart mir mindestens drei zeichen.
const BYTE Sound[]={2,5,6,4,12,...}. Ich habe also zwei Arrays a ca.
102000 BYTE angelegt. Jetzt geht das so. Eigenartige Sache...
Gast #358632
Lesenswert?

@Ernst

Bin in Assembler nicht so fit. Das muss ich mir erst mal anschauen. Das
versteh ich auf anhieb gar nicht, aber trotzdem Danke für den Tip. Werds
mir mal anschauen.

Und auch an die Anderen: vielen Dank für die Anregungen
#358633
Lesenswert?

Müsste im Prinzip recht einfach gehen:

im C file:
extern const char sample[];

im ASM File:
_sample:
 .db 0x01, 0x02, 0x03, 0x04
 .db 0x05 ...
usw.

für (16Bit-) Int arrays halt mit ".dw".

Wenns beim Zusammenlinken eine Fehlermeldung wg. unaufgelösten Symbolen
gibt, muss das Label im ASM-File evtl. anders heissen.

/Ernst

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren