Wie kann ich Debuggen, unerwartete Neustarts in einer STM32-Gerät?
Ich bin etwas Entwicklung in C mit einer STM32F107 chip und, irgendwann, wird das Gerät begann zurückgesetzt, wenn ich eine bestimmte Funktion. Ich habe keinen debugger und meine Debuggen ist einfach nur text über die serielle Schnittstelle.
Habe ich einige andere mikrocontroller, in dem ich war in der Lage, den Zugriff auf ein register, um zu sehen, die Ursache für den reset, aber ich kann nicht scheinen zu finden, ein äquivalent für dieses Gerät. Ich bin mir bewusst, dass der hardware-Ausnahmen von der Cortex-M3, aber ich weiß nicht, wenn einer von Ihnen ausgelöst wird, da ich kann nicht scheinen, um text senden über usart wenn ich innerhalb dieser Handler (vielleicht, weil mein TX-Funktionen verwenden Unterbrechungen?).
So, ich beschloss zu Fragen, die Menschen mit mehr Erfahrung als ich in diesem Gerät: was ist in der Regel getan, um debug-Situationen wie diese?
BEARBEITEN
Einer der Entwickler aktiviert die WWDG watchdog und es war zurücksetzen der hardware, bevor ich könnte meine info aus der fault-Handler. Es war ein Harter Fehler durch aufrufen einer Funktion durch einen Zeiger, der zeigt an die falsche Stelle. Allerdings halte ich diese Frage, in der Hoffnung, dass jemand mehr verraten (oder material) für den Hinweis an C-code aus den Registern gespeichert in, sagen wir, ein schwerwiegender Fehler (@dwelch Idee).
InformationsquelleAutor ivarec | 2012-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Der Cortex-M3 verfügt über exzellente Fehler-handling-Funktionen, die Ihr Leben einfacher machen wird. Beim Auftreffen auf einen Fehler, wird Sie automatisch stapeln mehrere Register wie PC und LR, und Fehler-status-Register wird Sie Dinge sagen wie die Adresse von bus-Störung, etc.
Sollten Sie implementieren eine gute fault handler (z.B. die hard fault handler hier: http://blog.frankvh.com/2011/12/07/cortex-m3-m4-hard-fault-handler/) zum drucken der gestapelten Register-und debug-Fehler-status-Register.
Sollten Sie mit dem UART für Druck -, schreib einfach deine eigene einfache benutzerdefinierte version von printf für die Verwendung von Ihrem fault handler, hängt nicht von interrupts. Schreiben Sie einfach bytes direkt an uart Tx data register und Umfrage für byte-Abschluss.
InformationsquelleAutor TJD
Abgesehen von dem, was bereits erwähnt wurde, über den interrupt-Handler für das Debuggen, einige ST micros haben auch einen reset-Quelle registrieren, Lesen Sie auf power-up (nach einem reset). Für die cortex-M-Familie (m0/m3/m4) in das register ist RCC_CSR. http://www.st.com/web/en/resource/technical/document/reference_manual/DM00031020.pdf
Leider ist Sie nicht in der Lage sein zu wissen, ob die Besonderheiten, wie schwer die Schuld, aber würde es Ihnen sagen, wenn der watchdog (Fenster oder unabhängige) hatte ausgelöst.
InformationsquelleAutor embeddedninja
Gegeben, dass Sie don ' T haben einen debugger, ich würde vorschlagen, dass finden Sie einige Peripherie des Mikrocontrollers zu helfen. Vielleicht haben Sie eine LED-Sie können Umschalten, oder eine einfache GPIO-pin, der nicht verwendet wird, können Sie Haken bis zu ein Oszilloskop. Wenn Sie schaltet den GPIO pin ziemlich langsam (nicht schneller als 1 Hz und vielleicht langsamer, je nach meter), können Sie verwenden Sie ein Voltmeter statt ein Anwendungsbereich. Den code zum Umschalten der LED-oder GPIO-pin in jedem der exception-Handler eine zu einem Zeitpunkt bis Sie es aufspüren. Wenn Sie mehr als einen GPIO-pin zur Verfügung, kann man den Prozess beschleunigen. Sie können auch schreiben Sie ein wrapper für die spezifische Funktion, die den reset auslöst. Die wrapper-Funktion senden Sie eine Liste der interrupts aktiviert sind kurz vor dem brechen-Funktion ausgeführt wird. Auf diese Weise müssen Sie nicht haben, um Zeit zu verschwenden-Tests diejenigen, die nicht aktiviert sind.
Einer der Vorteile von GPIO-pins, in diesem Fall Sie don ' T benötigen einen interrupt. Am besten ist es bleiben Sie Weg von etwas, das erfordert einen interrupt (wie deine USART in diesem Fall). Wenn der reset wird verursacht durch eine höhere Priorität Ausnahme der debugging-code wird niemals ausgeführt.
Ist es auch üblich, dass der reset wird verursacht durch einen nicht initialisierten Zeiger. Ein Funktionszeiger auf null gesetzt würde, die Ausführung Aussehen viel wie ein reset. Wenn dies der Fall ist, ist die USART-Initialisierung-code ist wahrscheinlich der ausgeführt wird, bevor ein byte vollständig übertragen durch den USART zu machen, müsste die USART nutzlos wie ein debugging-tool in diesem Fall.
InformationsquelleAutor semaj
Wenn Sie sagen, zurücksetzen, ich denke, in Bezug auf Sie auf die reset-Vektor, nicht einer der interrupts oder Handler. Sagen Sie, dass es in der Tat zurückgesetzt, den chip und starten Sie Ihre software immer wieder oder werden Sie sagen, dass es irgendwo hängen? oder haben Sie die Vektor-Tabelle zeigen auf die reset-Vektor?
Wie Sie Vorgehen, hängt davon ab, was Sie wirklich sehen, die Sie benötigen, um deutlicher zu sein oder spezifisch, oder vielleicht möchten Sie helfen, herauszufinden, dass heraus.
Normalerweise habe ich die Karte nicht verwendete Vektoren auf eine einfache hängen Zeile code, welche Zweige zu sich. Später kann ich zuordnen, einige von Ihnen zu richtigen code.
den cortex-m sehr angenehm ist, können Sie in C-code. Wenn Sie denken, Sie werden immer eine Ausnahme haben es Punkt für Punkt routine, schnappt sich etwas, dass Ihnen hilft, herauszufinden, in welchem Modus Sie sich befinden, wird der link registrieren haben könnte, die info, oder eine csr-irgendwo -, print -, out-und in einer endlos-Schleife. Füllen Sie die ungenutzten Teile der Vektor-Tabelle mit der Adresse, an diese generische debug-Funktion.
Von dort aus müssen Sie, um herauszufinden, warum Sie schlagen, die Ausnahme, es könnte so etwas wie ein unaligned Zugriff zum Beispiel. Es könnte sein, dass Sie einen interrupt generiert, wenn Sie versuchen zu initalize ein Gerät vor dem vollständigen Aufbau des hf-wer weiß.
Bearbeiten Ihre Frage mit mehr Antworten oder Informationen, wie Sie arbeiten, durch diese.
InformationsquelleAutor old_timer
Die "richtige" Sache zu tun, ist leider nicht praktikabel, mit einem STM32. Das wäre eine große Ausnahme-handler, der Kenntnis von dem Quellcode, und können entspannen Sie den Stapel und geben Sie den vollständigen call stack und der Zeilennummer, die Ursache der Störung. Dies würde erfordern das hinzufügen der debug-Informationen aus Ihrer Anwendung in den flash-Speicher des STM32, und das ist nicht praktikabel.
Gibt es Möglichkeiten der Täuschung der IDE manchmal geben Sie den call-stack. Ich würde Ihnen die details, aber ich vergaß, Sie aufzuschreiben, so das ich vergessen habe. Ich denke, es muss manuell die änderung der stack-pointer von einem shadow-Registers in ein anderes.
Dem, was ich normalerweise tun ist, um einen Haltepunkt an der hard fault exception-Vektor, und betrachten Sie dann alle Register, wenn der break-Punkt trifft. Betrachten Sie forensische Beweise von einem Mord, ausgeführt mit Plastik-Sprengstoff. Die Werte der Register werden Ihnen Ideen. Register Werte, die beginnen mit 0x20000000 sind RAM-Adressen. Register Werte, die beginnen mit 0x08000000-Flash-Adressen. Öffnen Sie den disassembler und geben Sie diese Adressen. Es wird wahrscheinlich gehen Sie direkt auf die variable oder Funktion an diesen Speicherorten. Wenn das nicht hilft, dann schauen Sie auf den stack-pointer. Blick auf die Speicherplätze auf der stack-Zeiger, und führen Sie den gleichen trick. Ich habe immer genug gefunden Granatsplitter um die Lage der Funktion, wo die exception passiert war.
InformationsquelleAutor Mark Lakata
Können Sie folgenden code verwenden, zum Debuggen.
Fügen Sie auch diese als gut.
Ich bin mit diesem zu dem Wert des Registers, bevor er in den hardfault. Sie können auch hinzufügen, mehr Register, wenn Sie mögen.
InformationsquelleAutor Dheeraj Kumar