Gast
#3967237
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
|
Anzeige
|
Was passiert wenn keine ISR existiert?
Gast
#3967237
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 ?
Gast
#3967244
Achso, dass dürfte dann meine Frage beantworten. Danke!
Gast
#3967246
Konkret meine ich den ATtiny441 bzw. ATtiny841 von Atmel
Gast
#3967247
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.
Gast
#3967254
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.
Gast
#3967267
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.
Da, wo "__bad_interrupt" steht, geht es in die Bad-Interrupt-ISR
Und da steht dann, dass er wieder von vorne anfangen soll. Das ist aber kein Reset. Sondern ein Neustart. mfg.
Gast
#3967270
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.
Gast
#3967286
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. Antwort schreibenBitte melde dich an, um einen Beitrag zu schreiben. |
Anzeige
|