Atollic STM32H7 + ST-LINK Error al escribir datos en flash con biblioteca matemática

Actualmente estoy trabajando en un chip STM32H743VIT6 (en una placa de diseño propio), con la cadena de herramientas Atollic TrueStudio (ver. 9.0.0), usando un depurador ST-LINK en una placa STM32F4-Discovery (versión de firmware ST-LINK V2J31S0 ).

Cuando intento depurar mi programa dentro del IDE de TrueStudio, me arroja el siguiente error:

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

Error writing data to flash

El script de inicio del depurador es simplemente predeterminado:

# 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

Como todo funciona bien hace un tiempo, traté de revertir mi código y descubrí que una línea de código en particular causa el problema.

#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
}

Escribí la función anterior con la intención de probar la funcionalidad de la biblioteca matemática en la MCU STM32H7. Si cambio return sin(rad);a algo sin funciones de math lib, por ejemplo return rad;(pero no return cos(rad);), todo vuelve a funcionar bien . Aquí está la única aparición de funciones de la biblioteca matemática.

Con la biblioteca matemática involucrada (por ejemplo, manteniendo el código no depurable original return sin(rad);), el proyecto sigue siendo perfectamente compatible y el programa compilado funciona como se espera si cargo el ejecutable con otras herramientas, digamos STM32CubeProgrammer, o simplemente presiono Ctrl+F11 dentro del IDE (Configuré el comando Ejecutar con la CLI de STM32CubeProgrammer). En otras palabras, todo lo demás está bien, excepto que no se puede depurar .

Revisé más a fondo el registro del depurador y me da esto:

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...

Curiosamente, revisé el archivo elf con objdump, el programa NO llega a 0x08009158; en cambio, se detiene en 0x08009152.

Otra información relevante:

El proyecto y la plantilla de código se generó con STM32CubeMX, con el controlador HAL de STM32. La compilación se realizó mediante la cadena de herramientas arm-atollic-eabi-gcc enviada con TrueStudio, con opciones:

-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

La biblioteca de tiempo de ejecución está establecida en el estándar Newlib.

Revisé brevemente el archivo de desmontaje del archivo elf ejecutable a través de objdump, la estructura general y las funciones de la biblioteca matemática se ven bien (y se ejecutan correctamente, nuevamente, excepto que no se puede depurar).

Después del error de lanzamiento del depurador, su sesión aún está activa, pero cuando traté de continuar con el programa, termina en HardFault_Handler (y permanece allí incluso después del reinicio, por IDE o el pin).

¿Alguien ha experimentado esto antes, o tiene alguna pista/idea para esta situación? Gracias de antemano.

¿Qué artefacto está cargando a través de la herramienta externa? ¿Es el mismo que carga el script de inicio de depuración? Creo que, de manera predeterminada, el depurador carga el .elf, por lo que si su herramienta externa usa un archivo .hex, eso podría ser una pista.
La utilidad STM32Programmer acepta todos los formatos comunes de archivos. Aquí está usando .elf, y no hay otros formatos de ejecutables en mi espacio de trabajo, por lo que debería estar bien. Además, simplemente no usar las funciones matemáticas hará que todo vuelva a funcionar, así que creo que el formato del archivo no debería ser un problema aquí.
Es posible que algo en la estructura de su .elf cuando se incluye la función matemática esté desencadenando un error en algún lugar de la cadena de depuración (el servidor gdb de ST-Link, el controlador o incluso el firmware). ¿Quizás iniciar una sesión de depuración, luego leer el flash y desmontar/comparar con lo que leyó después de usar la herramienta externa?
El uso de otras herramientas externas proporcionadas por ST para verificar el flash contra el archivo ejecutable me da un buen resultado. Probablemente sea un error del controlador o del firmware del depurador, supongo. Curiosamente, si tengo la biblioteca matemática compilada pero nunca la ejecuto (la función lib dentro de elf pero nunca llamada), la sesión de depuración funciona bien; pero si se llama a la función matemática, la sesión falla al principio. ¿Debería fallar solo cuando se llama a la función?
Solo para evitar la confusión anterior: si uso la sesión de depuración integrada (y enviada con) Atollic y falla debido al uso de la función matemática (¿quizás?), la descarga ni siquiera se completará y, por supuesto, la imagen en el chip está dañada . Se verifica que está bien solo si la sesión de depuración funciona.
Si no se llama a la función, es probable que no se vincule a la salida. Y para ser claros, ¿el mismo archivo elf funciona con herramientas externas pero no con 'Iniciar depuración'? Entonces, ¿no es una diferencia de Debug vs Release? Tal vez quiera plantear esto con Atollic/ST, o al menos publicar en los foros de ST. Suena realmente extraño.
Sí, es exactamente el mismo archivo elfo. Ahora dejo de lado este problema e imprimo a través del puerto COM para hacer un trabajo de depuración...
Gracias por todas las excelentes respuestas. Algún tiempo después de esto, pasé a la cadena de herramientas GNU ARM con OpenOCD, desde entonces no he tenido ningún problema con el mismo código. Siento que este problema podría deberse a algunos errores en la cadena de herramientas anterior.

Respuestas (3)

El error "Error en la línea: 6 en 'Secuencias de comandos de inicio del software de destino'. Edite los ajustes de configuración de depuración". parece tener múltiples causas. Supongo que es la respuesta predeterminada cuando falla el comando 'cargar' en el script del depurador.

Aquí hay dos razones por las que me he encontrado:

  1. Una falla en la memoria FLASH en la MCU. Puede verificar que este es el problema descargando la utilidad STM32 ST-LINK e intentando programar el chip con verificar.

  2. Al ST-LINK parece no gustarle que el USB se conecte a un concentrador USB-C / Thunderbolt. Quiere ser conectado directamente a la computadora. (Puede funcionar algunas veces conectado al concentrador, pero esto puede ser una estratagema para adormecerte). En el pasado, usé un concentrador USB 3.0 con alimentación sin problemas, pero es posible que ya no funcione con Truestudio 9.3.1. Por cierto, a la utilidad ST-LINK no parece importarle estar conectada al concentrador USB-C.

A veces también puede hacer que el cargador funcione cambiando el código. Creo que esto solo mueve bits alrededor de la ubicación de memoria incorrecta, si este es el caso, el problema volverá a aparecer.

Otra cosa que puede intentar es encender el objetivo en modo 'cargador de arranque' y luego tratar de programarlo.

Agregado el 4/2/20: También parece que cualquier cosa que falle en el código de inicio antes de que la ejecución llegue a main() puede causar esto. Esto es especialmente problemático si está utilizando C ++, porque se llama a los constructores para todas las instancias asignadas estáticamente antes de que se llame a main(). Las fallas graves en los constructores causarán este error en la línea 6.

Encontré la respuesta en otro lugar, pero la repetiré aquí para otras personas:

  1. Cierre Atollic TrueStudio (no estoy seguro si es necesario)
  2. Utilidad ST de inicio
  3. Presione el botón Reset y manténgalo presionado
  4. Seleccione Borrar chip (en el menú Destino)
  5. Suelte el botón Restablecer
  6. El chip se borra
  7. Cerrar utilidad ST
  8. Inicio Atollic TrueStudio

La depuración debería funcionar ahora

fuente: error al usar la depuración en Atollic TrueStudio / STM32

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

Si la CPU termina en el controlador de fallas, significa que claramente hay una falla obvia y puede averiguar qué instrucción exacta la causó . ¿Está seguro de que está habilitando la FPU (o el código de inicio lo hace)?

Así es como lo hace Keil http://www.keil.com/support/docs/3716.htm (gcc debe ser el mismo, ya que los nombres de los registros son los mismos).