Ou comment débugger la séquence de boot ?
jeudi 20 septembre 2007, par patrick Deflandre
Le mapping du composant Atmel at91sam7x est à la fois simple et compliqué. Simple, car il utilise une architecture de type Von Neumann et donc linéaire. Compliqué, car on peut modifier le mapping mémoire par manipulation des bits GPNVM. Cela à l’aide d’instruction ou alors par l’intermédiaire du bus Jtag.
Cet article décrit comment déboguer correctement la séquence de boot.
Les bits GPNVM sont au nombre de 3 et stockés en flash. On peut les modifier par l’intermédiaire du Jtag, mais aussi par l’application à l’aide des commandes Set General-purpose NVM Bit et Clear General-purpose NVM Bit du controleur EFC [1].
bit 0 : active/desactive le BOD [2]
bit 1 : active/desactive le Brownout Reset
bit 2 : modifie le mapping mémoire
Le mapping mémoire est donc en fonction du bit 2 :
GPNVM bit 2 = 0

GPNVM bit 2 = 1

Si le GPNVM bit 2 = 1 la mémoire flash peut donc être accessible à deux adresses : 0x0000 0000 ou 0x0010 0000. De plus le processeur démarre systématiquement à l’adresse 0. On peut donc choisir l’adresse de la phase de linkage pour la flash en fonction des besoins.
Si on link le programme avec comme adresse de flash 0x0010 0000, le programme va d’abord commencé par s’exécuter à l’adresse 0, et continuera ainsi jusqu’au prochain branchement à une adresse absolue. Cela n’arrivera vraisemblablement que lorsque l’on effectue l’appel à la fonction main d’un programme en C. Le programme se déroule normalement, mais il est impossible de déboguer la séquence de boot du microcontroleur.
Si on link en déclarant la flash en 0, on récupère le débogueur symbolique du fichier de boot en assembleur. La lecture en est grandement facilité.
Donc pour résumer, il faut mettre dans le fichier de link de gcc les lignes suivantes :
MEMORY
{
flash : ORIGIN = 0x00000000, LENGTH = 256K
ram : ORIGIN = 0x00200000, LENGTH = 64K
}