www.mikrocontroller.net

Forum: Compiler & IDEs ISR und naked


Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht 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:
ISR(TIMER0_COMP_vect) __attribute__ ((naked));
ISR(TIMER0_COMP_vect) {

  reg_sreg = SREG;

  [SPI-Kommunikation]

  [rechne]

  SREG = reg_sreg;
  asm volatile ( "reti" );

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Christoph O. wrote:

> ISR(TIMER0_COMP_vect) _attribute_ ((naked));
> ISR(TIMER0_COMP_vect) {
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.

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

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

MfG, Ozzy

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: mork (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: JanS (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oder umgekehrt alles im Main machen, ohne Interrupt.

Autor: Oz zy (ozzy)
Datum:

Bewertung
0 lesenswert
nicht 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

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.