mikrocontroller.net

Forum: Compiler & IDEs GCC: Interrupt in Assembler


Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Gemeinde,

ich versuche gerade herauszufinden, wie ich mit GCC ein Projekt
übersetzen kann, das ein Assemblermodul beinhaltet (das ist kein
Problem), das wiederum eine Interrupt-Routine enthält (zur
Geschwindigkeitsoptimierung). Insbesondere gelingt mir der
entscheidende Punkt nicht, nämlich die Vektortabelle entsprechend zu
setzen. Andere C-Module enthalten ebenfalls Interrupt-Routinen, was ja
sehr einfach ist. In der Doku finde ich nichts :-(

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vor lauter korrektem Ausdrücken habe ich vergessen: Es geht um AVR :-)

Autor: MasterFX (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kannst du nicht einfach in C eine Funktion schreiben mit
"ISR(VEKTOR)...." und in dieser Funktion einfach die des in asm
geschriebenen Programms aufrufen?

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>In der Doku finde ich nichts
hast du schon in die interrupt.h Headerdatei der avrlibc geschaut
da findest du wie ISR routinen gegenüber dem Compiler dargestellt
werden.
Das einfachste dürfte sein eine nackte c-Interruptroutine zu erstellen
und von dort in den Assemblercode zu wechseln.
Du könntest auch im Forum suchen. Dises Thema wurde vor ein paar
Monaten schonmal diskutiert.

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Forumsuche habe ich schon durch...

Momentan mache ich's so:

void AsmInt(void);
void SIG_OUTPUT_COMPARE1A(void) _attribute_ ((naked));
void SIG_OUTPUT_COMPARE1A(void)
{
  _asm__ __volatile_ ("jmp AsmInt" ::);
}

Also ein Sprung aus dem C-Modul in das Assembler-Modul. Das kostet halt
noch einen zusätzlichen Sprung. Den reti führt dann schon Assembler
aus.

Durch Header-Dateien habe ich mich demnach auch schon gefräßt.
Interessant wäre halt, was der C-Compiler daraus übersetzt. Das
List-File ist nicht so aussagekräftig. Da steht dann ja schon genau
das, was man haben will. Aber nix über das "wie".

Wahrscheinlich sagt mir noch jemand, dass ich das Linker-Skript
anpassen muss. Das ist für mich dann ein Grund zur Panik!

Autor: Wolfram (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du schon probiert nur den Prototypen der ISR anzugeben und die
Assemblerfkt. genauso wie die ISR zu benennen?

Autor: Christian Rötzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hm. Interessant. Ich habe jetzt mal folgendes gemacht:

    .global __vector_12
__vector_12:
    // some stuff
    reti

Damit wird die ISR in der Vektortabelle eingetragen und alles ist gut.
Kein zusätzlicher Code in C notwendig.

Ich dachte, ich hatte das schon getestet, da ging's nicht, aber in der
Hitze des Gefechts ging das dann wohl unter... Danke an alle!

Autor: holm (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
oder so:

                .file   "isr.S"
                .arch attiny2313

        #include <avr/io.h>

                _SREG_ = 0x3f

                .global SIG_INT0
                .global SIG_INT1
SIG_INT0:
                push r16
                push r17
                in r17,__SREG__
                push r17
                clr r16
                push r24
                in r24,_SFR_IO_ADDR(PINB)       ; get PortB Data
                push r25
...

Gruß,

holm

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.