Moin,
ich möchte eine ISR optimieren. Mir ist aufgefallen, dass extrem viele
Takte faür verwendet werden, erst einmal alle möglichen Register zu
sichern. Diese Zeit würde ich mir gerne sparen. Ich benutze einen
ATmega128 und C.
Umfeld ist folgendes:
Bei einem Timer-Compare-Match wird die ISR aufgerufen. In dieser findet
eine SPI-Kommunikation statt (es werden 8 Byte empfangen), und
anschließend noch eine kurze Rechnung durchgeführt. Am Ende wird ein
8bit-Zähler erhöht.
Die main-Methode pollt auf den Counter; hat der einen bestimten Wert
erreicht, wird der Interrupt gesperrt, und weitere Berechnungen
durchgeführt. Alle Variablen, mit denen im ISR gearbeitet werden, sind
global.
Ich hatte es hiermit probiert:
1
ISR(TIMER0_COMP_vect)__attribute__((naked));
2
ISR(TIMER0_COMP_vect){
3
4
reg_sreg=SREG;
5
6
[SPI-Kommunikation]
7
8
[rechne]
9
10
SREG=reg_sreg;
11
asmvolatile("reti");
12
13
}
Aber im Debugger springt er dann manchmal ans Ende der ISR und dann
wieder zurück... Sehr seltsam. Kann man das denn so nicht machen???
MfG, und vielen Dank, Ozzy
P.S. muss ich das SREG überhaupt sichern?
Christoph O. wrote:
> ISR(TIMER0_COMP_vect) _attribute_ ((naked));> ISR(TIMER0_COMP_vect) {
1
ISR(TIMER0_COMP_vect,ISR_NAKED){...}
Aber ich wäre damit sehr vorsichtig. Schließlich weißt du ja
nicht, was genau der Compiler gerade an Resourcen wirklich benutzt
(und bei der nächsten Compilerversion können es ganz andere sein).
Pack die ISR doch gleich in eine Assemblerdatei.
> P.S. muss ich das SREG überhaupt sichern?
Das hängt natürlich von deinem Code aber, aber sehr wahrscheinlich
musst du (so, wie deine Beschreibung klingt). Es gibt nur ziemlich
wenige Befehle im AVR, die SREG nicht anfassen, und da du auch
was rechnen willst -- alles, was mit Arithmetik zu tun hat, muss
natürlich das SREG verändern können.
Christoph O. wrote:
> aber sollte das Sichern des SREG nicht so funktionieren, wie ich es> geschrieben habe?
Das müßtest Du doch leicht aus dem Assemblerlisting erkennen können.
Wenn Du das nicht kannst, dann ist für Dich das Attribut "naked"
verboten.
Peter
@Christoph
SREG ist nicht der einzige Register, der gesichert werden muss. Zum
Rechnen und Transportieren werden immer einige der 32 allgemeinen
Register benötigt, diese muss man natürlich auch speichern und wieder
laden. Les Dir bitte erstmal ein ASM-Tutorial durch, befor Du "naked"
und ähnliches verwendest.
Hi,
jo, habe jetzt auch alles gefunden, was ich gesucht habe. Der Vorteil
bei meinem Programm ist: die main wartet nur, bis die ISR 250x
durchgelaufen ist, daher werden da keine Register verändert, und nachdem
die main gerechnet hat, werden eh alle in der ISR benutzen Register auf
0 gesetzt. Daher sind da keine großen Probleme zu erwarten...
MfG, und vielen Dank noch einmal, Ozzy
>die main wartet nur, bis die ISR 250x>durchgelaufen ist, daher werden da keine Register verändert
das entzieht sich meiner logik, warum sollte die main dabei keine
arbeitsregister verändern ?
Christoph O. wrote:
> jo, habe jetzt auch alles gefunden, was ich gesucht habe. Der Vorteil> bei meinem Programm ist: die main wartet nur, bis die ISR 250x> durchgelaufen ist
Wozu dann den Interrupt überhaupt verlassen?
Einfach die nächsten 249 mal im Interrupt pollen, geht noch schneller,
als immer raus und reinzuspringen, selbst unter C.
D.h. das naked und Assembler sind dann überflüssig.
Peter
Hi,
stimmt, ich kann natürlich auch immer den Timer abfragen und dann ggf.
zurücksetzen, das geht natürlich noch schneller, als in die ISR zu
springen...
MfG, Ozzy