Ich versuche gerade eine Interrupt-Routine für INT2 auf dem avrgcc zu compilieren. Leider klappt es nicht. ISR(INT2_vect) { blub=1; } Der Code wird auch als "<__vector_18>" erzeugt. Die erzeugte Interrupt-Tabelle ist aber einfach zu kurz: 00000000 <__vectors>: 0: 13 c0 rjmp .+38 ; 0x28 <__init> 2: 2d c0 rjmp .+90 ; 0x5e <__bad_interrupt> 4: 2c c0 rjmp .+88 ; 0x5e <__bad_interrupt> 6: 2b c0 rjmp .+86 ; 0x5e <__bad_interrupt> 8: 2a c0 rjmp .+84 ; 0x5e <__bad_interrupt> a: 29 c0 rjmp .+82 ; 0x5e <__bad_interrupt> c: 28 c0 rjmp .+80 ; 0x5e <__bad_interrupt> e: 27 c0 rjmp .+78 ; 0x5e <__bad_interrupt> 10: 26 c0 rjmp .+76 ; 0x5e <__bad_interrupt> 12: 25 c0 rjmp .+74 ; 0x5e <__bad_interrupt> 14: 24 c0 rjmp .+72 ; 0x5e <__bad_interrupt> 16: 23 c0 rjmp .+70 ; 0x5e <__bad_interrupt> 18: 22 c0 rjmp .+68 ; 0x5e <__bad_interrupt> 0000001a <__ctors_end>: Am Ende fehlen 3 Interrupt-Einsprungpunkte, unter anderem der für INT2 Wenn ich als MCU "ATMega32" wähle, ist die Tabelle gross genug, allerdings liegen die Interrupts dort anders, weshalb der Code für den Mega16 nicht brauchbar ist. Hat irgendwer eine Ahnung, wie ich den AVRGCC dazu bringe eine Interrupttabelle der richtigen Grösse zu erzeugen?
Ich hab nochmal weitergeschaut. Es scheint, als ob der AVRGCC generell nach 12 Interrupt-Einträgen den Code legt (ist auch so, wenn man den Mega32 wählt). Ich vermute also, dass er den Interrupt-Vektor mit anderem Code überschreibt. Ist das ein bekannter Bug?
Moin, vielleicht schaust du mal, ob es eine neuere Version des AVR-GCC und der Include-Files (soweit ich weiß bei der avr-libc dabei) gibt. Meine Versionen laufen problemlos - das sind: avr-gcc (GCC) 3.4.6 (Gentoo 3.4.6, ssp-3.4.5-1.0, pie-8.7.9) Binutils: Version 2.15.94 avr-libc: 1.4.4 Beispiel auf einem ATMega16: Disassembly of section .text: 00000000 <__vectors>: 0: 0c 94 74 00 jmp 0xe8 <__init> 4: 0c 94 48 09 jmp 0x1290 <__vector_1> 8: 0c 94 71 09 jmp 0x12e2 <__vector_2> c: 0c 94 8f 00 jmp 0x11e <__bad_interrupt> 10: 0c 94 8f 00 jmp 0x11e <__bad_interrupt> 14: 0c 94 c8 08 jmp 0x1190 <__vector_5> 18: 0c 94 b3 08 jmp 0x1166 <__vector_6> 1c: 0c 94 8f 00 jmp 0x11e <__bad_interrupt> 20: 0c 94 69 08 jmp 0x10d2 <__vector_8> 24: 0c 94 45 08 jmp 0x108a <__vector_9> 28: 0c 94 8f 00 jmp 0x11e <__bad_interrupt> 2c: 0c 94 8f 00 jmp 0x11e <__bad_interrupt> 30: 0c 94 8f 00 jmp 0x11e <__bad_interrupt> 34: 0c 94 8f 00 jmp 0x11e <__bad_interrupt> 38: 0c 94 02 09 jmp 0x1204 <__vector_14> 3c: 0c 94 8f 00 jmp 0x11e <__bad_interrupt> 40: 0c 94 8f 00 jmp 0x11e <__bad_interrupt> 44: 0c 94 8f 00 jmp 0x11e <__bad_interrupt> 48: 0c 94 91 09 jmp 0x1322 <__vector_18> 4c: 0c 94 8f 00 jmp 0x11e <__bad_interrupt> 50: 0c 94 8f 00 jmp 0x11e <__bad_interrupt> MfG, Heiko
Hmm: avr-gcc: 3.4.6 Binutils: 2.16.1 + coff-avr-patch (20050630) avr-libc: 1.4.5 Sieht eigentlich so aus, als hätte ich überall die aktuellen Versionen. Hat noch jemand eine Idee?
Ich schaffe es nicht :( Kann jemand mal folgendes nachvollziehen: C-Source: ---main.c--- #include <avr/interrupt.h> #include <stdint.h> #include <avr/io.h> ISR(INT2_vect) { // do something } int main(void) { } ------------- Compilieren: avr-gcc -c -mmcu=atmega16 -o main.o main.c avr-gcc -o "main.elf" ./main.o avr-objdump -d main.elf >main.lss Und raus kommt bei mir folgendes: --------------------------------------------------------------------- main.elf: file format elf32-avr Disassembly of section .text: 00000000 <__vectors>: 0: 0c c0 rjmp .+24 ; 0x1a <__ctors_end> 2: 26 c0 rjmp .+76 ; 0x50 <__bad_interrupt> 4: 25 c0 rjmp .+74 ; 0x50 <__bad_interrupt> 6: 24 c0 rjmp .+72 ; 0x50 <__bad_interrupt> 8: 23 c0 rjmp .+70 ; 0x50 <__bad_interrupt> a: 22 c0 rjmp .+68 ; 0x50 <__bad_interrupt> c: 21 c0 rjmp .+66 ; 0x50 <__bad_interrupt> e: 20 c0 rjmp .+64 ; 0x50 <__bad_interrupt> 10: 1f c0 rjmp .+62 ; 0x50 <__bad_interrupt> 12: 1e c0 rjmp .+60 ; 0x50 <__bad_interrupt> 14: 1d c0 rjmp .+58 ; 0x50 <__bad_interrupt> 16: 1c c0 rjmp .+56 ; 0x50 <__bad_interrupt> 18: 1b c0 rjmp .+54 ; 0x50 <__bad_interrupt> 0000001a <__ctors_end>: 1a: 11 24 eor r1, r1 1c: 1f be out 0x3f, r1 ; 63 1e: cf e5 ldi r28, 0x5F ; 95 20: d2 e0 ldi r29, 0x02 ; 2 22: de bf out 0x3e, r29 ; 62 24: cd bf out 0x3d, r28 ; 61 00000026 <__do_copy_data>: 26: 10 e0 ldi r17, 0x00 ; 0 28: a0 e6 ldi r26, 0x60 ; 96 2a: b0 e0 ldi r27, 0x00 ; 0 2c: e0 e8 ldi r30, 0x80 ; 128 2e: f0 e0 ldi r31, 0x00 ; 0 30: 03 c0 rjmp .+6 ; 0x38 <.do_copy_data_start> Irgendwo gibt e wohl beim Linken ein Problem. Aber wo? Brauch ich noch irgendwelche speziellen Linker-Optionen?
Interessant: Wenn ich in einem Schritt compilieren und linken lasse, funktioniert es: avr-gcc -mmcu=atmega16 -o main.out main.c avr-objdump -d main.out >main.lss main.out: file format elf32-avr Disassembly of section .text: 00000000 <__vectors>: 0: 0c 94 2a 00 jmp 0x54 <__ctors_end> 4: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 8: 0c 94 45 00 jmp 0x8a <__bad_interrupt> c: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 10: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 14: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 18: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 1c: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 20: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 24: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 28: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 2c: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 30: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 34: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 38: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 3c: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 40: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 44: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 48: 0c 94 47 00 jmp 0x8e <__vector_18> 4c: 0c 94 45 00 jmp 0x8a <__bad_interrupt> 50: 0c 94 45 00 jmp 0x8a <__bad_interrupt> Also ist wohl irgendwas an meinem Linker-Aufruf falsch. Aber was?
Geschafft: Der Linker braucht auch nochmal eine Info, für welche Architektur gelinkt werden soll. Also noch "-mmcu=atmega16". Interessanterweise bietet das Eclipse-Plugin die Auswahl des Prozessers für Assembler und C-Compiler, aber nicht für den Linker. Nachdem ich sie dort von Hand nachgetragen habe, scheint der Code jetzt richtig zu sein :)
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.