Forum: Mikrocontroller und Digitale Elektronik Wo ist der Interrupt-Table hin?


von Frederik (Gast)


Lesenswert?

Hallo,
ich versuche mich gerade an einem sehr einfachen Timer-Projekt mit einem 
Atmega8. Als Compiler verwende ich AVR-GCC 4.7.2.

Mein Problem: Ich vermisse den Interrupt-Table an Adresse 0.

main.c:
1
#include <avr/io.h>
2
#include <avr/interrupt.h>
3
4
5
ISR(TIMER0_OVF_vect) {TCNT0 = TCNT0 + 1;}
6
7
int main(void) {
8
  TCCR0 = (1<<CS00);
9
  TIMSK = (1<<TOIE0);
10
  TCNT0 = 1;
11
12
  sei();
13
  while(1);
14
}

Kompilierungsvorgang:
1
avr-gcc -Wall -O2 -mmcu=atmega8 -c main.c -o main.o
2
avr-gcc  -o main.bin main.o 
3
avr-size main.bin
4
   text     data      bss      dec      hex  filename
5
     42        0        0       42       2a  main.bin
6
avr-objcopy -j .text -j .data -O ihex main.bin main.hex

Disassembly (avr-objdump -D -S -s main.bin):
1
Disassembly of section .text:
2
3
00000000 <__vector_9>:
4
   0:  1f 92         push  r1
5
   2:  0f 92         push  r0
6
   4:  0f b6         in  r0, 0x3f  ; 63
7
   6:  0f 92         push  r0
8
   8:  11 24         eor  r1, r1

Weshalb beginnt die .text-Sektion an Adresse 0 direkt mit dem 
Timer0-Overflow-Handler (Vektor 9)? Wo sind die Sprünge des 
Interrupt-Tables hin?

von Georg G. (df2au)


Lesenswert?

Sieh dir doch mal das main.hex File mit einem Editor an.

von Frederik (Gast)


Lesenswert?

main.hex:
1
:100000001F920F920FB60F9211248F9382B78F5FBA
2
:1000100082BF8F910F900FBE0F901F90189581E0B7
3
:0A00200083BF89BF82BF7894FFCF31
4
:00000001FF

von Georg G. (df2au)


Lesenswert?

Seltsam. Bei mir sieht das anders aus:
Disassembly of section .text:
1
00000000 <__vectors>:
2
   0:  12 c0         rjmp  .+36       ; 0x26 <__ctors_end>
3
   2:  19 c0         rjmp  .+50       ; 0x36 <__bad_interrupt>
4
   4:  18 c0         rjmp  .+48       ; 0x36 <__bad_interrupt>
5
   6:  17 c0         rjmp  .+46       ; 0x36 <__bad_interrupt>
6
   8:  16 c0         rjmp  .+44       ; 0x36 <__bad_interrupt>
7
   a:  15 c0         rjmp  .+42       ; 0x36 <__bad_interrupt>
8
   c:  14 c0         rjmp  .+40       ; 0x36 <__bad_interrupt>
9
   e:  13 c0         rjmp  .+38       ; 0x36 <__bad_interrupt>
10
  10:  12 c0         rjmp  .+36       ; 0x36 <__bad_interrupt>
11
  12:  12 c0         rjmp  .+36       ; 0x38 <__vector_9>
12
  14:  10 c0         rjmp  .+32       ; 0x36 <__bad_interrupt>
13
  16:  0f c0         rjmp  .+30       ; 0x36 <__bad_interrupt>
14
  18:  0e c0         rjmp  .+28       ; 0x36 <__bad_interrupt>
15
  1a:  0d c0         rjmp  .+26       ; 0x36 <__bad_interrupt>
16
  1c:  0c c0         rjmp  .+24       ; 0x36 <__bad_interrupt>
17
  1e:  0b c0         rjmp  .+22       ; 0x36 <__bad_interrupt>
18
  20:  0a c0         rjmp  .+20       ; 0x36 <__bad_interrupt>
19
  22:  09 c0         rjmp  .+18       ; 0x36 <__bad_interrupt>
20
  24:  08 c0         rjmp  .+16       ; 0x36 <__bad_interrupt>
21
22
00000026 <__ctors_end>:
23
  26:  11 24         eor  r1, r1
24
  28:  1f be         out  0x3f, r1  ; 63
25
  2a:  cf e5         ldi  r28, 0x5F  ; 95
26
  2c:  d4 e0         ldi  r29, 0x04  ; 4
27
  2e:  de bf         out  0x3e, r29  ; 62
28
  30:  cd bf         out  0x3d, r28  ; 61
29
  32:  11 d0         rcall  .+34       ; 0x56 <main>
30
  34:  16 c0         rjmp  .+44       ; 0x62 <_exit>
31
32
00000036 <__bad_interrupt>:
33
  36:  e4 cf         rjmp  .-56       ; 0x0 <__vectors>
usw...

von Frederik (Gast)


Lesenswert?

Danke für die Hilfe. Was sagt dein GCC zu "avr-gcc -v"?

von Thomas E. (thomase)


Lesenswert?

Frederik schrieb:
> Weshalb beginnt die .text-Sektion an Adresse 0 direkt mit dem
> Timer0-Overflow-Handler (Vektor 9)? Wo sind die Sprünge des
> Interrupt-Tables hin?

Das ist nur main.c. Und die beginnt bei der (relativen) Adresse 0.
Die Frage ist nicht "Wo sind die Sprünge hin?", sondern "Wo kommen sie 
her?"
Dafür sorgt nach der Kompilierung der Linker. Dann passen auch die 
Adressen.

mfg.

von Frederik (Gast)


Lesenswert?

Linken tue ich mit
1
avr-gcc  -o main.bin main.o

Ist das falsch?

von Thomas E. (thomase)


Lesenswert?

Frederik schrieb:
> Linken tue ich mit
>
1
> avr-gcc  -o main.bin main.o
2
>
>
> Ist das falsch?

Ich hasse dieses Kommandozeilengefriggel.
<F7> und der Drops ist gelutscht.

Hast du kein makefile?
Hier ist die Quälanleitung für die SM-Programmierer:
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Exkurs_Makefiles

mfg.

von Georg G. (df2au)


Lesenswert?

Thomas Eckmann schrieb:
> Ich hasse dieses Kommandozeilengefriggel.

Richtige Männer haben einen C> Prompt!

von Frederik (Gast)


Lesenswert?

Der Kompilierungsvorgang ist Teil des Makefiles:
1
DEVICE=atmega8
2
3
CFLAGS=-Wall -O2 -mmcu=$(DEVICE)
4
LFLAGS=
5
6
CC=avr-gcc
7
OC=avr-objcopy
8
OD=avr-objdump
9
SZ=avr-size
10
11
SRC_A=$(shell ls *.S)
12
SRC_C=$(shell ls *.c)
13
OBJ=$(SRC_C:.c=.o) $(SRC_A:.S=.o)
14
15
16
all:  main.hex
17
  @make buildclean > /dev/null
18
19
clean:  buildclean
20
  rm -f *.hex
21
22
disasm:  main.bin
23
  $(OD) -D -S -s $<
24
25
main.hex: main.bin
26
  $(OC) -j .text -j .data -O ihex $< $@
27
28
main.bin: $(OBJ)
29
  $(CC) $(LFLAGS) -o $@ $(OBJ)
30
  $(SZ) $@
31
32
%.o:  %.c
33
  $(CC) $(CFLAGS) -c $< -o $@
34
35
%.o:  %.S
36
  $(CC) $(CFLAGS) -c $< -o $@
37
38
buildclean:
39
  rm -f *.lst *.o *.map *.bin

von Thomas E. (thomase)


Lesenswert?

Georg G. schrieb:
> Thomas Eckmann schrieb:
>> Ich hasse dieses Kommandozeilengefriggel.
>
> Richtige Männer haben einen C> Prompt!

Richtige Männer schreiben ihr Programm in eine einzige Quelltextzeile, 
optimieren es auf ein Byte Länge, komprimieren dieses Byte auf ein Bit 
und lassen das Programm selbstextrahierend auf jedem beliebigen Rechner 
laufen.

mfg.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Angehängte Dateien:

Lesenswert?

Im Anhang ein mit mfile erstelltes Makefile von WinAVR.
Damit sollten dann keine Probleme mehr auftreten.
Make All und gut is.

von Frederik (Gast)


Lesenswert?

Thomas Eckmann schrieb:
komprimieren dieses Byte auf ein Bit

Hört auf, von sowas bekomme ich Kopfschmerzen.
Könnte mal jemand posten, wie er linkt?
Danke.

von Frederik (Gast)


Lesenswert?

Danke Martin. Ich werds mal durchsehen.

von Frederik (Gast)


Lesenswert?

Der Makefile macht keinen Unterschied. Nun habe ich eine andere 
GCC-Version ausprobiert (4.3.4). Der Jump-Table ist nun vorhanden. Es 
muss an AVR-GCC 4.7.2 liegen.

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.