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.elf
par 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 (
si
pour 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 se203.gdb
(le nom est arbitraire) et de demander à arm-none-eabi-gdb
de l'exécuter à chaque lancement, à l'aide de l'option -x se203.gdb
.
set architecture armv7e-m
target ext :2331
mon endian little
mon halt
# interface with asm, regs and cmd windows
define split
layout split
layout asm
layout regs
focus cmd
end
# interface with C source, regs and cmd windows
define ss
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 MSP 0x%x return.\n", $MSP
set $armex_base = $MSP
else
printf "Uses PSP 0x%x return.\n", $PSP
set $armex_base = $PSP
end
printf "xPSR 0x%x\n", *($armex_base+28)
printf "ReturnAddress 0x%x\n", *($armex_base+24)
printf "LR (R14) 0x%x\n", *($armex_base+20)
printf "R12 0x%x\n", *($armex_base+16)
printf "R3 0x%x\n", *($armex_base+12)
printf "R2 0x%x\n", *($armex_base+8)
printf "R1 0x%x\n", *($armex_base+4)
printf "R0 0x%x\n", *($armex_base)
printf "Return instruction:\n"
x/i *($armex_base+24)
printf "LR instruction:\n"
x/i *($armex_base+20)
end
document armex
ARMv7 Exception entry behavior.
xPSR, ReturnAddress, LR (R14), R12, R3, R2, R1, and R0
end
❎ Créez le fichier se203.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 se203.gdb xxx.elf
(où xxx.elf
est le programme à exécuter) :
flash
, pour charger le programme sur le processeur. Si vous avez défini unENTRY
point dans votre script de link,gdb
positionne automatiquement le PC à la bonne valeur.cont
pour 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 se203.gdb
.