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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.