Flash: Nee, ist doch noch genug Platz.
RAM: Ja, Dein Stack wird Dir Variablen überschreiben:
.data + .bss = 2075 Byte was mehr ist als die 2048 bytes RAM des Mega32.
Hallo,
Ab einer Bestimmten Menge an Programm spielen die Variablen verrückt!!!
Liegt das an einer Überschreitung der Größen?
Size after:
main.elf :
section size addr
.text 8960 0
.data 1932 8388704
.bss 143 8390636
.noinit 0 8390779
.eeprom 0 8454144
.stab 10140 0
.stabstr 3996 0
Total 25171
Ich weiß nicht mehr aus!
Gruß,
Franz
Flash: Nee, ist doch noch genug Platz.
RAM: Ja, Dein Stack wird Dir Variablen überschreiben:
.data + .bss = 2075 Byte was mehr ist als die 2048 bytes RAM des Mega32.
Hi Kaiser-F,
Gibt diesem Thema doch bitte einen gescheiten Namen!
Jeder braucht dringend hilfe, sondst würde man ja nicht fragen.
MfG Alex
Hm, das würde also begründen, warum die Variablen verrückt spielen?Zitat von ogni42
Sorry, hab schon geändert. Stört mich selber auch immer.Zitat von PasstScho
War so verwirrt, da ist mir nichts anderes eingefallen....
Gruß,
Franz
Wenn der Stack Variablen überschreibt, dann kommt es zu genau diesen absolut unvorhersehbaren Ergebnissen. Daran bin ich auch schonmal fast verzweifelt.
Weiterhin würde ich bei so starker Auslastung des SRAM auf die Addition von .data und .bss nichts mehr geben. Je nach dem wie tief die Funktionen verschachtelt sind, kommt es schon deutlich vorher zu Problemen.
Schau Dir unbedingt den Artikel Speicherverbrauch bestimmen mit avr-gcc hier im RN an. Bei mir waren die Werte des Compilers bei rund 90% SRAM und durch die verschachtelten Funktionsaufrufe hat mir der Stack regelmäßig globale Variablen zerschossen.
Servus
Technikus
Interessanter Artikel... Vielen Dank!
Nur wie behebe ich mein Problem...?
Soo viele Variablen im SRAM habe ich ja garnicht...
10 oder 20. Jeweils 8 oder 16 Bit, halbe/halbe.
Und eine Schriftart, die als Array gespeichert ist. Die ist aber nich im SRAM. Hoffe ich.
Habt ihr Informationen, wie man die Speicherart festlegt. In meinem Buch ist das zu allgemein auf PC-Systeme bezogen. Jetzt weiß ich nicht genau, wie das bei AVR-GCC gilt....
Vielen Dank für eure Bemühungen
Gruß,
Franz
meinst Du vielleicht avr/pgmspace.h u. avr/eeprom.h ?Und eine Schriftart, die als Array gespeichert ist. Die ist aber nich im SRAM. Hoffe ich.
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Ähm.... Sorry, kann dir gerade nicht folgen, welcher Bahnhof?
Gruß,
Franz
ähm, sorry, es sollte so sein:
Die ist aber nich im SRAM. Hoffe ich.
meinst Du vielleicht avr/pgmspace.h u. avr/eeprom.h ?Habt ihr Informationen, wie man die Speicherart festlegt.
so, ich hoffe, jetzt ist es verständlicher ...
Gruß Sebastian
Linus TorvaldSoftware is like s e x: its better when its free.
Wenn Du einfach ein Array definiert hast, z.B.Und eine Schriftart, die als Array gespeichert ist. Die ist aber nich im SRAM. Hoffe ich.
char array[256] = {1, 2, 3, ....};
dann liegt das sowohl im Flash als auch im SRAM! Das ist sinnvoll, wenn Du dieses Array zur Laufzeit ändern willst. Wenn Du aber nur die Werte ausliest und nicht änderst, ist das eine grandiose Verschwendung von SRAM.
Du kannst den Compiler anweisen, ein Array (wie jede andere Variable) nicht ins SRAM zu kopieren, sondern nur im Flash (oder im EEPROM) abzulegen.
Variablen im Flash werden so definiert:
char array[5] PROGMEM = {1, 2, 3, 4, 5};
Damit das funktioniert, brauchst Du
#include <avr/pgmspace.h>
Allerdings kannst Du auf Variablen im Flash nicht transparent zugreifen. Du mußt sie vor Gebrauch in das SRAM umkopieren. Trotzdem spart man viel SRAM, denn Du must von einem großen Array meist nur ein einzelnes Element im SRAM haben und nicht das ganze Array, z.B. 100 Elemente. Der Zugriff auf Variablen im Flash erfolgt mit den Funktionen pgm_read_byte, pgm_read_word, memcpy_P und viele andere. Für weitere Infos lies mal das
Tutorial von mikrocontroller.net, da stehen nähere Infos dazu drin. Ansonsten schau Dir mal das "avr libc user manual" bezüglich avr/pgmspace.h an, das findest Du (wenn Du WinAVR installiert hast) im Startmenü unter WinAVR.
Servus
Technikus
Edit: Link repariert
Lesezeichen