Question

J'ai un projet intégré à l'aide d'un STM32F103 (ARM Cortex M3), il devient un temps en temps obtenir faute dure en mode de libération. Dans le cadre de la reprise, je voudrais récupérer la valeur de PC d'avant la faute dur et le stocker pour le débogage plus tard dans la batterie région soutenue.

Comment pourrais-je déterminer la valeur du compteur de programme au moment de la faute dure? De toute évidence, le PC est maintenant fixé à son emplacement dans l'interruption hardfault.

Où dois-je regarder? Il y une adresse pour la banque de registre en mode normal?

Merci!

Était-ce utile?

La solution

Cortex-M3 utilise un modèle tout à fait différent de la gestion des exceptions du bras « classique », par exemple il n'a pas « abort mode » mentionné dans l'autre poste. Je vous suggère de lire cette note d'application . Par exemple, pour le défaut dur:

  

La valeur de SCB-> BFAR indique l'adresse de mémoire qui a provoqué une erreur de bus   et est valable si le BFARVALID bit dans le registre SCB-> CFSR est réglé. le   valeur de SCB-> MMFAR indique l'adresse de mémoire qui a causé une mémoire   Défaut de gestion et est valide si le bit MMFARVALID dans le SCB-> CFSR   le registre est défini.

Pour déterminer la valeur de PC au moment d'exception dont vous avez besoin d'examiner la pile; le processeur pousse R0-R3, R12, PC et LR avant d'exécuter le gestionnaire. La pile peut être utilisée soit principale (si le bit 2 de LR est égal à 0) ou le procédé (autrement). Voir page 13 de la note d'application pour plus de détails.

Autres conseils

Vous devriez regarder dans le Manuel ARM architecture de référence dans le section sur les exceptions. Vous devez vous enregistrer pour l'obtenir.

Généralement, une adresse correspondante sera mise dans le registre de liaison LR (R14), mais la signification précise varie en fonction de l'exception, et il y a des décalages variables.

W.r.t. accéder à l'utilisateur / mode de banque de registre système, je pense que vous devez changer le mode pour y accéder.

Si une exception se produit, le changement d'état du processeur à partir de l'état actuel de la abort état. Dans l'état d'interruption les déplacements du processeur pour utiliser un nouvel ensemble de registres pour sp et de gauche à droite (sp_abt et sp_lr respectivement. Pour une donnée avorter, l'instruction fautive peut être trouvée dans lr_abt + 8 pour un préfet environ en lr_abt + 4 (selon le manuel de référence ARMv7 Architecure)

J'ai une FAQ sur ce thème. La page liée à de la FAQ inclut le code de gestionnaire de défaut qui obtenir le compteur de programme de la pile pour vous.

J'ai trouvé une cause commune de ces questions sont les retards « pour la boucle ». Lors de l'utilisation -O3 ils sont optimisés simplement loin si vous ne parlez pas des variables volatiles. Personnellement, je préfère l'approche sysTick.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top