Die Sache mit den Interrupts sind kein Problem, nur wie kann ich ihnen unterschiedliche Prioritäten geben? ...soll heißen z.B. INT5 vor INT1.
Welcher Controller? AVR? Geht dort nicht. Die Prioritäten beim AVR sind fest. Außerdem vermute ich, dass du sowieso 'ne falsche Vorstellung davon hast, was die Prioritäten genau tun. Ist übrigens überhaupt nicht GCC-spezifisch...
>INT5 vor INT1
Machbar wäre es aber, oder!?
z.B indem man das globale I-Flag im INT1 setzt. Natürlich ist dies
nicht schön und kann zu unüberschaubaren Problemen führen. Außerdem
müßte man alle anderen Interrupts, die man nicht benötigt deaktivieren.
Zudem kann der INT5 auch nur einmal in der INT1 aufgerufen werden, es
sei denn, man setzt das I-Flag mehrmals. Aufpassen müsste man auch mit
den Rücksprungadressen, welche sich im Stack unkontrolliert vermehren,
sollte man nicht mit einem ordentlichen "reti" zurückkehren.
Grüße
Ich benutze den ATMega128 mit WinAVR. Ist es wirklich nicht möglich die Interrupts a la Daisy Chain zu priorisieren?? Das kann ich mir nicht vorstellen. Ist es des weiteren möglich im Ablauf einer Interrupt Service Routine die globalen Interrupts mit cli() zu verbieten? Hat bei mir nicht geklappt! Danke
> Ist es wirklich nicht möglich die Interrupts a la Daisy Chain zu > priorisieren? Ja, ist es nicht. > Das kann ich mir nicht vorstellen. Es gibt halt Dinge zwischen Himmel und Erden, die sich unserer Vorstellungswelt entziehen. ;-) Typischerweise wird eine solche Priorisierung nur von denjenigen vermisst, die zuvor 8051 programmiert haben... Der AVR ist schnell genug, man packt einfach das Notwendigste in die ISR, damit wird die hinreichend kurz. Dann setzt man ein Flag, und lässt den Rest in aller Ruhe in der main loop ausführen. > Ist es des weiteren möglich im Ablauf einer Interrupt Service > Routine die globalen Interrupts mit cli() zu verbieten? Nein, ist es nicht -- die sind nämlich bereits verboten. Lass mich raten, willst du etwa mit einem externen Interrupt einen (mechanischen) Taster abfragen? Das tut man nicht. Die Dinger prellen so sehr, dass du das sowieso in Software tiefpassfiltern musst, da kannst du die ganze Abfrage dann auch gleich in den Timerinterrupt verlagern. Ansonsten Grundregel #1 für externe Interrupts: in der ISR als Allererstes mal den Interrupt selbst verbieten. Damit ist sichergestellt, dass er nicht bei immer noch anhängiger Interruptbedingung zu schnell hintereinander wieder aufgerufen wird.
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.