Hallo zusammen, es heisst ja immer, die ISR soll so kurz wie möglich sein, oder? Geht es dabei darum, nur das Interrupt-Flag wieder frei zu geben, oder hat das auch noch irgend welche anderen Gründe? Wenn ich zum Beispiel beim drücken eines Tasters ein Interrupt auslöse, und ich gar nicht möchte, das dieses Interrupt vor Abarbeitung einer bestimmten Methode wieder ausgelöst werden soll, kann ich doch eigentlich in meiner ISR die entsprechende Methode aufrufen und das Flag so lange gesetzt lassen, bis die Methode abgearbeitet wurde, und das Flag erst am Ende löschen, oder? Code Composer nölt immer etwas rum, wenn ich aus einer ISR eine Methode aufrufe, dass ich diese doch besser Inline definieren soll...
Wenn du weißt, wass du machst, und auf was du achten musst, kannst du in deiner IRQ machen was du magst solange du magst. Die Faustregel "So kurz wie möglich" Hilft Anfängern, die schlimsten Fallstricke zu umschiffen. Und bei Fortgeschrittenen ergibt sich das meist von selbst, mit Flag-Setzen-in-IRQ und Lange-Funktion-bei-gesetztem-Flag-aus-Mainloop-starten...
Kann man Code Composer für AVR hernehmen oder benutzt du gar einen anderen µC? "nölt immer etwas rum" ist auch 'ne Aussage. Hilft wohl auch nicht weiter. Und ja, ISRs sollten immer kurz gehalten werden.
Ich hatte mal eine Anwendung, da war es so: TimerInterrupt alle 1ms alles im ASM geschrieben main: while(1); timer_isr: do all the things in 1ms! Das Problem war: Wenn man länger als 1ms in der ISR verbraten hat, dann hat man einen ISR "verschluckt". Und die Motorregelung hat etwas gezickt :-)
Die ISR kann so lange dauern wie sie will, dir müssen nur die Folgen bewusst sein, wenn eine neuer Interrupt ansteht und deine ISR aber nicht darauf reagieren kann, da erst noch der alte Aufruf abgearbeitet wird.
Martin Kreiner schrieb: > wenn eine neuer Interrupt ansteht und deine ISR aber nicht > darauf reagieren kann, da erst noch der alte Aufruf abgearbeitet wird. Genau das ist ja eigentlich das, was ich möchte: Mache auf Tastendruck 'irgend etwas'. Solange 'irgend etwas' dauert, reagiere NICHT auf erneuten Tastendruck. Ach so, es ist ein MSP430 und kein AVR und 'nölt etwas' soll heißen, der Compiler schmeisst eine Warnung, Compiliert wird aber trotzdem. Danke für die Hilfe.
Dominik R. schrieb: > schmeisst eine Warnung Es gibt zum Glück nur genau eine Compilerwarning auf der ganzen Welt für den MSP430 :-) Es gibt meistens noch andere Interrupts, die aber nicht verschluckt werden wollen.
Hi Ich glaub, dem TO ist nicht bewußt, wofür eine ISR erforderlich ist. Tastendrücke gehören in den seltesten Fällen dazu und Aus einer ISR heraus eine Sub-Routine aufrufen, warum nicht, wenn man sich bewußt ist, das u.U. Register nicht gesichert sind. Wenn C alle Register beim Aufruf sichert, mag das gehen, aber wenn nur Register, die in der ISR auftauchen sicher sind, gibt's evtl. böses Fehlverhalten. Die Subroutine gehört dann nämlich zur ISR, mit allen daraus folgenden Konsequenzen. Der Grund, warum eine ISR kurz und schmerzlos sein soll liegt im Wort "Interrupt". Das ist ein Ereignis, welches zu jeder Zeit ausgelöst werden kann. Damit kein solches Ereignis verloren geht, muss eine ISR vor Auftreten eines neuen Ereignisses fertig bearbeitet sein. Eine Timer-ISR ist ein gutes Beisiel dafür. SChafft die ISR nicht, in der mSek fertig zu werden, geht ein Interrupc verloren. Ein einziger wär ja nicht so schlimm, aber wie oft sowas vorkommen könnte, liegt selten in der Macht des Programmierers und dadurch läuft dann z. B. eine Uhr halt nicht genau. Gruß oldmax
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.