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) :

  1. Lancer le driver : JLinkGDBServer -device STM32L475VG -endian little -if SWD -speed auto -ir -LocalhostOnly
  2. Dans un autre terminal, lancer le cross-débugger : arm-none-eabi-gdb xxx.elf (remplacer xxx.elf par le nom du programme que vous voulez débugger)
  3. Dire à gdb qu'on fait du débug distant et sur quel port communiquer avec le driver de sonde : target ext :2331
  4. Transmettre au driver de sonde la commande disant que le processeur est en mode little-endian : mon endian little
  5. Remise à zéro le processeur et le maintenir en pause par mon reset.
  6. 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)
  7. Lancer l'exécution : cont
  8. 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) :

  1. flash, pour charger le programme sur le processeur. Si vous avez défini un ENTRY point dans votre script de link, gdb positionne automatiquement le PC à la bonne valeur.
  2. 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.