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
Die Registerinhalte in Variable kopieren und im Schleifendurchlauf nicht auf Register, sondern auf die Variablen reagieren. MW
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.
du kannst die Interruptroutine als naked deklarieren dann werden keine register gesichert. Trotzdem würde ich lieber nochmal die Programmstruktur überdenken...
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
was heisst zeitkritisch? Wenn man in einer Hochsprache schreibt, verwendet man Timer für zeitgenaue Aktionen.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.