STM32: Linkerscript löst Debugging-Problem aus?

Gast #2149175
Lesenswert?

Hi,
ich habe mit dem beigefügten Linkerscript (STM32F10x_512k_64.ld) für 
einen STM32RE meine C++ Applikation mit CodeSourcery erstellt.
Der Operator new ist überladen und durch eine extrem simple Lösung 
ersetzt: er soll im Heap neuen Speicher allokieren, eine Deallokation 
ist (aktuell) nicht geplant (Auszug des Codes ist in 
mini_new_fragment.cpp).

Beim Debuggen mit dem J-Link tritt nun ein Problem auf, für das ich 
keine Erklärung finden kann:
Bild 1 (vorher.jpg) zeigt den Debugger vor dem Ausführen des Vergleichs 
(heap_end == 0).
Ein einfacher 'Step' führt zum dem Ergebnis in Bild 2 (nachher.jpg).

Wenn ich die entsprechende Stelle im Hauptprogramm überspringe (also 
nicht in new hinein durchsteppe), liefert er bei der Allokation eine -1 
als Speicheradresse (Fehler).

Die Zuordnung:
1
heap_end = &_ebss;
habe ich geändert in:
1
heap_end = &_susrstack;
nachdem ich in der Map-Datei gesehen habe, daß _ebss auf 0x20000000 
(Anfang des RAMs) liegt. Hier liegen aber auch die statischen Variablen 
wie heap_end. Deshalb bin ich auf _susrstack ausgewichen ( = 
0x200000012, liegt nach den statischen Variablen).
Hat natürlich nichts geändert, weil er ja gar nicht zur Ausführung der 
Anweisung kommt.

Dennoch habe ich das Gefühl, daß es am Linkerskript liegt. Hat jemand 
eine Idee?

Grüße
schnack
Angehängte Dateien:
Gast #2149399
Lesenswert?

Noch eine Ergänzung:
Den letzte Zugriff, der im J-Link Fenster erfolgt, habe ich durch 
"hoovering" über heap_end ausgelöst. Die statische Variable ist bei 
0x20000008 abgelegt.
Wie ich durch Googeln gefunden habe, wird die Debugger-Fehlermeldung 
wahrscheinlich durch einen illegalen Speicherzugriff ausgelöst. Aber was 
kann an dieser Abfrage (Ist der 32bit Wert ab 0x20000008 gleich 0?) 
nicht zulässig sein?
Grüße
schnack

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