www.mikrocontroller.net

Forum: Compiler & IDEs Interrupt soll register aendern (inlineassembler)


Autor: Markus Gross (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Ich stehe vor folgendem Problem:

Ich habe eine sehr zeitkritische nichtterminierende Schleife in meinem
C-Code in Inlineassembler programmiert. Die Parameter der Schleife
haengen von einigen Registern ab. Nun will ich mittels Interrupt ein
kleines Programm aufrufen, welches diese Register modifiziert.
Leider klappt das nicht, denn mit dem Ende der interruptroutine werden
alle Rgister der urspruenglichen Funktion wieder hergestellt...

Hat jemand eine Idee oder ein Loesungsansatz...

Markus
Markus

Autor: Michael Wilhelm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Registerinhalte in Variable kopieren und im Schleifendurchlauf nicht
auf Register, sondern auf die Variablen reagieren.

MW

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Register dürfen natürlich dann nicht auf dem Stack "gerettet"
werden (push/pop).
Bei C-Variablen benutzt man für solche Sachen auch
"volatile"-vereinbarte Variablen.

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du kannst die Interruptroutine als naked deklarieren dann werden keine
register gesichert.
Trotzdem würde ich lieber nochmal die Programmstruktur überdenken...

Autor: Markus Gross (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke schon mal fuer die Tips...

Die Routine ist wirklich zeitkritisch, so dass jeder weitere Befehl die
Performance erheblich schmaelern wuerde...

Ueber Naked routinen hab ich auch schon nachgedacht, aber ich glaube
dann wird auch nicht die Returnadresse gespeichert.
Kann man eine Variabele auf ein Register legen und diese dann
"volatile" deklarieren ???

Wolfram hat wohl recht, ich denke schon die ganz Zeit darueber nach,
wie man das am besten loest... aber im Moment faellt mir nichts
besseres ein...

Gruss,
Markus

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
was heisst zeitkritisch?
Wenn man in einer Hochsprache schreibt, verwendet man Timer für
zeitgenaue Aktionen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du kannst Variablen als register definieren:
typedef unsigned char  u8;

register u8 PCMSumA0 asm("r3");
register u8 PCMSumA1 asm("r4");
register u8 PCMValA0 asm("r5");
register u8 PCMValA1 asm("r6");


Peter

Autor: Markus Gross (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Tip mit dem naked war einguter Hinweis...
Ich habe die Interruptroutine als solche deklariert mit dem Resultat
dass keine Register gerettet werden. Dies muss ggf. selbst gemacht
werden.
So kann ich alle register aendern.
Die Ruecksprungadresse ist kein Problem wie ich anfangs vermutet habe,
da diese automatisch bei einbem Interrupt gespeichert wird und mit reti
dann wiederhergestellt wird.

Vielen Dank,
Markus

Autor: Markus Gross (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P.S. @Wolfram: Zeitkritisch hier heisst nicht, dass die eine bestimmte
Zeitdauer eingehalten werden muss, sondern dass alles so schnell wie
moeglich ausgefuert werden muss...
Sonst haette ich mir die Muehe bestimmt nicht gemacht inline Assembler
zu verstehen ;-)

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.