2021/05/17

mbed.os desde línea de comando

Pasos para compilar y debuggear un proyecto mbed desde línea de comando.

 

En el marco de la cursada y el trabajo práctico de la materia Introducción a los Sistemas Embebidos del CEIoT y apoyándome en un documento privado de Sergio Burgos que explica los caminitos para eclipse y STM32CubeIDE, estas son las instrucciones para compilar y debuggear la placa desde línea de comando.

 

¿Qué es mbed os? 

 

mbed os es un sistema operativo de tiempo real para procesadores Cortex-M, que tiene un simpático entorno web de programación muy completito. Lo estoy usando en esa materia para programar una placa NUCLEO-F429ZI de ST con un montón de periféricos, seguí el link si te interesa el detalle.

 

Compilar con gcc

 

Desde tu entorno de mbed exportá el proyecto con toolchain Make-GCC-ARM:


Exportar...
Exportar...

...como Eclipse-GCC-ARM
...como Eclipse-GCC-ARM


Mirá que un blinky pesa 37 MB... ok, esto no es un bare metal, es un sistema operativo entero.

Te deja un comprimido, descomprimilo...

Tomá el Makefile y comentá las siguientes líneas:

ASM_FLAGS += -include$
ASM_FLAGS += /filer/workspace_data/exports/...


o ejecutá el siguiente comando:

sed Makefile -i -e 's/^ASM_FLAGS += -include$//' \
-e 's/ASM_FLAGS += \/filer\/workspace_data\/exports\/.*//'


Instalá con el gestor de paquetes de tu distro o bajate el compilador y openocd.


Si no instalaste con el gestor de tu distribución, buscá donde está dejaste el compilador y agregá su carpeta bin al PATH, por ejemplo para el compilador:

export PATH=$PATH:/home/$USER/bin/gcc-arm-none-eabi-9-2020-q2-update/bin/


Ejecutá make, si te aparece un error como este, probablemente sea por tener un gnu-arm viejo, volvé dos casilleros para atrás:

../mbed-os/platform/cxxsupport/mstd_type_traits:1123:12: error: 'std::is_trivially_copyable' has not been declared  using std::is_trivially_copyable;

Me ocurrió con gcc-arm-none-eabi-4_9-2015q1.

Un ratito despues, varios minutos si es la primera vez, tenés una carpeta BUILD de 55 MB con el resultado,

link: Blinky.elf
arm-none-eabi-objcopy -O binary Blinky.elf Blinky.bin
===== bin file ready to flash: BUILD/Blinky.bin =====
arm-none-eabi-objcopy -O ihex Blinky.elf Blinky.hex



Nos interesa el .bin para grabar en la placa mediante arrastrar a la carpeta que se abre cuando conectás la placa y el .elf para debug.

cp BUILD/Blinky.bin "/media/$USER/NODE_F429ZI"

Si empezás a agregar archivos, vas a tener que tocar el Makefile. Por ejemplo si tuvieras una carpeta con módulos y en esta uno nuevo llamado "alarm":

OBJECTS += modules/alarm/alarm.o

INCLUDE_PATHS += -I../modules/alarm


y opcionalmente

ASM_FLAGS += -I../modules/alarm

 

debug con openocd y gdb: el camino difícil

 

Creá el archivo de configuración en la raiz del proyecto:

cat << EOF > stlink.cfg
source [find interface/stlink.cfg]
source [find target/stm32f4x.cfg]
reset_config srst_only srst_nogate
EOF


Y hasta aquí llegué con el documento. De openocd no sé nada, pero intuyo que si le doy a ese archivo de configuración y lo mismo que eclipse hace por defaut, debería funcionar.

El problema es que eclipse usa pyocd, que aparte de parecer el nombre de un antipiojos, debe hacer lo mismo que openocd.

Como configuración de referencia tengo la del firmware de la edu-ciaa-nxp https://github.com/ciaa/firmware_v3, arrancando por el Makefile:

TARGET=$(OUT)/$(PROGRAM_NAME).elf
OOCD_SCRIPT=scripts/openocd/q

# DEBUG with Embedded IDE (debug)
.debug:
        @echo DEBUG
        $(Q)$(OOCD) -f $(OOCD_SCRIPT) 2>&1

# DEBUG with Embedded IDE (run)
.run: $(TARGET)
        $(Q)$(OOCD) -f $(OOCD_SCRIPT) &
        $(Q)socketwaiter :3333 && arm-none-eabi-gdb -batch $(TARGET) -x scripts/openocd/gdbinit


Siendo el contenido de gdbinit:


target remote :3333
mon arm semihosting enable
mon reset halt
load
continue
quit


Me intriga mucho el socketwaiter

socketwaiter
socketwaiter



La otra es la de la carpeta eclipse-extras, en particular los archivos:

NUCLEO_F429ZI_Blinky_debug.launch
NUCLEO_F429ZI_Blinky_debug_pyocd_settings.launch

que son muy muy parecidos si los mirás con kdiff3.


Tendría que hacer el mapeo entre los valores de eclipse y la sintaxis de la ciaa. O mejor, aprender a usar openocd, una de las mil tareas pendientes que tengo.

¿Por qué, Charli, no te instalás el eclipse, usas su debugger y te dejás de joder? Es que pregunté en un chat si alguien tenía solucionado esto y mientra me llega la respuesta, o me pongo a investigar o me voy a ver la tele y a comer de modo indebido.

Podría instalarme el eclipse y terminar de ver como se manifiestan esos valores de los archivos o incluso ver si me tira pistas en la consola.


¿Por qué, Charli, no buscás la documentación de mbed a ver que dice respecto a openocd? Buena idea, dice, adaptando a mis ubicaciones:

openocd \
  -f /home/carlos/bin/openocd-0.10.0/tcl/board/stm32f429discovery.cfg \
  -f /home/carlos/bin/openocd-0.10.0/tcl/interface/stlink-v2-1.cfg \
  -c init -c "reset init"



se puso a titilar led de programación y además en la terminal apareció lo que debía, vamos bien. Le digo cual es la imagen y le pongo un par de breakpoints:

(gdb) file BUILD/slitherUSBMouse.elf
Reading symbols from BUILD/slitherUSBMouse.elf...done.

(gdb) break Debouncer::checkFall
Breakpoint 2 at 0x800c394: file ../classes/Debouncer.cpp, line 27.
(gdb) break Debouncer::fall
Breakpoint 3 at 0x800c438: file ../classes/Debouncer.cpp, line 44.


y ahora? run?

Don't know how to run.

Revisando como se hace con edu-ciaa-nxp:

(gdb) target remote localhost:3333
(gdb) file BUILD/slitherUSBMouse.elf
(gdb) continue

 

Breakpoint 1, Debouncer::rise (this=0x20006698 <_main_stack+2672>)
at ../classes/Debouncer.cpp:37
37       if (! rising) {

Funciona, recordá que había puesto unos breakpoints, ahora a pelear con el programa. 

Me falta explorar algunas opciones que ví por ahí y no presté atención, como:


  • -c "set mem inaccesible-by-default off"
  • La posibilidad de incorporar las opciones a algún archivo.
  • Meter todo en el Makefile poder hacer make debug, lo cual resolvería el nombre de programa automáticamente.

 

debug con openocd y gdb: el resultado fácil


Ok, necesitás lo resultados y no cómo transitar el proceso:

openocd \
  -f $OPENOCD_PATH/tcl/board/stm32f429discovery.cfg \
  -f $OPENOCD_PATH/tcl/interface/stlink-v2-1.cfg \
  -c init -c "reset init"

En otra ventana:

arm-none-eabi-gdb

(gdb) target remote localhost:3333

(gdb) file BUILD/prog.elf

(gdb) breakpoint class::method

(gdb) continue



No hay comentarios:

Publicar un comentario