Moin,
in Atmel Studio für SAMD21 beobachte ich eine Kollision von Variablen:
In einem Modul ist ein
1
structat25dfx_chip_moduleat25dfx_chip;
die boolsche Variable:
1
&((((at25dfx_chip).spi))->locked)
Die Adresse von at25dfx_chip.spi ist 0x20007500.
In einem anderen Modul:
1
intintToStr(intx,charstr[],intd)
2
{inti=0;
3
while(x)
4
{str[i++]=(x%10)+'0';
5
x=x/10;
6
}
7
8
while(i<d){str[i++]='0';}
9
reverse(str,i);
10
str[i]='\0';
11
returni;
12
}
i ist im Watch definiert als:
int(a variable at frame base reg $r7 offset 40+-20.
wobei R7= 0x200074F0.
Nun verändert sich at25dfx_chip.spi->locked mit der lokalen i der
Funktion intToStr(). Siehe Bild.
Der boolsche Wert "locked" nimmt also die Werte von i=0..1..2..3 usw an,
wenn intToStr() durchläuft.
Kann es sein, dass der Stack in den Heap crashed?
Eine Verkleinerung anderer Arrays gab keine Veränderung.
Hat jemand eine Idee?
mny tnx!
Ich würde mal vermuten der Stack und der Heap kollidieren?
Deine Funkion hat keine Ahnung wie viel Speicher für str[] benötigt
wird.
Versuch doch mal mit malloc() ob du überhaupt genug Speicher reservieren
kannst.
Thomas K. schrieb:> Die Adresse von at25dfx_chip.spi ist 0x20007500.> int(a variable at frame base reg $r7 offset 40+-20.> wobei R7= 0x200074F0.
Da 0x200074F0 kleiner als 0x20007500 ist, ist der Stack wohl nicht
in den Heap, sondern in den statischen Datenbereich hinein geraten.
Die Atmel-Linkerscripte und der zugehörige Startup-Code reservieren
explizit Platz für den Stack, statt ihn einfach vom Ende des RAMs
nach unten wachsen zu lassen (und damit den statischen Bereich und
den Stack maximal voneinander zu trennen). Damit muss man eine
ausreichende Menge an Stack dort reservieren. Da du offenbar das Atmel
Studio benutzt, musst du mal schauen, wo man das im Projekt einstellt.
Laut lss ist der Stack 0x2000 also 8kbyte groß. Eher denke sich das ein
Pointer von einer lokalen Struktur zurück geben wird. Das wäre so ein
typischer Fehler. Leider ist ja nichr der komplette Quelltext sichtbar