DSO Nano/Qemu gdb
Ejecutando código STM32 en el emulador qemu
Con el emulador qemu puedes ejecutar y depurar código ARM ¡sin necesidad de un procesador ARM real! Puedes cargar el código en el emulador, conectar el depurador gdb y avanzar paso a paso. Por supuesto, los periféricos, temporizadores y otros componentes del microcontrolador no serán emulados, pero es útil para verificar parte del código. Necesitarás ejecutar qemu-system-arm
, que forma parte del proyecto QEMU. En Debian/Ubuntu está incluido en el paquete qemu-system
(o qemu-kvm-extras
en versiones antiguas).
Compilando qemu-system-arm (opcional)
Si no existen paquetes para tu sistema o la versión empaquetada es anterior a la 0.13, se recomienda compilarlo tú mismo:
wget [http://download.savannah.gnu.org/releases/qemu/qemu-0.13.0.tar.gz](http://download.savannah.gnu.org/releases/qemu/qemu-0.13.0.tar.gz)
tar xzf qemu-0.13.0.tar.gz
cd qemu-0.13.0
./configure --disable-kvm --enable-debug --target-list=arm-softmmu --audio-card-list= --audio-drv-list=
make
Ahora puedes ejecutarlo directamente desde la carpeta arm-softmmu
, a menos que quieras instalarlo en, por ejemplo, /usr/local/bin
.
Nota sobre soporte STM32
El microcontrolador STM32 en el DSO Nano usa un núcleo ARM Cortex-M3. El qemu-system-arm
no conoce la distribución de ROM (flash) del STM32. En particular, no lee el vector de pila y reset desde la dirección 0x08000000. Pero si tu archivo ELF designa correctamente el manejador de reset como punto de entrada, lo usará como dirección inicial. Sin embargo, deberás configurar manualmente el puntero de pila (sp).
Iniciar el emulador
Inicia el emulador qemu y su servidor interno gdb (opción -s), cargando tu archivo ELF como "kernel":
qemu-system-arm -cpu cortex-m3 -S -s -singlestep -nographic -m 513 -kernel dso-lib.elf
La opción "-m 513" crea un espacio de memoria que incluye las direcciones RAM 0x2000000 del STM32.
Inicia gdb (el de tu toolchain ARM) y conéctalo al emulador qemu:
arm-none-eabi-gdb dso-lib.elf
(gdb) target extended-remote localhost:1234
(gdb) set $sp = 0x20005000
(gdb) where
Ahora puedes comenzar a avanzar paso a paso por el programa, aquí algunos ejemplos
(gdb) display/i $pc
(gdb) stepi
(gdb) next
(gdb) break main.c:23
(gdb) x/16wx 0x20000000
(gdb) cont
(gdb) info reg
(gdb) info variables
(gdb) print *pProperty
Enlaces
Soporte técnico y discusión de productos
Si tienes algún problema técnico, por favor envía tu consulta a nuestro foro.
¡Gracias por elegir nuestros productos! Estamos aquí para brindarte diferentes opciones de soporte y asegurar que tu experiencia con nuestros productos sea lo más fluida posible. Ofrecemos varios canales de comunicación para atender distintas preferencias y necesidades.