STM32 bleibt im mer beim "Reset_Handler" hängen

OP #4684463
Lesenswert?

Hallo zusammen

Ich versuche mein Programm mit Atollic True Studio 5.5.0 zu debuggen 
bzw. zu complirieren.

Compilieren klappt soweit. Bis vor kurzem funktionierte auch das 
Debuggen noch ohne Probleme. Seit einer Änderung der Initialisierung 
einer Variable von 0 auf 0x25, funktioniert das Debuggen nicht mehr.

Auch ein zurückändern brachte keine Abhilfe.


Nach dem starten der Debugsession, bleibt das Programm im Startup script 
hängen:
1
  .section .text.Reset_Handler
2
  .weak Reset_Handler
3
  .type Reset_Handler, %function
4
Reset_Handler:
5
--->  ldr   r0, =_estack
6
  mov   sp, r0          /* set stack pointer */
7

8
/* Copy the data segment initializers from flash to SRAM */
9
  movs r1, #0
10
  b LoopCopyDataInit


Controller: STM32F030K6T6
Speicher: 32kByte Flash
Ram: 4kByte

Die Ausgabe aus der Console nach dem Compilieren ist:
1
Print size information
2
   text     data      bss      dec      hex  filename
3
  22672      148      284    23104     5a40  iMS.elf
4
Print size information done
5
Generate build reports done


Dynamische Speicheralloziierung habe ich keine.
Kann es sein, dass ich den Speicher überlaufen lasse?

Danke schonmal
OP #4684506
Lesenswert?

Dr. Sommer schrieb:
> Klingt als wäre dein Controller permanent im Reset, also zB nRST ständig

Ist er nicht.
Weil sobald ich die Debugsession beende, läuft das alte Programm 
weiterhin.
Wenn ich den Controller mittels ST Utility lösche und dann erneut 
Debugge, befindet sich auch wieder ein Programm darauf.

Cyblord -. schrieb:
> Sollte estack nicht im Linkerscript definiert sein?

Vermutlich schon.
Sollte sich dieses in meinem Projektordner befinden?
OP #4684540
Lesenswert?

Ich habe nun nochmals auf 5.5.2 geupdatet.

Nun kann ich teilweise wieder Debuggen.
Zumindest bis zu dieser Stelle:
1
  //USART1
2
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;    //TX1
3
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
4
  GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
5
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
6
  GPIO_Init(GPIOB, &GPIO_InitStructure);

Wobei einige Zeilen zuvor bereits GPIOs ohne Probleme initialisiert 
wurden.
1
GPIO_Init(GPIOB, &GPIO_InitStructure);

Ab hier geht er nicht mehr weiter.
Und lässt sich auch nicht mehr pausieren.


Anbei noch das Linkerskript.
Angehängte Dateien:
OP #4684606
Lesenswert?

hp-freund schrieb:
> Nun verrate uns doch mal was das für eine magische Variable ist.

uint8_t deviceAddress = 0;

Diese habe ich mal kurzzeitig auf 0x25 gehabt.
Kann mir nicht vorstellen, dass es damit was zu tun hat.


Das Programm läuft ohne Debugger problemlos.
Wenn ich es mit dem Debugger laufen lasse, dann macht es plötzlich einen 
Break und springt an eine willkürliche stelle im c-code wobei die Stelle 
jedesmal gleich ist. Früher hatte ich dort mal einen Breakpoint gehabt.

Einen Breakpoint habe ich aktuell jedoch nicht. Also damit meine ich 
überhaupt keinen. Auch keinen deaktivierten.
#4684634
Lesenswert?

Wenn Du Deine Variable mit Null initialisiert, dann legt der Linker sie 
in den Datenbereich, der nicht initialisiert, aber vor dem Start 
ausgenullt wird.
Wenn Du Deine Variable mit 25 initialisierst, dann legt der Linker sie 
in den Block,dessen Init-Werte beim Startup aus dem Flash ins RAM 
kopiert werden.
Das Problem liegt am Startup-Code, eventuell ist das .Data Segment 
falsch angegeben.

Siehe auch folgenden Thread:
Beitrag "Woher kommen die Segmentnamen ".text", ".bss" und ".data" ?"

und:
https://en.wikipedia.org/wiki/Data_segment
OP #4684645
Lesenswert?

Stefan K. schrieb:
> Das Problem liegt am Startup-Code, eventuell ist das .Data Segment
> falsch angegeben.

Danke, werde ich mir gleich anschauen.

Ich habe noch eine neue Spur...

Der breakpoint befindet sich immer an der Adresse 0x80037e2
Aktuell befindet sich dort etwas aus dem Timer Interrupt.

Wenn ich nun die Optimierung (welche bisher deaktiviert war) aktiviere, 
dann macht er weiterhin einen break bei 0x80037e2 nur dann liegt dieser 
in der Funktion pow() welche aus der math.h stammt für welche ich keine 
Sourcen habe.

Wenn ich unter breakpoints, alle aktiven breakpoints ansehe, finde ich 
diesen nicht. bzw. ich habe überhaupt keine gesetzt.
Gast #4684653
Lesenswert?

Hallo,

sicher, dass er an die Stelle 'springt' und dann hängt. Kann es 
vielleicht sein, dass er den Code normal abarbeitet einfach an der 
Stelle stehen bleibt?

Ich habe bei Eclipse(darauf basiert afaik Atollic) manchmal das Problem, 
dass ein Breakpoint in der IDE gelöscht wird, der Debugger das aber 
nicht mitbekommt. Bei mir hilft es dann "Remove All" im 
Breakpoint-Kontextmenü auszuwählen. Anschliessend läuft das Programm 
durch den ehemaligen Breakpoint durch.

Alternativ Zielhardware und Debugger mal stromlos machen?
("Have you tried turning it off and on again?")

CU,
Jay
OP #4684657
Lesenswert?

Jay schrieb:
> Alternativ Zielhardware und Debugger mal stromlos machen?
> ("Have you tried turning it off and on again?")

Hab ich gemacht

Jay schrieb:
> Bei mir hilft es dann "Remove All" im
> Breakpoint-Kontextmenü auszuwählen.

Werde ich gleich versuchen.

Jay schrieb:
> Ich habe bei Eclipse(darauf basiert afaik Atollic) manchmal das Problem,
> dass ein Breakpoint in der IDE gelöscht wird, der Debugger das aber
> nicht mitbekommt.

Ist vermutlich genau das.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren