www.mikrocontroller.net

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


Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael G. (linuxgeek) Benutzerseite
Datum:

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

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
also wie gesagt, ich programmier mit µVision von Keil;
Hardware : XC167

Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Kartoffel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Ampfing (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.