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


von 900ss (900ss)


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

von Stefan E. (sternst)


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:
1
#include <avr/io.h>
2
3
.global TIMER0_COMPA_vect
4
TIMER0_COMPA_vect:
5
6
        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]

von 900ss (900ss)


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.

von Peter D. (peda)


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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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

von 900ss (900ss)


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. ;)

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.