Feste Größe ändert sich beim Programmablauf (="Suchspiel" Memoryüberschneidung)
Bitte um Hilfe
Die Größe int16_t tdek4 zur Dimensionierung einer Geschwindigkeitsrampe wird zu Beginn eines Programmslauf im main in einer Routine zur Dimensionierung verschiedener Größen mit einem Wert belegt und aktuell nicht weiter verwendet (wurde früher verwendet, aktuell inaktiv, wird später wieder benutzt) bis auf die hier erwähnte Ausgabe. Diese Größe belegt das Ende der dokumentierten Memorymap.
Die Ausgabe der Größe in einer Liste zusammen mit anderen Werten zeigt unerklärliche Änderungen bei verschiedenen Ausgabeaufrufen >>obwohl<< sie, wie erwähnt, nur ein Mal mit einem festen Wert belegt wird. Sie nimmt dabei offensichtlich zufällige, soweit feststellbar stets andere Werte an. Auch ohne Aufruf der erwähnten Dimensionierungsroutine sind diese Schwankungen festzustellen.
Die sinngleiche Größe tdek1 für eine andere Geschwindigkeit liegt in der memorymap weit entfernt; sie ist stabil. Auch die der tdek4 in der memorymap benachbarte Größe - die vor ihr liegt, zeigt nicht solche Veränderungen.
Hier ein Auszug aus dem zugehörigen *.map-File, die "E E E.."-Einschübe markieren entfernte Passagen.
Code:
Archive member included because of file (symbol)
E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E
-------------------------------------------------------------
Allocating common symbols
Common symbol size file
iyp12 0x2 R5MoCo.o
kend1t1 0x2 R5MoCo.o
E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E
-------------------------------------------------------------
m34vorlauf 0x2 R5MoCo.o
nenc1 0x1 R5MoCo.o
tdek4 0x2 R5MoCo.o <<==
Memory Configuration
Name Origin Length Attributes
text 0x00000000 0x00020000 xr
data 0x00800060 0x0000ffa0 rw !x
eeprom 0x00810000 0x00010000 rw !x
fuse 0x00820000 0x00000400 rw !x
lock 0x00830000 0x00000400 rw !x
signature 0x00840000 0x00000400 rw !x
*default* 0x00000000 0xffffffff
Linker script and memory map
Address of section .data set to 0x800100
LOAD
E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E
-------------------------------------------------------------
c:/programme/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/crtm328p.o
0x000000a2 __vector_22
0x000000a2 __vector_12
0x000000a2 __bad_interrupt
0x000000a2 __vector_6
0x000000a2 __vector_3
0x000000a2 __vector_23
0x000000a2 __vector_25
0x000000a2 __vector_11
0x000000a2 __vector_13
0x000000a2 __vector_17
0x000000a2 __vector_5
0x000000a2 __vector_4
0x000000a2 __vector_9
0x000000a2 __vector_15
0x000000a2 __vector_10
0x000000a2 __vector_16
0x000000a2 __vector_20
.text 0x000000a6 0x25d6 R5MoCo.o
0x00000430 TC2TMR_init
E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E
-------------------------------------------------------------
0x00000120 __vector_18
0x0000024a itxt_rn
0x000002ee init_twi_slave
.text 0x0000267c 0x0 c:/programme/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_udivmodhi4.o)
.text 0x0000267c 0x0
E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E
-------------------------------------------------------------
*(.fini0)
.fini0 0x0000281e 0x4 c:/programme/winavr-20100110/bin/../lib/gcc/avr/4.3.3/avr5\libgcc.a(_exit.o)
*(.fini0)
0x00002822 _etext = .
.data 0x00800100 0x3b6 load address 0x00002822
0x00800100 PROVIDE (__data_start, .)
*(.data)
.data 0x00800100 0x0 c:/programme/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/lib/avr5/crtm328p.o
.data 0x00800100 0x3b6 R5MoCo.o
0x008004b3 Idelta1
0x008004a8 m12v
0x008004a9 m12z
E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E E
-------------------------------------------------------------
0x008008a3 m34vorlauf
0x008008a5 nenc1
0x008008a6 tdek4 <<==
0x008008a8 PROVIDE (__bss_end, .)
0x00002822 __data_load_start = LOADADDR (.data)
0x00002bd8 __data_load_end = (__data_load_start + SIZEOF (.data))
.noinit 0x008008a8 0x0
0x008008a8 PROVIDE (__noinit_start, .)
*(.noinit*)
0x008008a8 PROVIDE (__noinit_end, .)
0x008008a8 _end = .
0x008008a8 PROVIDE (__heap_start, .)
.eeprom 0x00810000 0x0
*(.eeprom*)
0x00810000 __eeprom_end = .
.fuse
*(.fuse)
*(.lfuse)
*(.hfuse)
*(.efuse)
Ich bitte um Hinweise woran es liegen könnte und wie ich das abstellen kann.
Ist das RAM so voll, dass der Stackpointer überlauft?
Wie könnte ich besser bzw. eindeutig feststellen, was die Ursache ist?
Ich danke im Voraus für eure Tips und Hilfen.