Sollten immer alle Fallen definiert sein?

18

Ich habe jetzt zwei Fälle mit dsPIC 30F4013 gesehen, in denen der Controller aufgrund einer undefinierten Falle zurückgesetzt wurde. Warum diese Fallen überhaupt aufgetaucht sind, ist immer noch ein Rätsel, aber das ist nicht meine unmittelbare Frage. Ich fange an zu denken, dass es eine gute Programmierpraxis wäre, immer alle Traps zu definieren, auch wenn Traps niemals auftreten sollten, sodass ich zumindest eine eindeutige Fehlermeldung anstelle eines zufälligen Zurücksetzens erhalte. Ist dies eine Standardpraxis, die ich nicht kenne? Gibt es Nachteile bei dieser Vorgehensweise, die ich berücksichtigen sollte?

Stephen Collings
quelle
4
Keine Antwort auf Ihre Frage, aber ich litt vor einiger Zeit unter solchen Symptomen auf dsPIC- und PIC24-Systemen. In meinem Fall ergaben sich die Traps aus Codebits, in denen ich die Verweise auf 16-Bit-Werte aufgehoben hatte, und diese Zeiger selbst hatten ungerade (nicht gerade) Werte, da sie in einen kreisförmigen Kommunikationspuffer zeigten - und ich hatte keine vorherige Art und Weise zu wissen, ob der 16-Bit-Wert an einer ungeraden oder geraden Grenze beginnen würde. Der XC16-Compiler schützt Sie hier nicht vor dem Absturz der Hardware. Am Ende habe ich ein Wrapper-Makro für diese Funktionen geschrieben, das 2 8-Bit-Pointer-De-Refs erzwang.
brhans

Antworten:

13

Meine informelle Regel lautet:

  1. Wenn ein Interrupt aktiviert ist, sollten Sie über Code verfügen, der ihn verarbeitet.
  2. Wenn Sie keinen Code für einen Interrupt schreiben, deaktivieren Sie ihn.
  3. Wenn Sie es nicht deaktivieren können, schreiben Sie Code dafür.

Auch ohne diese Regel beantwortet das Datenblatt Ihre Frage explizit:

Wenn der Benutzer im Falle eines Trap-Fehlerzustands keine Korrekturmaßnahmen ergreifen möchte, müssen diese Vektoren mit der Adresse eines Standard-Handlers geladen werden, der lediglich den RESET-Befehl enthält. Wenn andererseits einer der Vektoren, die eine ungültige Adresse enthalten, aufgerufen wird, wird eine Adressfehlerfalle erzeugt.

( Quelle , Abschnitt 8.3, erste Anmerkung)

Da Sie keine Fallen maskieren können, müssen Sie mit ihnen umgehen. Wenn Sie die Falle nicht auf bestimmte Weise behandeln möchten, müssen Sie eine RESETAnweisung ausführen .

Adam Davis
quelle
Jep. Ich habe ein Standardmodul mit Zielen für alle Fallen.
Olin Lathrop
16

Ja, es ist eine gute Idee - der einzige Nachteil ist die zusätzliche Codegröße, und Sie müssen entscheiden, was mit der Falle geschehen soll (eine Meldung über die serielle Schnittstelle ausgeben? Eine "FAILED" - Anzeige einschalten? Stiller Neustart usw.) )

pjc50
quelle
4
Ich habe in der Regel nur den Prozessor in einer Endlos-NOP / GOTO-Schleife ausgeführt. Auf diese Weise wurde der Stapel aus der Falle nicht beschädigt, und beim Debuggen habe ich die Möglichkeit, ihn zu entwirren und herauszufinden, was passiert ist. Ich bekomme nicht oft Traps, aber in 80% der Fälle handelt es sich um eine ungerade Adressenfalle, normalerweise, weil Müll als Zeiger geladen wurde. Manchmal wird der Stapelzeiger beschädigt und führt zu ungeraden Adress-Traps. Diese sind schwerer zu debuggen, da der Stack nicht mehr vorhanden ist. Zum Glück ist das sehr selten.
Olin Lathrop