Forum: Mikrocontroller und Digitale Elektronik XC167 Software Interrupts


von Florian H. (viper2000)


Lesenswert?

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

von Florian H. (viper2000)


Lesenswert?

push

von Peter D. (peda)


Lesenswert?

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

von Florian H. (viper2000)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

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

von Florian H. (viper2000)


Lesenswert?

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

von Robert Teufel (Gast)


Lesenswert?

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

von Florian H. (viper2000)


Lesenswert?

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