Forum: Compiler & IDEs ISR() ->error: redefinition of 'ISR'


von Quacks (Gast)


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

von Daniel W. (danie)


Lesenswert?

hast du aus versehen 2 mal den selben vektor verwendet?

grüße danie

von Quacks (Gast)


Lesenswert?

Hallo Daniel,

definitiv nein, ich verwende:

ISR(USART1_UDRE_vect){}
ISR(USART1_RX_vect){}
ISR(USART1_TX_vect){}

beim ATMEGA128.

Gruß

von Simon K. (simon) Benutzerseite


Lesenswert?

Sieht mir eher so aus, als hättest du das Makro "ISR(..)" mehrmals 
definiert.

Welche Header-Dateien hast du denn eingebubnden?

von Quacks (Gast)


Lesenswert?

Hall Daniel,

Ich hab mal zwischen den Zeilen gelesen, also ist es richtig, alle 
Interrupt Service Routinen mit dem Bezeichner "ISR" zu versehen?

Warum dann aber dieser Fehler?


von Quacks (Gast)


Lesenswert?

@Simon

#include <avr/pgmspace.h>
#include <avr/io.h>
#include <stdio.h>
#include "uart.h"

in die uart.c

von johnny.m (Gast)


Lesenswert?

Du musst schon ein
1
#include<avr/interrupt.h>
einbauen. Sonst kennt er das ISR-Makro nicht...

von Daniel W. (danie)


Lesenswert?

ja jede interrupt-routine ist mit ISR(..) aufgebaut.

du brauchst aber auch noch:
#include <avr/interrupt.h>


dennoch seltsam.

du könntest jedoch code posten....



danie

von Daniel W. (danie)


Lesenswert?

johnny.m:
ggg
warst schneller lach

von Quacks (Gast)


Lesenswert?

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

und es steht ja auch deutlich im Tutorial Schäm

Vielen Dank

von Daniel W. (danie)


Lesenswert?

gerne geschehn.
viel erfolg beim projekt!

grüße danie

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


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.

von Bernd Klein (Gast)


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

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


Lesenswert?

Hast du mit dem neuen Compiler eventuell auch eine andere Version
der Library gebaut?

von Bernd K. (berndklein)


Lesenswert?

ich hoffe nicht. Ich nutze Ubuntu 6.06 und über Synaptic hab ich den 
4.0.2 installiert.

Mhm, mal ne blöde Frage, wie kann ich denn am schnellsten die aktuelle 
Versionsnummer der installierten library herausfinden

cu
Bernd

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


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.

von Bernd K. (berndklein)


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

von Bernd K. (berndklein)


Lesenswert?

uaaaahhh,

ich Depp. Es war tatsächlich noch ne 1.2.x Version von Ubuntu auf meinem 
Rechner und die wurde beim compilieren herangezogen !

Nun läufts auch mit mehreren ISR(...) Funktionen !

Danke für den "Versionstipp" - hat mir letztendlich auf die Sprünge 
geholfen

Gruß
Bernd

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.