Atollic STM32H7 + ST-LINK Fehler beim Schreiben von Daten in Flash mit mathematischer Bibliothek

Ich arbeite derzeit an einem STM32H743VIT6-Chip (auf einem selbst entworfenen Board), mit der Atollic TrueStudio-Toolchain (Version 9.0.0), unter Verwendung eines ST-LINK-Debuggers auf einem STM32F4-Discovery-Board (ST-LINK-Firmware-Version V2J31S0 ).

Wenn ich versuche, mein Programm in der TrueStudio-IDE zu debuggen, wird mir der folgende Fehler angezeigt:

Failure at line:6 in 'Target Software Startup Scripts'. Please edit the debug configuration settings. 

Error writing data to flash

Das Debugger-Startskript ist nur Standard:

# Set flash parallelism mode to 32, 16, or 8 bit when using STM32 F2/F4 microcontrollers
# 2=32 bit, 1=16 bit and 0=8 bit parallelism mode
monitor flash set_parallelism_mode 2

# Load the program executable
load        

# Enable Debug connection in low power modes (DBGMCU->CR)
set *0xE0042004 = (*0xE0042004) | 0x7
# Set a breakpoint at main().
tbreak main

# Run to the breakpoint.
continue

Da vor einiger Zeit alles gut funktionierte, habe ich versucht, meinen Code zurückzusetzen und festgestellt, dass eine bestimmte Codezeile das Problem verursacht.

#include <math.h>
// Something irrelevant...
double sin_deg (double degree)
{
    double rad = degree / 180.0 * M_PI;
    return sin(rad); // This line gives me problem
}

Ich habe die obige Funktion mit der Absicht geschrieben, die Funktionalität der Mathematikbibliothek auf der STM32H7-MCU zu testen. return sin(rad);Wenn ich z. B. die auf etwas ohne Funktionen aus math lib ändere return rad;(aber nicht return cos(rad);), funktioniert alles wieder einwandfrei . Hier ist das einzige Vorkommen von Funktionen aus der Mathematikbibliothek.

Mit der beteiligten mathematischen Bibliothek (z. B. Beibehaltung des ursprünglichen nicht debuggbaren Codes return sin(rad);) ist das Projekt immer noch perfekt kompatibel, und das kompilierte Programm funktioniert wie erwartet, wenn ich die ausführbare Datei mit anderen Tools lade, z. B. STM32CubeProgrammer, oder einfach Strg+F11 in der IDE drücke (Ich habe den Run-Befehl mit der CLI des STM32CubeProgrammer konfiguriert). Mit anderen Worten, alles andere ist in Ordnung, außer kann nicht debuggen .

Ich habe das Debugger-Protokoll weiter überprüft und es gibt mir Folgendes:

Atollic TrueSTUDIO gdbserver for ST-Link. Version 4.2.0 (WIN32 2018-01-16 10:57:14 15656)
Copyright (c) 2018, STMicroelectronics. All rights reserved.

Starting server with the following options: 
        Persistant Mode            : Disabled 
        LogFile Name               : debug_log.txt
        Logging Level              : 1
        Listen Port Number         : 61234
        Status Refresh Delay       : 15s
        Verbose Mode               : Disabled 
        SWD Debug                  : Enabled 

Waiting for debugger connection...
Debugger connected
STM32 device: program flash memory at address 8000000, length 664
STM32 device: flash programming successful 0x8000000
// ...
// Similarly for the consequent memory addresses... Until the followings
// ...
STM32 device: program flash memory at address 8009158, length 1512
STM32 device: flash programming successful 0x8009140 
Debugger connection lost.
Shutting down...

Interessanterweise habe ich die elf-Datei mit objdump überprüft, das Programm erreicht NICHT 0x08009158; stattdessen stoppt es bei 0x08009152.

Andere wichtige Informationen:

Das Projekt und die Codevorlage wurden mit STM32CubeMX mit dem HAL-Treiber von STM32 generiert. Der Build wurde von der arm-atollic-eabi-gcc-Toolchain durchgeführt, die mit TrueStudio geliefert wird, mit Optionen:

-mthumb -mcpu=cortex-m7 -mfloat-abi=hard -mfpu=fpv5-d16 -std=gnu11 -D__weak=__attribute__((weak)) -D__packed=__attribute__((__packed__)) -DUSE_HAL_DRIVER -DSTM32H743xx -I../Inc -I../Drivers/STM32H7xx_HAL_Driver/Inc -I../Drivers/STM32H7xx_HAL_Driver/Inc/Legacy -I../Drivers/CMSIS/Device/ST/STM32H7xx/Include -I../Drivers/CMSIS/Include -Og -ffunction-sections -fdata-sections -g -fstack-usage -Wall

Die Laufzeitbibliothek ist auf Newlib-Standard eingestellt.

Ich habe kurz die Disassemblierungsdatei der ausführbaren Elf-Datei über objdump durchgesehen, die Gesamtstruktur und die Funktionen der mathematischen Bibliothek sehen gut aus (und laufen korrekt - wieder, außer kann nicht debuggen).

Nach dem Auslösefehler des Debuggers ist seine Sitzung noch am Leben, aber als ich versuchte, das Programm fortzusetzen, landet es in HardFault_Handler (und bleibt dort auch nach dem Zurücksetzen, durch IDE oder den Pin).

Hatte das schon mal jemand oder hat eine Ahnung/Idee für diese Situation? Vielen Dank im Voraus.

Welches Artefakt laden Sie über das externe Tool? Ist es das gleiche wie das, das Ihr Debug-Startskript lädt? Ich denke, standardmäßig lädt der Debugger die .elf-Datei. Wenn Ihr externes Tool also eine .hex-Datei verwendet, könnte dies ein Hinweis sein.
Das Dienstprogramm STM32Programmer akzeptiert alle gängigen Dateiformate. Hier wird .elf verwendet, und es gibt keine anderen Formate von ausführbaren Dateien in meinem Arbeitsbereich, also sollte dies in Ordnung sein. Wenn Sie mathematische Funktionen einfach nicht verwenden, wird alles wieder funktionieren, daher denke ich, dass das Dateiformat hier kein Problem sein sollte.
Es ist möglich, dass etwas an der Struktur Ihrer .elf-Datei, wenn die mathematische Funktion enthalten ist, irgendwo in der Debug-Kette (dem ST-Link gdbserver, Treiber oder sogar der Firmware) einen Fehler auslöst. Starten Sie vielleicht eine Debug-Sitzung, lesen Sie dann den Flash aus und zerlegen/vergleichen Sie ihn mit dem, was Sie nach der Verwendung des externen Tools ausgelesen haben?
Die Verwendung anderer externer Tools, die von ST bereitgestellt werden, um Flash mit einer ausführbaren Datei zu vergleichen, führt zu einem guten Ergebnis. Wahrscheinlich ist es ein Fehler für den Debugger-Treiber oder die Firmware, denke ich. Interessanterweise funktioniert die Debug-Sitzung gut, wenn ich die Math-Lib kompiliert habe, aber nie ausführe (die Lib-Funktion in elf, aber nie aufgerufen wird); aber wenn die mathematische Funktion aufgerufen wird, schlägt die Sitzung am Anfang fehl. Sollte es nur fehlschlagen, wenn die Funktion aufgerufen wird?
Nur um oben Verwirrung zu vermeiden: Wenn ich die integrierte (und mitgelieferte) Debug-Sitzung Atollic verwende und sie aufgrund der Verwendung der mathematischen Funktion (vielleicht?) fehlschlägt, wird der Download nicht einmal abgeschlossen und natürlich ist das Bild auf dem Chip beschädigt . Es wird nur dann als OK verifiziert, wenn die Debug-Sitzung funktioniert.
Wenn die Funktion nicht aufgerufen wird, wird sie wahrscheinlich nicht mit der Ausgabe verknüpft. Und um es klar zu sagen, funktioniert genau die gleiche Elf-Datei mit externen Tools, aber nicht mit „Start Debugging“? Es ist also kein Unterschied zwischen Debug und Release? Vielleicht möchten Sie dies mit Atollic/ST ansprechen oder zumindest in den ST-Foren posten. Es klingt wirklich bizarr.
Ja, es ist genau die gleiche Elf-Datei. Jetzt lege ich dieses Problem einfach beiseite und drucke über den COM-Anschluss, um einige Debugging-Arbeiten durchzuführen ...
Danke für all die tollen Antworten. Irgendwann danach bin ich mit OpenOCD zur GNU ARM-Toolchain gewechselt, seitdem habe ich keine Probleme mit demselben Code gehabt. Ich habe den Eindruck, dass dieses Problem auf einige Fehler in der vorherigen Toolchain zurückzuführen sein könnte.

Antworten (3)

Der Fehler „Fehler in Zeile: 6 in ‚Zielsoftware-Startskripts‘. Bitte bearbeiten Sie die Debug-Konfigurationseinstellungen.“ scheint mehrere Ursachen zu haben. Ich vermute, dass dies die Standardantwort ist, wenn der Befehl „load“ im Debugger-Skript fehlschlägt.

Hier sind zwei Gründe, auf die ich gestoßen bin:

  1. Ein Fehler im FLASH-Speicher in der MCU. Sie können überprüfen, ob dies das Problem ist, indem Sie das STM32 ST-LINK-Dienstprogramm herunterladen und versuchen, den Chip mit Verify zu programmieren.

  2. Der ST-LINK scheint es nicht zu mögen, wenn der USB an einen USB-C / Thunderbolt-Hub angeschlossen wird. Es will direkt an den Computer angeschlossen werden. (Es kann ein paar Mal funktionieren, wenn es an den Hub angeschlossen ist, aber dies kann ein Trick sein, um Sie in Selbstgefälligkeit zu wiegen). In der Vergangenheit habe ich ohne Probleme einen USB 3.0-Hub mit Stromversorgung verwendet, aber das funktioniert möglicherweise nicht mehr mit Truestudio 9.3.1. Übrigens scheint es dem ST-LINK-Dienstprogramm nichts auszumachen, an den USB-C-Hub angeschlossen zu werden.

Sie können den Loader manchmal auch zum Laufen bringen, indem Sie den Code ändern. Ich denke, dies verschiebt nur Bits um den fehlerhaften Speicherort, wenn dies der Fall ist, wird das Problem erneut auftreten.

Eine andere Sache, die Sie versuchen sollten, ist, das Ziel im Bootloader-Modus hochzufahren und dann zu versuchen, es zu programmieren.

Hinzugefügt am 04.02.20: Es scheint auch, dass alles, was im Startcode fehlschlägt, bevor die Ausführung main() erreicht, dies verursachen kann. Dies ist besonders problematisch, wenn Sie C++ verwenden, da Konstruktoren für alle statisch zugewiesenen Instanzen aufgerufen werden, bevor main() aufgerufen wird. Harte Fehler in den Konstruktoren verursachen diesen Fehler in Zeile 6.

Ich habe die Antwort an anderer Stelle gefunden, aber ich werde sie hier für andere wiederholen:

  1. Schließen Sie Atollic TrueStudio (nicht sicher, ob dies erforderlich ist)
  2. Starten Sie das ST-Dienstprogramm
  3. Drücken Sie die Reset-Taste und halten Sie sie gedrückt
  4. Wählen Sie Chip löschen (im Zielmenü)
  5. Lassen Sie die Reset-Taste los
  6. Der Chip wird gelöscht
  7. Schließen Sie das ST-Dienstprogramm
  8. Starten Sie Atollic TrueStudio

Debug sollte jetzt funktionieren

Quelle : Fehler beim Debuggen unter Atollic TrueStudio / STM32

ST-Dienstprogramm: https://www.st.com/en/development-tools/stsw-link004.html

Wenn die CPU im Hard Fault Handler landet, bedeutet dies, dass eindeutig ein offensichtlicher Fehler vorliegt und Sie herausfinden können, welche genaue Anweisung ihn verursacht hat . Sind Sie sicher, dass Sie die FPU aktivieren (oder der Startcode dies tut)?

So macht es Keil http://www.keil.com/support/docs/3716.htm (gcc sollte gleich sein, da die Registernamen gleich sind).