LUT- SRAM - Flash - NVRAM

OP #3071910
Lesenswert?

Hallo Jungs,

ich hab eine Anfängerfrage,

wohin wird eigentlich mein Programmcode in in den UC geschrieben?

Ich will mir eine LUT erzeugen in denen für einen Sinus, Werte enthalten 
sind: int sinus1 [200][200],
die Werte gehen von 0-65000

leider bekomme ich dann folgende Fehlermeldung:
Error  111  XYZ.elf section `.bss' will not fit in region `CPUSRAM'
Error  112  region `CPUSRAM' overflowed by 0 bytes

das heißt das ich zu wenig Speicher habe !?

Nun dachte ich mir, dass es auch noch anderen Speicher geben muss. ?!

Blos in welchem Speicher soll ich jetzt meine LUT Ablegen?
Deshalb auch meine Anfangsfrage, wo überhaupt der Code rein geschrieben
wird!

Bei AVR Studio5 sind einige Beispiele enthalten unteranderem
"FLASHC Example - UC3C-EK..." wo NVRAM bentuzt wird.

Ach ja ich benutze das [AVR32] UC3C-EK mit dem AT32UC3C0512C.

Henry
#3071983
Lesenswert?

Der Programmcode landet im Flash.
Ebenso landen alle mit "progmem" spezifizierten Konstanten dort.

Initialisierte Daten werden beim Start automatisch vom Flash ins RAM 
kopiert. Das sind auch Strings, die dann sehr schnell sehr viel 
kostbares RAM auffressen.
Alle anderen (nicht initialisierten) Daten wohnen im RAM.

Die Ablage im EEPROM musst du selbst organisieren. Es gibt fertige 
Routinen dafür.
Gast #3072229
Lesenswert?

Du kannst eine LUT vereinfacht gesagt auf zwei Arten realisieren:

1. Sie liegt im Flash und im RAM, d.h. es wird RAM reserviert und die 
Initialwerte werden beim Systemstart aus dem Flash ins RAM kopiert.
Das passiert z.B. bei Dingen wie
1
uint8_t x = 10;
x ist eine Variable im RAM und der Initialwert 10 liegt im Flash.
Das kostet Dich genausoviel RAM wie Flash.

2. Sie liegt nur im Flash und Du liest direkt aus dem Flash.
Hierzu muß man je nach CPU-Architektur spezielle Befehle benutzen (oder 
auch nicht).
Leider ist nicht einheitlich gelöst, wie man einen Wert in "C" ins Flash 
legt.
Manchen C-Compiler reicht es,
1
const uint8_t x = 10;
hinzuschreiben, andere C-Compiler benötigen ein spezielles Schlüsselwort 
wie z.B.
1
const uint8_t progmem x = 10;

Auch ist es compiler-abhängig, wie man aus dem Flash lesen kann.
Auf von-Neumann-CPUs wie dem MSP430 macht man es genauso wie beim RAM.
Harvard-CPUs benötigt i.d.R. einen anderen CPU-Befehl, daher muß man 
Macros wie "pgm_read_word_near" benutzen.
Andere Harvard-CPUs wie der PIC24 können wiederum Flash-Pages in den 
RAM-Adressraum einblenden.

Wie es bei Deinem AVR32 ist, mußt Du im Datenblatt bzw. der 
C-Compiler-Doku nachlesen.

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