Hallo, habe die Aufgabe bekommen auf einem XC167-CI ein paar Tasks(=Methode) laufen zu lassen die sich gegenseitig unterbrechen sollten. Dazu habe ich für die Task mit der kleinsten Periode(höchste Frequenz) einen Timer eingerichtet der nach 5ms überläuft und in dessen Interrupt ich eine Methode aufrufe in der die Aufgaben der Task abgearbeitet werden. Soweit, sogut! Nun sollen noch 4 wetere Tasks dazu kommen die alle in ihrer Periode vielfache der 5ms Task sind. z.B. Regelung alle 20ms, Polling der Taster alle 10ms ... Diese weiteren Tasks sollen innerhalb der 5ms-Task per Software Interrupt angestossen werden. Diese Interrupts erhalten unterschiedliche Prioritäten und deswegen ist es möglich, dass sie sich gegenseitig unterbrechen können. Hab mal etwas nach Software Interrupt gegoogelt. Lese immer was von "Registern auf dem Stack sichern, ISR ausführen, Register restaurieren". Ist es wirklich so "umständlich"? Der XC167 kann das doch bestimmt irgendwie selber alles managen oder!? Und noch ne kleine Frage: Nimmt man für nen Software Interrupt einfach einen freien Interruptvektor der normalerweise für andere Dinge wie z.B. Timeroverflow Interrupt gedacht ist? Gruß, Florian
Florian Halfmann wrote: > Diese weiteren Tasks sollen innerhalb der 5ms-Task per Software > Interrupt angestossen werden. Diese Interrupts erhalten unterschiedliche > Prioritäten und deswegen ist es möglich, dass sie sich gegenseitig > unterbrechen können. Was soll denn das mit den Prioritäten? Ich denke, die Tasks werden zu festen Zeiten (5,10,20ms) aufgerufen. Prioritäten braucht man nur, wenn die Aufrufe zufällig sind (externe Interrupts). Du machst nen 5ms-Interrupt und jede Task kriegt darin nen Countdown-Zähler für ihr Aufrufintervall und gut is. Man muß nicht mit Gewalt Programmiertechniken von großen Betriebssystemen übernehmen wollen. Peter
Hi Peter, das hat was mit Echtzeitfähigkeit zu tun. Es ist auch nicht auf meinem Mist gewachsen sondern von unserem Professor an der Fachhochschule so gefordert. Es gibt z.B. ne Regelung die etwa 13 Millisekunden dauert und alle 20ms aufgerufen wird.. Gleichzeitig ist aber die 5ms Task von höherer Priorität (harte Echtzeitanforderung) und muss die Regelung in diesem Falle dann unterbrechen. Aus diesem Grund brauchen wir bei unserem Projekt Software Interrupts mit verschiedenen Prioritäten. Nur wie das mit dem Software Interrupt funktiuoniert weiß ich immer noch nicht ... Gru0, Florian
Florian Halfmann wrote: > Es gibt z.B. ne Regelung die etwa 13 Millisekunden dauert und alle 20ms > aufgerufen wird.. Gleichzeitig ist aber die 5ms Task von höherer > Priorität (harte Echtzeitanforderung) und muss die Regelung in diesem > Falle dann unterbrechen. Und wo ist das Problem? Der 5ms Timerinterrupt setzt alle 20ms ein Bit und die Mainloop führt dann die Regelung aus. Es ist aber kein gutes Design, wenn man schon zu Beginn weiß, daß die CPU-Auslastung bei minimal 65% liegt. Da hat man kaum noch Luft für Erweiterungen. Ich würde erstmal versuchen, unter 10..20% zu kommen (anderer Algorithmus, schnellerer Quarz, besserer Compiler, andere CPU). Peter
Hey das ging ja flott :) also der Controller läuft mit 40 MHz :) Die Regelung ist auch von ner Fremdfirma vorgegeben und da kann am Algorithmus von uns nix gedreht werden. Es war auch nur ein Besipsiel. Zu den ganzen Tasks kommen noch einige andere dazu. Es ist ZWINGEND gefordert das ganze per Software Interrupts zu lösen. Dient mehr zur Übung als vielleicht Sinn dahinter steckt! also haste da noch nen Tip wie man sowas angeht!? Gruß, Florian
Also die Prioritaeten lassen sich durchaus einbauen, ich weiss allerdings nicht, ob ich von einem Software Interrupt sprechen wuerde. Beim XC167 geht das wie folgt: 1. In der Initialisierung von unbenuetzten Interrupts (davon hat er nun wirklich jede Menge), wird dem 5 ms Interrupt die hoechste Prioritaet gegeben, dem 20 ms Interrupt die niedrigste. Der Interrupt wird dann dadurch eingeleitet, dass nicht der Vektor angesprucngen wird, sonder per Software das Interrupt Request Flag gestzt wird. Jetzt laeuft das ganze mir Hardware Unterstuetzung. Retten der Rueckkehr Adresse und aehnliches wird jetzt von der Hardware uebernommen. Hoffe das macht Sinn fuer Dich, ist schon spaet und ich bin etwas muede. Robert
So, hat alles super funktioniert mit den Interrupts! Anfangs hatte ih nur dass Problem dass meine missbrauchten externen Interrupts ohne das Zutun des Timers immer wieder willkürlich wie von Geisterhand aufgerufen wurden. Das lag aber daran, dass die Pins am Controller in der Luft hingen. Hab sie dann mal auf Ground gelegt und siehe da, alles flutscht wie ne 1 :-) Allerdings muss man mit den Prioritäten der Softwareinterrupts aufpassen. Da kann man schnell in Teufels Küche geraten... Wenns aber mal läuft isses ne echt feine Sache! So kann man in kürzester Zeit ne Menge Aufgaben unterbringen und auch trotzdem noch dafür sorgen dass die Höchstprioren mit der niedrigsten Periode unmittelbar aufgerufen werden und die niedriger Prioren unterbrechen!
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.