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
Stichwort "progmem". In der Hilfe findest du dann auch Programmbeispiele.
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 ;)
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.
> 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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.