Provoquer un hardfault sur Cortex M

Je travaille sur des micro-contrôleurs Cortex M3 et M4 de chez ST Microelectronics (STM32f2 et STM32f4). J’avais besoin ces jours-ci pour des tests de générer simplement et manière fiable des hardfaults. Voici un code qui fait le job (au moins sur STM32f2) :

char * killer = (char*)(0x0800000 - 1);
printf("*killer= %c\n", *killer);
*killer = 42;
printf("now, *killer= %c\n", *killer);

En fait, les 2 lignes du bas sont inutiles, ça crashe déjà lors de la lecture à l’adresse pas bonne. Pourquoi elle est pas bonne d’ailleurs cette adresse ? Parce que la mémoire flash interne commence à l’adresse 0x0800000… Notez que j’ai essayé d’accéder en lecture et écriture à l’adresse 0 mais que ça ne provoque pas d’erreur. Je n’ai pas cherché pourquoi en revanche.

Publicités

Une Réponse

  1. En 0 il y a un mirroir de la ROM (ou de la RAM) qui sert pour le vecteur de boot et les autres interruptions. Donc, pas d’erreur. écrire en ROM ne fait pas de hardfault, c’est juste ignoré.

    Du coup, un pointeur NULL ne provoque pas de plantage!
    Deux façons de corriger:
    – définir NULL à une valeur autre que 0, qui déclenche une hardfault. C’est autorisé par le C mais ça casse plein de code du genre if(!pointeur)…
    – protéger la zone en 0 contre la lecture en utilisant la MPU (memory protection unit). Il faudra d’abord remapper le vecteur d’interrupt ailleurs (on peut le pointer par exemple au « vrai » début de la flash), sinon toutes les interruptions déclencheront une fault… qui elle même a besoin du vecteur d’interrupt! C’est très chiant à debugger, et en plus, certaines sondes jtag ont du mal à récupérer le CPU dans ce cas…

    J'aime

    18 décembre 2013 à 8:50

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s