Al emitir GDB 'continuar' en la RAM, ¿puedo escribir en las direcciones desde las cuales continúo?

1

Estoy escribiendo algunos programas de prueba para conocer el STM32F4 (ARM Cortex M4). La placa de desarrollo que estoy usando tiene U-Boot preinstalado en flash. Cuando la placa está en funcionamiento y U-Boot muestra su indicador de comando,

  1. Me estoy conectando con OpenOCD + GDB a través de JTAG
  2. cargar mi imagen binaria en la RAM (OpenOCD: load_image )
  3. restablecer la CPU (OpenOCD: reset init )
  4. y configura la PC en la ubicación que deseo ejecutar (GDB: set $pc=0x2000001d )
  5. y ejecute (GDB: continue )

El problema

La mayoría de las veces esto funciona bien. Sin embargo, varias veces tuve el problema de que cuando la CPU está en estado de FUNCIONAMIENTO, de repente, OpenOCD muestra este mensaje:

Error: jtag status contains invalid mode value - communication failure
Polling target stm32f4x.cpu failed, GDB will be halted. Polling again in 100ms

Si mi observación es correcta, esto solo sucede cuando

  1. Estoy reiniciando la placa de desarrollo con el botón de reinicio
  2. y escribiendo algo en el indicador de U-Boot que aparece en ese momento.

Cuando en lugar de U-Boot algún otro programa está presente en flash, este problema no parece ocurrir.

Mi suposición

Actualmente, estoy asumiendo que esto se debe a que U-Boot escribe en la ubicación de RAM desde la que se emitió el comando continue . No sé cómo continue funciona exactamente, pero mi teoría es que este comando afecta a la circuitería de depuración de alguna manera y, por lo tanto, escribir en esa dirección RAM está causando problemas.

Cuando mi otro programa está presente en flash, todo funciona bien. Incluso pulsar el botón de reinicio funciona. Creo que es porque su espacio de memoria es muy pequeño, por lo que 0x2000001d no se ve afectado.

Mis preguntas

  1. ¿Qué está haciendo exactamente continue ? ¿Es algo más que simplemente configurar la CPU en modo de ejecución? ¿Afecta a los puntos de ruptura de alguna manera?
  2. ¿Mi suposición que expliqué arriba es plausible?
pregunta Multisync

1 respuesta

1
  

Estoy reiniciando la placa de desarrollo con el botón de reinicio

No hagas eso mientras OpenOCD se está ejecutando. En su lugar, use los comandos OpenOCDs reset halt o reset run .

El botón de reinicio afectará el estado de depuración interno del objetivo, pero OpenOCD puede no detectarlo correctamente, dependiendo del depurador que uses y de cómo esté conectado.

Tenga en cuenta que debe hacer reset init antes que cargue el binario a flash.

    
respondido por el Turbo J

Lea otras preguntas en las etiquetas