Forum: Mikrocontroller und Digitale Elektronik Arten, wie ein Interrupt generiert wird


von Kartoffel (Gast)


Lesenswert?

Hi zusammen,
die Frage steht sozusagen im Betreff.
So wie ich mitbekommen habe, gibt es mehrere Arten, wie ein Interrupt 
generiert wird. Die eine Methode ist wohl schneller als die andere und 
hat mit Kontext Kopie zu tun.
Wenn man unter µVision programmiert und Programmblöcke teilweise mit 
Dave bildet, da steht bei der Funktion für das Interrupt "using 
RB_LEVEL.. ".
Durch das Auskommentieren von dieser Zeile schaltet man angeblich 
zwischen den Methoden um.
Weiß einer was das für Methoden sind und worin die sich unterscheiden?

Danke im vorab

von Michael G. (linuxgeek) Benutzerseite


Lesenswert?

Toller Beitrag... und wir sollen jetzt erraten, um welche Hardware und 
welche Plattform es sich hier handelt, ja?

von Kartoffel (Gast)


Lesenswert?

also wie gesagt, ich programmier mit µVision von Keil;
Hardware : XC167

von Ampfing (Gast)


Lesenswert?

Hi,

using hat aber nix mit der 'Interruptgenerierung' zu tun, sondern mit 
der ISR.
Beim C167 gibt es ein Feature, mit dem man den kompletten Registersatz 
an eine andere Adresse im RAM legen kann. Das hat den Vorteil, dass man 
nicht alle Register, die man in der ISR verwendet und die alten Werte 
wieder braucht auf den Stack sichern braucht.
Und dieses Feature benutzt Du, wenn Du hinter die ISR ein 'using' setzt.

Viele Grüße

von Kartoffel (Gast)


Lesenswert?

ich hab schon irgendwo gelesen, dass man dann nur den Context Pointer 
sichern braucht, aber wieso muss man die Register dann nicht auf den 
Stack sichern?

von Ampfing (Gast)


Lesenswert?

Hi,

also, nochmal.
Die Register werden über einen Pointer referenziert. Ist ein spezielles 
Register (den Namen kann ich Dir leider nicht sagen, könnte aber der 
ContextPointer sein).
Wenn Du also z.B. R1 benutzt wird der Offset von R1 auf den Wert des 
Pointers dazu addiert und diese Stelle ist R1.
Wenn Du jetzt diesen Pointer auf eine andere Adresse zeigen lässt (mit 
Hilfe von using), so hast Du einen anderen Registersatz, der nicht die 
Werte des alten Satzes beinhaltet und diese damit auch nicht 
überschreiben kann.
Deswegen brauchst Du auch die Register nicht auf den Stack sichern, da 
deren Inhalt nicht überschrieben 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
Noch kein Account? Hier anmelden.