Interrupt wird beim linken nicht in den interrupt vektor eingetragen

Gast #1639176
Lesenswert?

Hallo,

beim linken von meinem Programm, wird der definierte TIMER2_OVF_vect 
nicht in das Interrupt Register eingetragen. Dadurch gibt es beim 
Interrupt immer einen Reset, da die Ausfuehrung des Programm wieder von 
vorne beginnt.

Bei mir steht im .lss file:
1
00000000 <__vectors>:
2
   0:  12 c0         rjmp  .+36       ; 0x26 <__ctors_end>
3
   2:  2c c0         rjmp  .+88       ; 0x5c <__bad_interrupt>
4
   4:  2b c0         rjmp  .+86       ; 0x5c <__bad_interrupt>
5
   6:  2a c0         rjmp  .+84       ; 0x5c <__bad_interrupt>
6
   8:  29 c0         rjmp  .+82       ; 0x5c <__bad_interrupt>
7
   a:  28 c0         rjmp  .+80       ; 0x5c <__bad_interrupt>

Es sollte aber so aussehen:
1
...
2
00000000 <__vectors>:
3
   0:  12 c0         rjmp  .+36       ; 0x26 <__ctors_end>
4
   2:  2c c0         rjmp  .+88       ; 0x5c <__bad_interrupt>
5
   4:  2b c0         rjmp  .+86       ; 0x5c <__bad_interrupt>
6
   6:  2a c0         rjmp  .+84       ; 0x5c <__bad_interrupt>
7
   8:  2a c0         rjmp  .+84       ; 0x5e <__vector_4>
8
   a:  28 c0         rjmp  .+80       ; 0x5c <__bad_interrupt>
9
...

Ich sehe aber nicht, woran das liegt. Anbei auch mein build output. Ich 
verwende die folgende toolchain:
#) binutils-2.20
#) gcc-4.1.2
#) avr-libc-1.6.8

Danke fuer die Hilfe!
Angehängte Dateien:
Moderator Persönliche Seite #1639346
Lesenswert?

Falsche Ausgabedatei angeguckt?  Wenn ich dein main.c mit -mmcu=
atmega8 compiliere und linke und das Ergebnis disassembliere, dann
bekomme ich:
1
main.elf:     file format elf32-avr
2

3

4
Disassembly of section .text:
5

6
00000000 <__vectors>:
7
   0:   12 c0           rjmp    .+36            ; 0x26 <__ctors_end>
8
   2:   21 c0           rjmp    .+66            ; 0x46 <__bad_interrupt>
9
   4:   20 c0           rjmp    .+64            ; 0x46 <__bad_interrupt>
10
   6:   1f c0           rjmp    .+62            ; 0x46 <__bad_interrupt>
11
   8:   1f c0           rjmp    .+62            ; 0x48 <__vector_4>
12
   a:   1d c0           rjmp    .+58            ; 0x46 <__bad_interrupt>

GCC 4.1.2 ist natürlich irgendwie reichlich alt (fast 4 Jahre).  Wenn
du die (beinahe aktuellen) binutils 2.20 benutzt, warum dann dazu so
einen alten Compiler?
Gast #1639395
Lesenswert?

Hallo,

habe meine alte toolchain ja auch entfernt und dann genau auf der 
angegebenen Seite alles nach Anleitung neu installiert. Und zwar von 
hier:

http://www.rn-wissen.de/index.php/Avr-gcc_und_avrdude_installieren

Dort wird halt auf den gcc-4.1.2 verwiesen und ich habe ihn genommen. 
Aber das war wohl doch nicht die beste Anleitung. Netterweise wird auch 
selten das Datum zu den Anleitungen hinzugefuegt.

Welche Versionen (gcc) sind denn aktuell?
#1639410
Lesenswert?

Matthias schrieb:

> habe meine alte toolchain ja auch entfernt und dann genau auf der
> angegebenen Seite alles nach Anleitung neu installiert. Und zwar von
> hier:
>
> http://www.rn-wissen.de/index.php/Avr-gcc_und_avrdude_installieren

Die Anleitung dort ist Schrott. Da wird der avr-gcc ja aus den 
offiziellen gcc-Quellen ohne irgendeinen der zusätzlichen AVR 
spezifischen Patches compiliert.

Nimm einfach ein deb-Paket von hier:
http://www.wrightflyer.co.uk/avr-gcc/
Gast #1641638
Lesenswert?

Hallo,

Danke fuer die gut Hilfe. Habe das Problem nun loesen koennen.

Das script von Bingo600 konnte ich zwar nicht unter OpenSuse11.2 zum 
laufen bringen. Habe daher eine gcc version 4.4.3 ohne patch 
installiert. Auch wenn hier wegen der fehlenden patches wohl noch einige 
Schwierigkeiten auftreten koennten, ist das Problem der nicht 
eingetragenen Interruptvektoren nun geloest.

Bin erstmal froh, dass ich nun einen Schritt weiter bin und meine 
Interruptprozeduren richtig aufgerufen werden. Also nochmals ein Dank an 
die fleissigen Poster hier, wirklich sehr hiflreich.

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