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

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.