Guten tag, Ich würde gerne wissen wie man einen bestimmten Interrupt mit einem Call befehl und ohne Call befehl aufrufen kann. Mit freundlichen grüßen
Was verleitet Dich zur Ansicht, Interrupts wären etwas, was man mit "Call befehlen" aufrufen könnte?
A. K. schrieb: > Erklär mal, was du wirklich willst. Daß jemand anderer seine Hausaufgaben für ihn macht :)
Rufus Τ. F. schrieb: > Was verleitet Dich zur Ansicht, Interrupts wären etwas, was man mit > "Call befehlen" aufrufen könnte? Man kann es, nur wozu ?
Marc V. schrieb: > Man kann es, nur wozu ? Vielleicht, um den Inhalt der Interruptroutine ausnahmsweise "außer der Reihe" auszuführen, indem man es durch einen eigenen Aufruf "mit Gewalt" erzwingt? Das ist eine Sache, die ich mir gut vorstellen kann. MfG Paul
Wobei ein "Return from Interrupt" Nebenwirkungen haben kann, die man bei Aufruf als Unterprogramm ohne HW-Beteilugung nicht haben will.
Am einfachsten du schreibst 2 Funktionen. Eine ganz normale Funktion macht die ganze Arbeit. Die Interrupt-Routine hat nur 2 Zeilen. Den Aufruf der normalen Funktion und das return-from-interrupt.
Und andersherum: sich in einer ISR befinden, ohne dass die anderen Interrupts das wissen/gesperrt sind. Beim AVR z.B. läuft im Normalfall nur eine einzige ISR, die nicht unterbrochen werden kann (kann theoretisch schon, wenn man es will). Gibt ganz schnell ziemliches Chaos...
Paul B. schrieb: > Vielleicht, um den Inhalt der Interruptroutine ausnahmsweise "außer der > Reihe" auszuführen, indem man es durch einen eigenen Aufruf "mit Gewalt" > erzwingt? Das ist eine Sache, die ich mir gut vorstellen kann. Und dabei von einem anderen Interrupt ( vielleicht noch von sich selbst) unterbrochen wird ? EDIT: Ansonsten gibt es natürlich noch die Möglichkeit, durch setzen der bits im entsprechenden IFR (Interrupt Flag Register) den Interrupt manuell zu triggern. Das ware dann wohl der zweite Fall, nämlich ohne CALL.
Ohne "CALL"? - Da erwartet man ein Ereignis. Zufälligerweise ist das der eigentliche Sinn von Interrupts. Mit "CALL"? - Ob das bei allen µCs geht, weiß ich nicht. Aber bei AVRs sollte ein CALL kein Problem sein. Das RETI am Ende setzt allerdings das globale Interrupt-Enable-Flag. Will man das nicht haben, muss dem "CALL" ein DI folgen. (Warum? Nützt das immer?) Dritte Möglichkeit: Man PROVOZIERT (wenn möglich) im Programm, dieses Ereignis. Allerdings dürfte dies niemandem helfen, der hiermit trotz Desinteresse Punkte holen möchte...
Wie bereits gesagt, es ist so einfach das Problem zu umgehen, dass es schon fast lächerlich ist. ISR(Vectorname) { HauRein (); } void HauRein (void) { }
Wobei der GCC entweder haurein() in die ISR inlined und dann 2x hat, denn ISR und Funktionsaufruf haben unterschiedliche Regeln für die Registersicherung, oder aber in der ISR wegen Funktionsaufruf alle Register sichert. Wenn die ISR also schnell sein muß, oder RAM/Stack knapp ist, keine gute Idee.
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.