Forum: Compiler & IDEs Atmel SAMD21 Kollision von Variablen


von Thomas K. (technomicro)


Angehängte Dateien:

Lesenswert?

Moin,
in Atmel Studio für SAMD21 beobachte ich eine Kollision von Variablen:

In einem Modul ist ein
1
struct at25dfx_chip_module    at25dfx_chip;
die boolsche Variable:
1
&((((at25dfx_chip).spi))->locked)
Die Adresse von at25dfx_chip.spi ist 0x20007500.

In einem anderen Modul:
1
int intToStr(int x, char str[], int d)
2
{  int i=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
  return i;
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!

1
Sections:
2
Idx Name          Size      VMA       LMA       File off  Algn
3
  0 .text         0002728c  00000000  00000000  00010000  2**3
4
                  CONTENTS, ALLOC, LOAD, READONLY, CODE
5
  1 .ARM.exidx    000001a8  0002728c  0002728c  0003728c  2**2
6
                  CONTENTS, ALLOC, LOAD, READONLY, DATA
7
  2 .relocate     00000ad4  20000000  00027434  00040000  2**3
8
                  CONTENTS, ALLOC, LOAD, DATA
9
  3 .bss          00004ad4  20000ad4  00027f08  00040ad4  2**2
10
                  ALLOC
11
  4 .stack        00002000  200055a8  0002c9dc  00040ad4  2**0
12
                  ALLOC
13
  5 .ARM.attributes 00000028  00000000  00000000  00040ad4  2**0
14
                  CONTENTS, READONLY
15
  6 .comment      00000059  00000000  00000000  00040afc  2**0
16
                  CONTENTS, READONLY
17
  7 .debug_info   0006bf48  00000000  00000000  00040b55  2**0
18
                  CONTENTS, READONLY, DEBUGGING
19
  8 .debug_abbrev 00008c68  00000000  00000000  000aca9d  2**0
20
                  CONTENTS, READONLY, DEBUGGING
21
  9 .debug_loc    00009c5b  00000000  00000000  000b5705  2**0
22
                  CONTENTS, READONLY, DEBUGGING
23
 10 .debug_aranges 00001ae8  00000000  00000000  000bf360  2**0
24
                  CONTENTS, READONLY, DEBUGGING
25
 11 .debug_ranges 00001858  00000000  00000000  000c0e48  2**0
26
                  CONTENTS, READONLY, DEBUGGING
27
 12 .debug_macro  00010c7d  00000000  00000000  000c26a0  2**0
28
                  CONTENTS, READONLY, DEBUGGING
29
 13 .debug_line   00022963  00000000  00000000  000d331d  2**0
30
                  CONTENTS, READONLY, DEBUGGING
31
 14 .debug_str    0009ef75  00000000  00000000  000f5c80  2**0
32
                  CONTENTS, READONLY, DEBUGGING
33
 15 .debug_frame  00008888  00000000  00000000  00194bf8  2**2
34
                  CONTENTS, READONLY, DEBUGGING
1
//intToStr________________________________________
2
int intToStr(int x, char str[], int d)
3
{  int i;
4
    2494:  b590        push  {r4, r7, lr}
5
    2496:  b087        sub  sp, #28
6
    2498:  af00        add  r7, sp, #0
7
    249a:  60f8        str  r0, [r7, #12]
8
    249c:  60b9        str  r1, [r7, #8]
9
    249e:  607a        str  r2, [r7, #4]
10
  i=0;
11
    24a0:  2300        movs  r3, #0
12
    24a2:  617b        str  r3, [r7, #20]

von Thomas K. (technomicro)


Lesenswert?

Wenn die structs nicht lokal sondern global definiert werden, geht es.
Habe ich da etwas übersehen?
1
struct at25dfx_chip_config    v_at25dfx_chip_config;
2
struct spi_config        v_at25dfx_spi_config;
3
struct spi_module        v_at25dfx_spi_module;
4
5
void EM_configure_spi_master(void)
6
{   //struct at25dfx_chip_config    v_at25dfx_chip_config;
7
    //struct spi_config        v_at25dfx_spi_config;
8
    //struct spi_module        v_at25dfx_spi_module;
9
10
     at25dfx_spi_get_config_defaults(&v_at25dfx_spi_config);
11
  v_at25dfx_spi_config.mode_specific.master.baudrate = CONF_masterbaudrate;
12
  v_at25dfx_spi_config.mux_setting = CONF_mux_setting;  
13
  v_at25dfx_spi_config.pinmux_pad0 = CONF_pinmux_pad0;
14
  v_at25dfx_spi_config.pinmux_pad1 = CONF_pinmux_pad1;
15
  v_at25dfx_spi_config.pinmux_pad2 = CONF_pinmux_pad2;
16
  v_at25dfx_spi_config.pinmux_pad3 = CONF_pinmux_pad3;
17
18
  spi_init(&v_at25dfx_spi_module, v_EM_spiNumber, &v_at25dfx_spi_config);
19
  spi_enable(&v_at25dfx_spi_module);
20
  v_at25dfx_chip_config.type = CONF_type;
21
  v_at25dfx_chip_config.cs_pin = CONF_pinmux_cs_pin;
22
  at25dfx_chip_init(&v_at25dfx_chip, &v_at25dfx_spi_module, &v_at25dfx_chip_config);
23
  at25dfx_chip_sleep(&v_at25dfx_chip);
24
}

von Fabian F. (fabian_f55)


Lesenswert?

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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Zweig (Gast)


Lesenswert?

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

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.