ATMega16 & INT2 mit avrgcc

OP #427670
Lesenswert?

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?
Gast #427712
Lesenswert?

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
OP #427848
Lesenswert?

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?
OP #427855
Lesenswert?

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?
OP #427857
Lesenswert?

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 
:)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren