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
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 ?
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.
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.
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)
.. 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).
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.
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 ;)
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.
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?
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.
Ich meine bei einem Reset wird der RAM auch nicht gelöscht.
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.
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?
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.