Forum: Mikrocontroller und Digitale Elektronik Methodenaufruf aus ISR


von Dominik R. (vision)


Lesenswert?

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...

von Εrnst B. (ernst)


Lesenswert?

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...

von Vollhorst (Gast)


Lesenswert?

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.

von Daniel V. (danvet)


Lesenswert?

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 
:-)

von Martin K. (maart)


Lesenswert?

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.

von Dominik R. (vision)


Lesenswert?

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.

von Udo S. (urschmitt)


Lesenswert?

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.

von Martin V. (oldmax)


Lesenswert?

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
Noch kein Account? Hier anmelden.