Pilotage de la sonde
Depuis gdb, il est possible d'envoyer à la sonde des commandes spécifiques, en les préfixant par monitor (ou mon pour faire plus court) . Voici les commandes les plus utiles pour les sondes JLink :
reset: déclenche un reset hardware du processeur et le maintient en pause.halt: met le processeur en pause.endian little: déclare à la sonde que le processeur est câblé pour être en mode little-endian.
Pour lancer / débugger un programme, une procédure typique serait la suivante (ces commandes ne sont pas à taper tout de suite) :
- Lancer le driver :
JLinkGDBServer -device STM32L475VG -endian little -if SWD -speed auto -ir -LocalhostOnly - Dans un autre terminal, lancer le cross-débugger :
arm-none-eabi-gdb xxx.elf(remplacerxxx.elfpar le nom du programme que vous voulez débugger) - Dire à gdb qu'on fait du débug distant et sur quel port communiquer avec le driver de sonde :
target ext :2331 - Transmettre au driver de sonde la commande disant que le processeur est en mode little-endian :
mon endian little - Remise à zéro le processeur et le maintenir en pause par
mon reset. - Transférer le programme sur la carte :
load(ici, gdb se charge de positionner le PC à l'entry point de votre exécutable si celui-ci en a un) - Lancer l'exécution :
cont - Débugger de façon normale (
sipour avancer d'une instruction assembleur, etc.)
Plutôt que de taper à chaque fois toutes ces commandes, il est préférable de se créer un fichier stm32-4se.gdb (le nom est arbitraire) et de demander à arm-none-eabi-gdb de l'exécuter à chaque lancement, à l'aide de l'option -x stm32-4se.gdb.
set architecture armv7e-m
target ext :2331
mon endian little
mon halt
# TUI interface with asm (disassembled), regs and cmd windows
define split
layout split
layout asm
layout regs
focus cmd
end
# TUI interface with C/ASM *source*, regs and cmd windows
define ssplit
layout split
layout src
layout regs
focus cmd
end
define flash
dont-repeat
mon reset
load
end
# Useful function when the processor is in hardfault to see
# where it comes from.
define armex
printf "EXEC_RETURN (LR):\n",
info registers $lr
if ($lr & 0x4)
printf "Uses PSP 0x%x return.\n", $psp
set $armex_base = (unsigned*)$psp
else
printf "Uses MSP 0x%x return.\n", $msp
set $armex_base = (unsigned*)$msp
end
printf "xPSR 0x%x\n", *($armex_base+7)
printf "ReturnAddress 0x%x\n", *($armex_base+6)
printf "LR (R14) 0x%x\n", *($armex_base+5)
printf "R12 0x%x\n", *($armex_base+4)
printf "R3 0x%x\n", *($armex_base+3)
printf "R2 0x%x\n", *($armex_base+2)
printf "R1 0x%x\n", *($armex_base+1)
printf "R0 0x%x\n", *($armex_base)
printf "Return instruction:\n"
x/i *(unsigned*)($armex_base+6)
print(unsigned*)f "LR instruction:\n"
x/i *(unsigned*)($armex_base+5)
end
document armex
ARMv7 Exception entry behavior.
xPSR, ReturnAddress, LR (R14), R12, R3, R2, R1, and R0
end
❎ Créez le fichier stm32-4se.gdb avec le contenu ci-dessus.
Attention : ce fichier est à comprendre au moins dans ses grandes lignes, surtout si vous comptez suivre SE302 : il faudra l'adapter à vos besoins (vous comprendrez lorsque vous aurez fait la partie sur les IRQ).
Une fois que vous avez ce fichier en place (pensez à le committer), tout ce que vous aurez à faire est, après avoir lancé arm-none-eabi-gdb -x stm32-4se.gdb xxx.elf (où xxx.elf est le programme à exécuter) :
flash, pour charger le programme sur le processeur. Si vous avez défini unENTRYpoint dans votre script de link,gdbpositionne automatiquement le PC à la bonne valeur.contpour démarrer le programme.
❎ Dans votre Makefile, définissez une cible virtuelle qui lance JLinkGDBServer (ou la version graphique) avec les bonnes options.
À partir de maintenant vous devriez avoir, dans un répertoire nommé TD, un Makefile qui permet de lancer JLinkGDBServer, ainsi que le fichier stm32-4se.gdb.