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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.