mikrocontroller.net

Forum: Compiler & IDEs AVR-GCC: Wie IRQ-Vektor auf reine ASM-Funktion setzen?


Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
N'abend,

hab schon mal avr-libc Doku und auch hier das AVR-GCC Tutorial 
durchstöbert, aber die Antwort auf meine Frage nicht gefunden.

Ich möchte einen Interruptvektor (Timer, TIMER0_COMPA_vect) definieren, 
der auf eine reine Assemblerfunktion zeigt.

Alles In 'C' ist ja kein Problem mit dem Makro ISR().
Reines Assembler ist auch keine Problem, da definiert man die 
Vektor-Tabelle ja selbst. Aber wie mache ich das mit dem AVR-GCC?

Ich habe eine Assemblerfunktion in einem bsp.S Assembler-Modul.
Die Funktion kümmert sich auch schon um das sichern der Register.
Wie kann ich den Vektor (die Funktion) definieren, sodaß AVR-GCC diesen 
in die Vektortabelle einträgt? So wie es ISR() für 
'C'-Interruptfunktionen macht?
Inline-Assembler in einer C-Funktion möchte ungerne verwenden.
Ich könnte natürlich eine C-Funktion mit 
ISR(TIMER0_COMPA_vect,ISR_NAKED) definieren und von dort die 
Assemblerfunktion aufrufen. Ich möchte aber diesen Call sparen. Die 
Vektortabelle selber anlegen möchte ich auch nach Möglichkeit vermeiden.

Gibt es eine Lösung? Wenn ja wie?

Danke für Euro Tips.

900ss

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Wie kann ich den Vektor (die Funktion) definieren, sodaß AVR-GCC diesen
> in die Vektortabelle einträgt?

Indem du der Assembler-Funktion einfach den passenden Namen gibst:
#include <avr/io.h>

.global TIMER0_COMPA_vect
TIMER0_COMPA_vect:

        reti

> hab schon mal avr-libc Doku ...
> durchstöbert, aber die Antwort auf meine Frage nicht gefunden.

Dann hast du nicht genau genug geschaut:
http://www.nongnu.org/avr-libc/user-manual/assembler.html
Note [7]

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
> Dann hast du nicht genau genug geschaut:

Mist, erwischt. Stimmt, bei Note 7 bin ich nicht angekommen
oder hatte die Augen geschlossen ;-)
Nun ja, werde ich versuchen.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan Ernst schrieb:
> Indem du der Assembler-Funktion einfach den passenden Namen
> gibst:

Außerdem muß die Datei *.S oder *.sx heißen.
Nennt man sie versehentlich *.s, werden die Namen nicht ersetzt.

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und falls man eine andere Endung wie .asm bevorzugt, dann geht auch -x 
assembler-with-cpp vor'm Dateiname.

Autor: 900ss D. (900ss)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ist zwar schon 3,5 Jahre her und ich habe es auch zum laufen bekommen 
damals. Aber trotzdem danke noch für eure Hilfe Peter und Johann. ;)

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.