Was passiert wenn keine ISR existiert?

Moderator Persönliche Seite #3967257
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).
Persönliche Seite #3967258
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.
#3967268
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.
#3967280
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.
Gast #3967286
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?
#3967288
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.

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.