Forum: Compiler & IDEs ISR und naked


von Oz z. (ozzy)


Lesenswert?

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
  asm volatile ( "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?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

von Oz z. (ozzy)


Lesenswert?

Hi,

aber sollte das Sichern des SREG nicht so funktionieren, wie ich es 
geschrieben habe?

MfG, Ozzy

von Peter D. (peda)


Lesenswert?

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

von mork (Gast)


Lesenswert?

@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.

von Oz z. (ozzy)


Lesenswert?

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

von JanS (Gast)


Lesenswert?

>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 ?

von Peter D. (peda)


Lesenswert?

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

von Johnny (Gast)


Lesenswert?

Oder umgekehrt alles im Main machen, ohne Interrupt.

von Oz z. (ozzy)


Lesenswert?

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

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.