El script de inicio de GCC Ride7 STM32 no entra en la función SystemInit

2

Somos una asociación de robótica de ENSEIRB-MATMECA (Burdeos, Francia). Estamos desarrollando algunos tableros y un proyecto de plantilla para dispositivos STM32.

Uno de nuestros tableros incorpora un microcontrolador STM32F103C4. Usamos el script de inicio de gcc ride7 startup_stm32f10x_ld.s.Este script de inicio funciona hasta que se alcanza la línea "bl SystemInit". Entonces, el sistema no salta a la función SystemInit () como se espera que haga, y el cargador de arranque está escuchando nuevamente (restablecer).

Aquí está la instrucción de enlace:

/home/kevin/ausbee-test/Software/Toolchain/arm-none-eabi/bin/arm-none-eabi-gcc -o /home/kevin/ausbee-test/Software/output/project.elf -mthumb -mcpu=cortex-m3 -Wall -Wextra -mcpu=cortex-m3 -mfix-cortex-m3-ldrd -mthumb-interwork -DSTM32F10X_LD -Wl,--gc-sections -Wl,--Map=test.map  -T/home/kevin/ausbee-test/Software/System-CM3/link.ld /home/kevin/ausbee-test/Software/System-CM3/CMSIS/CM3/DeviceSupport/ST/STM32F10x/startup/gcc_ride7/startup_stm32f10x_ld.o /home/kevin/ausbee-test/Software/System-CM3/CMSIS/CM3/CoreSupport/core_cm3.o /home/kevin/ausbee-test/Software/System-CM3/CMSIS/CM3/DeviceSupport/ST/STM32F10x/system_stm32f10x.o /home/kevin/ausbee-test/Software/Project/src/main.o

El archivo test.map contiene el símbolo SystemInit.

Utilizamos la cadena de herramientas incorporada GCC ARM ( enlace ). Nuestro proyecto de plantilla funciona con otros dispositivos como STM32f105.

¿Tienes alguna idea de dónde viene este error?

Gracias de antemano.

    
pregunta KevJ

2 respuestas

0

¿Verificaste el valor del puntero de tu pila?

También tuve este problema una vez y se debió a que el script de inicio de mi depurador JTAG configuró el puntero de pila a una dirección que no era válida para el microcontrolador utilizado. Especialmente en su caso, esto parece ser un posible problema ya que el STM32F103 tiene menos RAM que algunos microcontroladores STM32F105, lo que significa que si su depurador JTAG configura el puntero de la Pila a por ejemplo 0x2000fffc , podría funcionar perfectamente en el STM32F105 y bloquearse en el STM32F103 . Tendría el mismo efecto exacto si su secuencia de comandos de vinculador no establece el tamaño de pila correctamente (esto debería ser de 6 o 10 kbytes en el STM32F103C4).

Normalmente (ejecutándose sin el depurador) el valor del puntero de pila debe ser el primer valor de sus vectores de restablecimiento, que también es igual a "_estack" (este valor se establece en su script de vinculador, verifique el archivo link.ld ). Cuando se ingresa la función SystemInit , los parámetros se insertan en la pila. La instrucción de inserción provocará un error grave si el puntero de pila apunta a una dirección que no puede ser anulada.

Para investigar esta posibilidad con gdb, debe usar "stepi" en lugar de paso para ejecutar solo una instrucción de ensamblaje a la vez, también puede verificar el valor del puntero de pila con "registro de información".

Buena suerte / Bonne chance ;-)

    
respondido por el Étienne
0

Muchas gracias Etienne. El problema fue que mi script de vinculador era para un dispositivo específico pero no para baja densidad y el autor hizo _estack estático (valor codificado) en lugar de dinámico: tuve que reemplazar:

_estack = 0x20010000;

por

_estack = ORIGIN(RAM) + LENGTH(RAM);

¡Y ahora funciona!

Si estás interesado en nuestro proyecto: enlace

Es un poco desordenado y solo para fines de prueba y aprendizaje.

Gracias de nuevo / merci encore;)

    
respondido por el KevJ

Lea otras preguntas en las etiquetas