Ermittlung der interrupt vector nr im ISR default handler

OP #3014179
Lesenswert?
• ▲
▼
Hallo zusammen,

ich arbeite mit dem ATXmega256 und versuche zu debug Zwecken einen
nicht implementierten Interrupt abzufangen und die Info auszugeben.
1
// catch unexpected interrupt
2
ISR(__vector_default) 
3
{
4
  // todo: eval vector nr ? 
5
  int vecNr = ...?
6

7
  // debug output via uart on hyperterminal
8
  logText( "Error: Vector Source: %d", vectNr );
9

10
  while( 1 ); // stop
11
}

Ich würde gerne die interrupt vector table nr des Verursachers 
ermitteln.
Kann man feststellen um welchen interrupt es sich handelt?

Mfg,
Andy
Moderator Persönliche Seite #3014208
Lesenswert?
• ▲
▼
Dafür benutzt man den Befehl COME FROM. :-)

Nein, standardmäßig geht das nicht.  Entweder mit einem kleinen
Script alle unbelegten Vektoren ermitteln und dann kleine Stubs
schreiben lassen, die die Vektornummer in einer globalen Variablen
hinterlegen.

Alternativ eine Kopie von gcrt1.S ziehen und in dein Projekt mit
einbinden.  In dieser Kopie machst du einen CALL statt eines JUMP,
und in der gerufenen Routine ermittels du die Rückkehradresse auf
dem Stack.
#3014214
Lesenswert?
• ▲
▼
... und im Regelfall auch nicht notwendig.

Denn man schreibt sowieso kein Programm als monolithischen Klotz, der 
das erste mal getestet wird, wenn die 5000 Zeile Marke erreicht ist.

Arbeitet man sich sukzessive von 0 weg die Leiter hinauf, in dem man 
Modul um Modul hinzufügt und möglichst bald mit Testen anfängt, dann ist 
der nicht behandelte Interrupt praktisch immer im Zusammenhang mit der 
zuletzt hinzugefügten Komponente in Verbindung zu bringen. D.h. in der 
Praxis ist es nicht so schlimm, wie es zuerst scheint. Man weiß schon 
ziemlich genau, welche Interrupts für den Fehler in Frage kommen.
OP #3014234
Lesenswert?
• ▲
▼
Es geht mir nur um die Möglichkeit einer weiteren Debug Information.

Es könnte vom Nutzen sein, z.B. falls zwei grössere Projekt-branches 
ge-merded werden müssen und es dabei zu Fehlern kommt, die zur laufzeit 
auftreten. Dafür sollte es eine generische Lösung geben, ohne jeden 
vector handler zu definieren.

Vor allem aber wollte ich einfach erfahren, ob der XMega grundsätzlich 
die Möglichkeit bietet. In der Spec habe ich nichts gefunden :-(
Eigentlich bin ich davon Ausgegangen, dass die vector nr info in einem 
Register abgelegt ist.
Gast #3015698
Lesenswert?
• ▲
▼
Andreas K. schrieb:
> Ich würde gerne die interrupt vector table nr des Verursachers
> ermitteln.
> Kann man feststellen um welchen interrupt es sich handelt?

Gegenfrage: Wer sollte diesen Interrupt freigeben?

Mein Ansatz wäre:
Das IEN (Interrupt Enable) in einer Methode kapseln.
Die Methode und die zugehörige ISR (Interrupt Service Routine) gehören 
in ein Modul, welches die HW-Funktion (UART, SPI, Timer etc.) kapselt.
-> Ohne Modul kein IEN
-> Mit Modul hat's auch immer die ISR

Ausnahme:
Traps und Non Maskable Interrupt (NMI)
-> Diese immer implementieren

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.