Forum: Mikrocontroller und Digitale Elektronik LUT- SRAM - Flash - NVRAM


von Henry P. (henrylexx)


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

von Georg G. (df2au)


Lesenswert?

Stichwort "progmem". In der Hilfe findest du dann auch 
Programmbeispiele.

von Henry P. (henrylexx)


Lesenswert?

Danke, damit bringst du mich anscheinend auf den richtigen Weg..!

Aber für eine Antwort auf meine Frage bezüglich des Speicherortes meins 
Programmcodes und meine Variablen, wäre ich trotzdem sehr dankbar ;)

von Georg G. (df2au)


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.

von Jim M. (turboj)


Lesenswert?

> int sinus1 [200][200];

Das sind bei AVR32 schon mal 160 KByte Daten. Du hast aber nur 68 KByte 
RAM. PROGMEM brauchts beim AVR32 hoffentlich nicht mehr, "const int" 
müsste eigentlich ausreichen. Die Werte müssen dann aber bereits beim 
Compilieren fest stehen.

von Bronco (Gast)


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.

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.