Forum: Mikrocontroller und Digitale Elektronik Was passiert wenn keine ISR existiert?


von Markus Steiner (Gast)


Lesenswert?

Hallo Community,

Meine Frage: Was passiert denn eigentlich, wenn ich in einem µC-Programm 
irgendeinen Interrupt enable, und dieser dann eintritt, aber keine ISR 
geschrieben wurde?

MfG
Markus Steiner

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Wenn der Compiler nett ist, ist die IRQ-Tabelle mit RETI initialisiert 
z.B. beim AVR.
Wenn nicht führt er den Code aus und schmiert gegebenenfalls ab.
Welche Controller konkret ?

von Markus Steiner (Gast)


Lesenswert?

Achso, dass dürfte dann meine Frage beantworten. Danke!

von Markus Steiner (Gast)


Lesenswert?

Konkret meine ich den ATtiny441 bzw. ATtiny841 von Atmel

von .. (Gast)


Lesenswert?

In vielen Fällen landet man im Interruptvector bei Eintrag Nr. 0, und 
das ist häufig "Reset"

Wie es wirklich ist, kannst du im Datenblatt bzw. den AN zu deinem µC 
nachlesen.

von (prx) A. K. (prx)


Lesenswert?

Manche Int-Flags werden mit Aufruf einer Dummy-ISR aus RETI gelöscht. 
Dann passiert effektiv nichts. Andere werden das nicht (z.B. I2C, UART). 
Dann wird diese ISR nonstop aufgerufen.

von Markus Steiner (Gast)


Lesenswert?

Und wie verhält sich das dann mit dem Interrupt-Flag, wird dieses auch 
ohne ISR zurückgesetzt (also ich meine wenn der Interrupt enabled ist, 
aber keine ISR vorhanden ist)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

.. schrieb:
> Wie es wirklich ist, kannst du im Datenblatt bzw. den AN zu deinem µC
> nachlesen.

Ist eher eine Software-Frage.  Die avr-libc (die zusammen mit AVR-GCC
meist benutzt wird), initialisiert die Vektortabelle mit einem Eintrag,
dessen Funktion auf Adresse 0 springt, also ähnlich wirkt wie Reset.

Die Idee dahinter ist, dass es immer ein Programmierfehler ist, und
man ihn so am ehesten bemerkt (anders als eine ISR, die nur aus RETI
besteht).

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Markus Steiner schrieb:
> Und wie verhält sich das dann mit dem Interrupt-Flag, wird dieses auch
> ohne ISR zurückgesetzt (also ich meine wenn der Interrupt enabled ist,
> aber keine ISR vorhanden ist)

Speziell für AVR:
Wenn die Routine nur aus einem RETI in der Sprungtabelle besteht ists 
dann halt auch deine ganze Serviceroutine.
Der RETI aktiviert auch wieder das INT-Flag im Statusregister des Core.
Wenn du allerdings so IRQ-Fehler auffangen willst machste dir deine 
eigene Default-ServiceRoutine die z.b. über RS232 meckert.
Technisch gesehen ist dem µC der Begriff ISR unbekannt, er lädt einfach 
nur den Befehl aus der Jump-Tabelle vor dem Eintriff und löscht das 
I-Flag.

von Markus Steiner (Gast)


Lesenswert?

Ok, danke für die ausführlichen Antworten. Ich denke ich habe das jetzt 
verstanden. Ich musste zugegeben erst mal Googlen was RETI bedeutet, da 
ich üblicherweise nur C programmiere ;)

von Thomas E. (thomase)


Lesenswert?

Markus Steiner schrieb:
> Und wie verhält sich das dann mit dem Interrupt-Flag, wird dieses
> auch
> ohne ISR zurückgesetzt (also ich meine wenn der Interrupt enabled ist,
> aber keine ISR vorhanden ist)

Es ist immer eine ISR vorhanden, zumindest beim GCC.
1
00000000 <__vectors>:
2
       0:  0c 94 3e 00   jmp  0x7c  ; 0x7c <__ctors_end>
3
       4:  0c 94 5b 00   jmp  0xb6  ; 0xb6 <__bad_interrupt>
4
       8:  0c 94 5b 00   jmp  0xb6  ; 0xb6 <__bad_interrupt>
5
       c:  0c 94 5b 00   jmp  0xb6  ; 0xb6 <__bad_interrupt>
6
      10:  0c 94 5b 00   jmp  0xb6  ; 0xb6 <__bad_interrupt>
7
      14:  0c 94 c8 03   jmp  0x790  ; 0x790 <__vector_5>
8
...

Da, wo "__bad_interrupt" steht, geht es in die Bad-Interrupt-ISR
1
000000b6 <__bad_interrupt>:
2
      b6:  0c 94 00 00   jmp  0  ; 0x0 <__vectors>

Und da steht dann, dass er wieder von vorne anfangen soll. Das ist aber 
kein Reset. Sondern ein Neustart.

mfg.

von Markus Steiner (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Und da steht dann, dass er wieder von vorne anfangen soll. Das ist aber
> kein Reset. Sondern ein Neustart.

Ist der unterschied zwischen Reset und Neustart, dass beim Neustart der 
RAM nicht gelöscht wird?

von Thomas E. (thomase)


Lesenswert?

Markus Steiner schrieb:
> Thomas Eckmann schrieb:
>> Und da steht dann, dass er wieder von vorne anfangen soll. Das ist aber
>> kein Reset. Sondern ein Neustart.
>
> Ist der unterschied zwischen Reset und Neustart, dass beim Neustart der
> RAM nicht gelöscht wird?

Beim Reset werden alle Register des Controllers mit Default-Werten 
initialisiert. Beim Neustart passiert da gar nichts. Das bedeutet, dass 
z.B. der Stackpointer nicht auf Anfang steht. Das muss dann per Software 
unbedingt initialisiert werden. Gleiches gilt noch mindstens für das 
SREG.

RAM ist Sache des Programmieres.Oder des Compilers.

mfg.

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Ich meine bei einem Reset wird der RAM auch nicht gelöscht.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Dennis Heynlein schrieb:
> Ich meine bei einem Reset wird der RAM auch nicht gelöscht.

Beim Reset selbst nicht, aber vom C-Laufzeitsysem anschließend schon.
Beim Sprung nach Adresse 0 (wie bei bad_isr) allerdings auch.  Nur
die IO-Register werden davon (im Gegensatz zu Reset) nicht berührt.

von Markus Steiner (Gast)


Lesenswert?

Thomas Eckmann schrieb:
> Beim Reset werden alle Register des Controllers mit Default-Werten
> initialisiert. Beim Neustart passiert da gar nichts. Das bedeutet, dass
> z.B. der Stackpointer nicht auf Anfang steht. Das muss dann per Software
> unbedingt initialisiert werden. Gleiches gilt noch mindstens für das
> SREG.

Genau das meinte ich doch, die Register beispielsweise sind doch im RAM, 
oder etwa nicht?

von Thomas E. (thomase)


Lesenswert?

Markus Steiner schrieb:
> Thomas Eckmann schrieb:
>> Beim Reset werden alle Register des Controllers mit Default-Werten
>> initialisiert. Beim Neustart passiert da gar nichts. Das bedeutet, dass
>> z.B. der Stackpointer nicht auf Anfang steht. Das muss dann per Software
>> unbedingt initialisiert werden. Gleiches gilt noch mindstens für das
>> SREG.
>
> Genau das meinte ich doch, die Register beispielsweise sind doch im RAM,
> oder etwa nicht?

Ja. Von der Adressierung her liegen sie unterhalb des RAM und technisch 
ist das auch RAM. Aber das sind eben die Special Function Register, die 
einen definierten Zustand haben müssen. Schliesslich wird damit die 
Peripherie eingestellt.

Unter RAM versteht man gemeinhin den Arbeitsspeicher. Da ist es 
vollkommen egal, was beim Start drinsteht.

mfg.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.