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 :-(
Kannst du nicht einfach in C eine Funktion schreiben mit "ISR(VEKTOR)...." und in dieser Funktion einfach die des in asm geschriebenen Programms aufrufen?
>>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.
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!
Hast du schon probiert nur den Prototypen der ISR anzugeben und die Assemblerfkt. genauso wie die ISR zu benennen?
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!
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.