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


von Markus Gross (Gast)


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

von Michael Wilhelm (Gast)


Lesenswert?

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

MW

von inoffizieller WM-Rahul (Gast)


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.

von Wolfram (Gast)


Lesenswert?

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

von Markus Gross (Gast)


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

von Wolfram (Gast)


Lesenswert?

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

von Peter D. (peda)


Lesenswert?

Du kannst Variablen als register definieren:
1
typedef unsigned char  u8;
2
3
register u8 PCMSumA0 asm("r3");
4
register u8 PCMSumA1 asm("r4");
5
register u8 PCMValA0 asm("r5");
6
register u8 PCMValA1 asm("r6");


Peter

von Markus Gross (Gast)


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

von Markus Gross (Gast)


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 ;-)

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.