Partage de technologie

Dépannage des problèmes de crash du STM32

2024-07-08

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Préface

Récemment, j'ai découvert qu'après avoir fusionné certains codes sur d'autres plates-formes dans STM32, un problème de crash s'était produit, j'ai donc voulu régler globalement les principes de dépannage des problèmes de crash sur STM32.

1. Description du problème

Insérer la description de l'image ici
Ce qui précède est une information d'impression en cas de crash. Après enquête, il a été constaté que la profondeur de la pile du minuteur de FreeRTOS était trop petite. Il y avait trop de contenu en cours d'exécution dans la fonction d'exécution du minuteur et la mémoire demandée par chaque variable locale était trop petite. n'a pas été publié à temps et un crash s'est finalement produit.

Parlons du minuteur dans FreeRTOS. Cela peut en fait être compris comme une tâche, ce qui équivaut à créer un fil pour conserver le temps, puis à interroger et à interroger la liste de minuteurs actuelle pour savoir quelle durée d'exécution du minuteur a expiré. il.

Par conséquent, la taille de la mémoire utilisée par le temporisateur doit également être configurée.

2. Registres de STM32 (noyau Cortex M4)

Insérer la description de l'image ici
R0 ~ R12 sont des registres à usage général

R13 est le pointeur de pile, et physiquement il existe deux pointeurs de pile :Le pointeur de pile principal (MSP) est le pointeur de pile par défaut, qui sera sélectionné pour être utilisé après la réinitialisation et lorsque le processeur est en mode traitement ; l'autre pointeur de pile est le pointeur de pile de processus (PSP), qui ne peut être utilisé que dans le thread ; mode (quand il y a un RTOS) )

R14 est le registre de liaison (LR), utilisé pour enregistrer l'adresse de retour lorsqu'une fonction ou un sous-programme est appelé. À la fin de la fonction ou du sous-programme, le contrôle du programme peut revenir au programme appelant en chargeant la valeur de LR dans le compteur du programme (PC) et poursuivre l'exécution. Pendant la gestion des exceptions, LR sera automatiquement mis à jour vers un EXC_RETURN spécial (retour d'exception). ) valeur.

Par exemple, a appelle b.À ce moment, l'adresse de la sous-fonction b est placée dans le pointeur PC et l'adresse de a est placée dans le LR. Après l'exécution de b, l'adresse de a est placée dans le pointeur PC. du LR pour exécution.

3. Analyse des problèmes de crash

3.1 D'où proviennent les informations sur les accidents ?

Un crash dans le bras est en fait une interruption anormale. Lorsque l'interruption survient, le processeur enregistre l'état actuel de la tâche dans la pile.

  • cadre de pile
    Insérer la description de l'image ici
    Stack Frame fait référence à une zone mémoire utilisée pour enregistrer les paramètres de fonction, les variables locales, les adresses de retour et d'autres informations lors d'un appel de fonction.

    Lorsqu'une fonction est appelée, STM32 lui alloue un cadre de pile. La taille du cadre de pile dépend de facteurs tels que le nombre de paramètres, le nombre de variables locales et les paramètres d'optimisation du compilateur.

    En combinant les informations ci-dessus, nous pouvons savoir que si nous voulons savoir quelle fonction s'est écrasée lorsque la fonction s'est écrasée, nous devons trouver le cadre de pile qui a été poussé sur la pile lorsque l'interruption d'exception a été déclenchée, et ce cadre de pile se trouve dans le R13. (Point de pile) pointeur de pile stocké.

    Nous trouvons un moyen de faire pointer le contenu par le pointeur du registre R13 dans la fonction de gestion des crashs HardFault_Handler(), puis nous l'imprimons.

3.2 La signification de chaque mot-clé dans les informations sur l'accident

Le microcontrôleur STM32 utilise le cœur ARM Cortex-M, qui possède deux pointeurs de pile, l'un est le pointeur de pile principal (MSP) et l'autre est le pointeur de pile de processus (PSP).

MSP (Pointeur de pile principal): Le pointeur de pile principal est principalement utilisé pour le noyau du système d'exploitation ou la routine de service d'interruption.

PSP (pointeur de pile de processus): Le pointeur de pile de processus est principalement utilisé par les applications utilisateur.

Lorsque le cœur Cortex-M revient en mode Thread, il peut revenir au pointeur de pile principal MSP ou au pointeur de pile de processus PSP selon le réglage du registre CONTROL.

PSP stocke le contexte lié à l'application utilisateur en cours d'exécution. Incluez spécifiquement les éléments suivants :

一些或全部的通用寄存器的值,这些寄存器在用户程序运行时会使用。

Program Counter(PC):指向下一条将要执行的指令。

Processor Status Register(PSR)的值:包含标志位状态。

Pointeur de pile : enregistre l'emplacement du cadre de pile précédent.

Habituellement, lors du changement de tâche (ou du changement de contexte), ces informations seront enregistrées dans la pile. Lorsqu'une nouvelle tâche démarre, ses informations contextuelles seront restaurées à partir de la pile.

Il convient de noter que le contenu spécifique enregistré varie en fonction de la stratégie de planification spécifique et de la conception du système d'exploitation.

3.3 Utiliser les informations sur le crash pour trouver le point qui a provoqué le crash

Déterminer la valeur du pointeur LR/PC
Insérer la description de l'image ici
Nous devons d'abord déterminer si RTOS est utilisé. Si tel est le cas, nos informations de crash doivent être stockées dans la PSP.
Nous devons d'abord lire ces informations, puis après avoir connu les valeurs de LR et PC, nous pouvons trouver le point de crash via Debug dans keil5 ou trouver le point de crash correspondant via le fichier de carte généré pendant le processus de compilation.
Insérer la description de l'image ici

3.4 Comment trouver les points problématiques en fonction des adresses dans keil5

Faites un clic droit dans la fenêtre Démontage—