Wo ist der Interrupt-Table hin?

Gast #3287207
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?
#3287236
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...
#3287242
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.
Gast #3287253
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

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