Hallo, ich hab etwas Startschwierigkeiten einen Interrupt zu deklarieren. Ich verwende den AVR µC Tiny26 und schreibe meinen C-Code in der IAR-Workbench (Kick-Start). Was muss ich machen um eine Interrupt-Service-Routine für beispielsweise den INT0 zu schreiben? Meine Versuche: void interrupt[INT0_vect] INT0_interrupt(void) { } oder: #pragma vektor=INT0_vect __interrupt void INT0_vect(void) { } schlugen bisher fehl. (Ich weis auch nicht wirklich was da gemacht wird. Ist nur abgepinselt.) Kann mir jemand bei dem Syntax helfen? Gibt es eine (oder mehrere) gute Literatur zum Syntax des IAR Compilers? Grüße, Michael
Hallo, probiere mal: #pragma vector = INT0_vect. Also das vector mit "c" schreiben und nicht mit "k". Gruß Schmidle
Ich kann mich nicht mehr richtig erinnern, aber könnte evtl. auch das möglich sein: interrupt[INT0_vect] void INT0_interrupt(void)
Bei mir aus einem Prg gerissen ATMEGA 64: Entweder: #pragma vector = INT7_vect __interrupt void ext_int_7_isr(void) { ... } oder: #pragma vector = 0x20 __interrupt void ext_int_7_isr(void) { ... } MW
Perfekt!!!! Tausend Dank!!! Die Frage, warum das so sein muss bleibt zwar noch, aber ich kann wenigstens weiter machen :-) Grüße, Michael
zu c und c++ gibt es einen (Quasi)-Standard, in dem gesagt wird, dass alle schlüsselwörter, die nicht dem allgemeinem standard entsprechen mit _ oder und Großbuchstabe beginnen. __interrupt ist so ein schlüsselwort, weil es im standard-c keine interrupt service routinen gibt (das soll eigentlich alles das runtime enviroment bzw. das BS machen). deshalb gibt es von jedem compiler-hersteller eine andere technik mit dem problem umzugehen. (siehe #pragma-anweisung darüber)
> zu c und c++ gibt es einen (Quasi)-Standard, in dem gesagt wird, > dass alle schlüsselwörter, die nicht dem allgemeinem > standard entsprechen mit _ oder und Großbuchstabe beginnen. Der offizielle Standard sagt genauer, dass keine globalen Bezeichner mit einem und keine lokalen mit einem doppelten Unterstrich beginnen dürfen (ist bestimmt noch genauer festgelegt), da diese Bezeichner für den Compiler bzw. die Runtime-Bibliotheken reserviert sind. Deswegen sollte man z.B. auch bei include-guards keine führenden Unterstriche verwenden: #ifdef __BLA_H #define __BLA_H #endif Das wäre z.B. soweit ich weiß kein "well-formed" C/C++-Code.
Es gibt auch mit Sicherheit ein Makro, ähnlich SIGNAL(#ir_vector) beim avr-gcc, welches einem das ganze #pragma- und __interrupt-Geraffel abnimmt.
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.