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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren