Forum: Compiler & IDEs Interrupt wird beim linken nicht in den interrupt vektor eingetragen


von Matthias (Gast)


Angehängte Dateien:

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!

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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?

von Stefan E. (sternst)


Lesenswert?

Dir wurde im anderen Thread doch schon gesagt, dass das offenbar ein 
Toolchain-Bug ist, und dass du eine neuere Toolchain benutzen sollst. 
Auch habe ich dir dort Hinweise gegeben, wie/wo du eine aktuelle 
Toolchain für Linux bekommst.

von Matthias (Gast)


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?

von Stefan E. (sternst)


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/

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Matthias schrieb:
> Welche Versionen (gcc) sind denn aktuell?

Mindestens 4.3.x, 4.4.x wäre gewissermaßen "brandneu".

Weiß nicht, was Cliff Lawson da genau liefert, Bingo600 ist auch
eine Standardgröße:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=42631

von Stefan E. (sternst)


Lesenswert?

Jörg Wunsch schrieb:

> Weiß nicht, was Cliff Lawson da genau liefert, Bingo600 ist auch
> eine Standardgröße:

Das sind fertige Deb-Pakete aus eben jenen Bingo-Skript (und auch von 
Bingo selbst erstellt). Hier der Thread dazu:

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=86953

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Stefan Ernst schrieb:
> Das sind fertige Deb-Pakete aus eben jenen Bingo-Skript (und auch von
> Bingo selbst erstellt).

Ah, OK.  Er hatte mir mal geschrieben, dass er sowas baut, aber mir
war nicht klar, dass Cliff die bei sich verteilt.

von Matthias (Gast)


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.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Matthias schrieb:
> Das script von Bingo600 konnte ich zwar nicht unter OpenSuse11.2 zum
> laufen bringen.

Dann schick' ihm 'ne Mail, einschließlich der Fehlermeldungen.

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
Noch kein Account? Hier anmelden.