ISR() ->error: redefinition of 'ISR'

Gast #552150
Lesenswert?

Hallo,

Ich habe mehrere Interrupt Routinen im Einsatz und diese wie im 
Toutorial alle mit ISR(Vektor) definiert. Für Vektor habe ich natürlich 
den jeweiligen Vektor eingesetzt. Beim kompilieren erhalte ich die im 
Betreff angegebene Fehlermeldung.

error: redefinition of 'ISR'

Nun meine Frage, müssen die Bezeichner unterschiedlich gewählt werden? 
Natürlich hab ich das schon ausprobiert, mit dem Ergebnis, dass das 
kompilieren erfolgreich war, allerdings wurde die 
Interruptserviceroutine nicht ausgeführt :(.

Danke
Moderator Persönliche Seite #552233
Lesenswert?

Quacks wrote:

> ich war nur verwirrt, weil eine ISR() lief, mehrere nicht!??

Lief die wirklich?  Es ist ja schon einmal nicht ganz klar, wie du
überhaupt die Interrupts zugelassen hast (sei()), ohne
<avr/interrupt.h> einzubinden.  Aber nehmen wir mal an, du hättest
dafür
1
asm("sei");
geschrieben, dann hagelt es bei folgendem einfachen Beispiel:
1
#include <avr/io.h>
2

3
ISR(INT0_vect)
4
{
5
  PORTB = 0;
6
}
7

8
int
9
main(void)
10
{
11
  DDRB = 255;
12
  EIMSK = 1;
13
  asm("sei");
14

15
  for (;;) ;
16

17
}
erstmal massig Warnungen, die du alle ignoriert haben musst:
1
% avr-gcc -Wall -Wextra -Os -mmcu=atmega88 -o foo.elf foo.c
2
foo.c:4: warning: return type defaults to 'int'
3
foo.c: In function 'ISR':
4
foo.c:4: warning: type of '__vector_1' defaults to 'int'
5
foo.c:4: warning: unused parameter '__vector_1'
6
foo.c:6: warning: control reaches end of non-void function
Wenn ich mir das Disassembler-Listing dann ansehe, finde ich auch
(erwarteterweise) keinen einzigen wirklichen Interruptvektor
eingetragen:
1
% avr-objdump -d foo.elf
2

3
foo.elf:     file format elf32-avr
4

5
Disassembly of section .text:
6

7
00000000 <__vectors>:
8
   0:   19 c0           rjmp    .+50            ; 0x34 <__ctors_end>
9
   2:   32 c0           rjmp    .+100           ; 0x68 <__bad_interrupt>
10
   4:   31 c0           rjmp    .+98            ; 0x68 <__bad_interrupt>
11
   6:   30 c0           rjmp    .+96            ; 0x68 <__bad_interrupt>
12
   8:   2f c0           rjmp    .+94            ; 0x68 <__bad_interrupt>
13
   a:   2e c0           rjmp    .+92            ; 0x68 <__bad_interrupt>
14
   c:   2d c0           rjmp    .+90            ; 0x68 <__bad_interrupt>
15
   e:   2c c0           rjmp    .+88            ; 0x68 <__bad_interrupt>
16
  10:   2b c0           rjmp    .+86            ; 0x68 <__bad_interrupt>
17
  12:   2a c0           rjmp    .+84            ; 0x68 <__bad_interrupt>
18
  14:   29 c0           rjmp    .+82            ; 0x68 <__bad_interrupt>
19
  16:   28 c0           rjmp    .+80            ; 0x68 <__bad_interrupt>
20
  18:   27 c0           rjmp    .+78            ; 0x68 <__bad_interrupt>
21
  1a:   26 c0           rjmp    .+76            ; 0x68 <__bad_interrupt>
22
  1c:   25 c0           rjmp    .+74            ; 0x68 <__bad_interrupt>
23
  1e:   24 c0           rjmp    .+72            ; 0x68 <__bad_interrupt>
24
  20:   23 c0           rjmp    .+70            ; 0x68 <__bad_interrupt>
25
  22:   22 c0           rjmp    .+68            ; 0x68 <__bad_interrupt>
26
  24:   21 c0           rjmp    .+66            ; 0x68 <__bad_interrupt>
27
  26:   20 c0           rjmp    .+64            ; 0x68 <__bad_interrupt>
28
  28:   1f c0           rjmp    .+62            ; 0x68 <__bad_interrupt>
29
  2a:   1e c0           rjmp    .+60            ; 0x68 <__bad_interrupt>
30
  2c:   1d c0           rjmp    .+58            ; 0x68 <__bad_interrupt>
31
  2e:   1c c0           rjmp    .+56            ; 0x68 <__bad_interrupt>
32
  30:   1b c0           rjmp    .+54            ; 0x68 <__bad_interrupt>
33
  32:   1a c0           rjmp    .+52            ; 0x68 <__bad_interrupt>
34

35
00000034 <__ctors_end>:
36
  34:   11 24           eor     r1, r1
37
  36:   1f be           out     0x3f, r1        ; 63
38
  38:   cf ef           ldi     r28, 0xFF       ; 255
39
  3a:   d4 e0           ldi     r29, 0x04       ; 4
40
  3c:   de bf           out     0x3e, r29       ; 62
41
  3e:   cd bf           out     0x3d, r28       ; 61
42

43
00000040 <__do_copy_data>:
44
  40:   11 e0           ldi     r17, 0x01       ; 1
45
  42:   a0 e0           ldi     r26, 0x00       ; 0
46
  44:   b1 e0           ldi     r27, 0x01       ; 1
47
  46:   ea e7           ldi     r30, 0x7A       ; 122
48
  48:   f0 e0           ldi     r31, 0x00       ; 0
49
  4a:   02 c0           rjmp    .+4             ; 0x50 <.do_copy_data_start>
50

51
0000004c <.do_copy_data_loop>:
52
  4c:   05 90           lpm     r0, Z+
53
  4e:   0d 92           st      X+, r0
54

55
00000050 <.do_copy_data_start>:
56
  50:   a0 30           cpi     r26, 0x00       ; 0
57
  52:   b1 07           cpc     r27, r17
58
  54:   d9 f7           brne    .-10            ; 0x4c <.do_copy_data_loop>
59

60
00000056 <__do_clear_bss>:
61
  56:   11 e0           ldi     r17, 0x01       ; 1
62
  58:   a0 e0           ldi     r26, 0x00       ; 0
63
  5a:   b1 e0           ldi     r27, 0x01       ; 1
64
  5c:   01 c0           rjmp    .+2             ; 0x60 <.do_clear_bss_start>
65

66
0000005e <.do_clear_bss_loop>:
67
  5e:   1d 92           st      X+, r1
68

69
00000060 <.do_clear_bss_start>:
70
  60:   a0 30           cpi     r26, 0x00       ; 0
71
  62:   b1 07           cpc     r27, r17
72
  64:   e1 f7           brne    .-8             ; 0x5e <.do_clear_bss_loop>
73
  66:   03 c0           rjmp    .+6             ; 0x6e <main>
74

75
00000068 <__bad_interrupt>:
76
  68:   cb cf           rjmp    .-106           ; 0x0 <__heap_end>
77

78
0000006a <ISR>:
79
  6a:   15 b8           out     0x05, r1        ; 5
80
  6c:   08 95           ret
81

82
0000006e <main>:
83
  6e:   8f ef           ldi     r24, 0xFF       ; 255
84
  70:   84 b9           out     0x04, r24       ; 4
85
  72:   81 e0           ldi     r24, 0x01       ; 1
86
  74:   8d bb           out     0x1d, r24       ; 29
87
  76:   78 94           sei
88
  78:   ff cf           rjmp    .-2             ; 0x78 <main+0xa>

Also ich kauf dir nicht ab, dass deine eine ISR wirklich lief, und
guck bitte auch auf die Compilerwarnungen.
Gast #560415
Lesenswert?

Hi,

also ich hab den gleichen Fehler (avr-gcc 4.0.2) sobald ich zwei 
ISR(...) einbinde bekomme ich den Fehler.

Eigenartigerweise unter avr-gcc 3.4.2 funktioniert der gleiche Code 
einwandfrei.

#include <avr/interrupt.h>

hab ich natürlich drin.

mhm, wahrscheinlich mal wieder ein totaler Anfängerfehler :-(

Hat jemand eine Idee?

Gruß
Bernd
Moderator Persönliche Seite #562893
Lesenswert?

Bernd Klein wrote:

> ... wie kann ich denn am schnellsten die aktuelle
> Versionsnummer der installierten library herausfinden

Für die aktuellen Versionen steht sie in <avr/version.h>.  Wenn du
diese Datei nicht hast, ist deine Version noch 1.2.x, da gab es
keine interne Kennung für die Version.  Könnte man dann höchstens
an Hand der CVS $Id$ nachvollziehen.
#563005
Lesenswert?

mhm, alles etwas dubios bei mir. Also ich hab mal überprüft

unter
/usr/avr/avr/include/avr
finde ich die Datei version.h. Installiert habe ich demnach 1.4.5, das 
sollte wohl ok sein.

Trotzdem verweigert mir mein avr-gcc 4.0.2 das compilieren wie schon 
beschrieben. Ich werde mich mal auf "den Weg machen" und überprüfen ob 
es evel. noch irgendwo ne Installation der library von ubuntu gibt und 
diese dann beim compilieren herangezogen wird.

Keine Ahnung was es sonst noch sein kann. Schaun wir mal. Aber 
vielleicht hast du ja noch Ideen.

Gruß
Bernd

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