2024-07-08
한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina
Kürzlich habe ich festgestellt, dass nach dem Zusammenführen einiger Codes auf anderen Plattformen in STM32 ein Absturzproblem aufgetreten ist. Daher wollte ich die Prinzipien zur Behebung von Absturzproblemen auf STM32 insgesamt klären.
Das Obige ist eine Information zum Absturzdruck. Nach einer Untersuchung wurde festgestellt, dass die Timer-Stack-Tiefe von FreeRTOS zu klein eingestellt war nicht rechtzeitig veröffentlicht, und schließlich kam es zu einem Absturz.
Lassen Sie uns über den Timer in FreeRTOS sprechen. Er kann tatsächlich als eine Aufgabe verstanden werden, die dem Erstellen eines Threads zum Halten der Zeit und dem anschließenden Abfragen und Abfragen der aktuellen Timer-Liste entspricht, um herauszufinden, welche Timer-Laufzeit abgelaufen ist Es.
Daher muss auch die vom Timer verwendete Speichergröße konfiguriert werden.
R0~R12 sind Allzweckregister
R13 ist der Stapelzeiger, und physikalisch gibt es zwei Stapelzeiger:Der Hauptstapelzeiger (MSP) ist der Standardstapelzeiger, der nach dem Zurücksetzen und im Verarbeitungsmodus des Prozessors zur Verwendung ausgewählt wird. Der andere Stapelzeiger ist der Prozessstapelzeiger (PSP), der nur im Thread verwendet werden kann Modus (wenn ein RTOS vorhanden ist) )
R14 ist das Verbindungsregister (LR), das zum Speichern der Rücksprungadresse beim Aufruf einer Funktion oder Unterroutine verwendet wird. Am Ende der Funktion oder Unterroutine kann die Programmsteuerung zum aufrufenden Programm zurückkehren, indem der Wert von LR in den Programmzähler (PC) geladen und die Ausführung fortgesetzt wird. Während der Ausnahmebehandlung wird LR automatisch auf einen speziellen EXC_RETURN (Ausnahmerückgabe) aktualisiert ) Wert.
Zum Beispiel wird b aufgerufen. Zu diesem Zeitpunkt wird die Adresse der b-Unterfunktion in den PC-Zeiger und die Adresse von a in den LR eingefügt. Nachdem b ausgeführt wurde, wird die Adresse von a in den LR eingefügt der PC-Zeiger zur Ausführung.
Ein Absturz im Arm ist eigentlich ein abnormaler Interrupt. Wenn der Interrupt auftritt, speichert der Prozessor den aktuellen Aufgabenstatus im Stapel.
Stapelrahmen
Stack Frame bezieht sich auf einen Speicherbereich, der zum Speichern von Funktionsparametern, lokalen Variablen, Rücksprungadressen und anderen Informationen während eines Funktionsaufrufs verwendet wird.
Wenn eine Funktion aufgerufen wird, weist STM32 ihr einen Stapelrahmen zu. Die Größe des Stapelrahmens hängt von Faktoren wie der Anzahl der Parameter, der Anzahl lokaler Variablen und den Optimierungseinstellungen des Compilers ab.
Durch die Kombination der obigen Informationen können wir wissen, dass wir, wenn wir herausfinden möchten, welche Funktion beim Absturz der Funktion abgestürzt ist, den Stapelrahmen finden müssen, der beim Auslösen des Ausnahmeinterrupts auf den Stapel geschoben wurde, und dieser Stapelrahmen befindet sich im R13 (Stapelpunkt) Stapelzeiger.
Wir finden einen Weg, den Inhalt abzurufen, auf den der Zeiger des R13-Registers in der Absturzbehandlungsfunktion HardFault_Handler() zeigt, und ihn dann auszudrucken.
Der STM32-Mikrocontroller verwendet den ARM Cortex-M-Kern, der über zwei Stapelzeiger verfügt, einen ist der Hauptstapelzeiger (MSP) und der andere ist der Prozessstapelzeiger (PSP).
MSP (Hauptstapelzeiger): Der Hauptstapelzeiger wird hauptsächlich für den Betriebssystemkernel oder die Interrupt-Serviceroutine verwendet.
PSP (Prozessstapelzeiger): Der Prozessstapelzeiger wird hauptsächlich von Benutzeranwendungen verwendet.
Wenn der Cortex-M-Kern in den Thread-Modus zurückkehrt, kann er je nach Einstellung des CONTROL-Registers wieder zum Hauptstapelzeiger MSP oder zum Prozessstapelzeiger PSP wechseln.
PSP speichert Kontext im Zusammenhang mit der laufenden Benutzeranwendung. Berücksichtigen Sie insbesondere Folgendes:
一些或全部的通用寄存器的值,这些寄存器在用户程序运行时会使用。
Program Counter(PC):指向下一条将要执行的指令。
Processor Status Register(PSR)的值:包含标志位状态。
Stapelzeiger: Speichert die Position des vorherigen Stapelrahmens.
Normalerweise werden diese Informationen beim Wechseln von Aufgaben (oder Kontextwechseln) im Stapel gespeichert. Wenn eine neue Aufgabe gestartet wird, werden ihre Kontextinformationen vom Stapel wiederhergestellt.
Es ist zu beachten, dass der spezifische gespeicherte Inhalt je nach spezifischer Planungsstrategie und Betriebssystemdesign variieren kann.
Bestimmen Sie den Wert des LR/PC-Zeigers
Zuerst müssen wir feststellen, ob RTOS verwendet wird. Wenn ja, sollten unsere Absturzinformationen in der PSP gespeichert werden.
Wir müssen diese Informationen zuerst auslesen. Nachdem wir die Werte von LR und PC kennen, können wir den Absturzpunkt über Debug in keil5 finden oder den entsprechenden Absturzpunkt über die während des Kompilierungsprozesses generierte Kartendatei finden.
Klicken Sie mit der rechten Maustaste in das Disassembly-Fenster –