Forum: Compiler & IDEs Multiple definition - Problem mit IRQ Funktion


von Tilo (Gast)


Lesenswert?

Hallo

Ich habe bisher mit arm-gcc einen ARM7 programmiert (Anfänger!)
Makefile etc. waren nicht von mir. Jetzt versuche ich das ganze zu
verstehen, allerdings ist meine vorhandene Makefile überhaupt nicht
zu verstehen. Ich habe daher eine einfache Makefile aus einem
Tutorial etwas angepasst:

# variables
CC      = arm-elf-gcc
LD      = arm-elf-ld -v
AR      = arm-elf-ar
AS      = arm-elf-as
CP      = arm-elf-objcopy
OD  = arm-elf-objdump

CFLAGS  = -I./ -c -fno-common -O2 -g -std=gnu99
AFLAGS  = -ahls -mapcs-32 -o crt.o
LFLAGS  =  -Map main.map -Taduc.cmd
CPFLAGS = --output-target=binary
ODFLAGS  = -x --syms
OBJECTS = crt.o main.o irq.o

# make target called by Eclipse (Project -> Clean ...)
clean:
  -rm $(OBJECTS) crt.lst main.out main.bin main.hex main.map main.dmp

#make target called by Eclipse  (Project -> Build Project)
all:  main.out
  @ echo "...copying"
  $(CP) $(CPFLAGS) main.out main.bin
  $(CP) --output-target=ihex main.out main.hex
  $(OD) $(ODFLAGS) main.out > main.dmp

main.out: $(OBJECTS) aduc.cmd
  @ echo "..linking"
  $(LD) $(LFLAGS) -o main.out $(OBJECTS) libgcc.a
crt.o: crt.s

  @ echo ".assembling crt.s"
  $(AS) $(AFLAGS) crt.s > crt.lst

main.o: main.c  ADuC7020.h
  @ echo ".compiling main.c"
  $(CC) $(CFLAGS) main.c

irq.o: irq.c
  @ echo ".compiling irq.c"
  $(CC) $(CFLAGS) irq.c




Leider läuft der Kompiler dann nicht mehr durch:
..linking
arm-elf-ld -v -Map main.map -Taduc.cmd -o main.out crt.o main.o irq.o 
libgcc.a
GNU ld version 2.16.1irq.o: In function `ADI_Irq_Handler':
/Users/tilolutz/Desktop/uC/new/irq.c:19: multiple definition of `IRQ'
main.o:./lib.c:10: first defined here

Die Zeilenangabe mit lib.c:10 ist schlicht falsch. Dort steht ganz 
anderer Code.




Dies sind die relevanten Codeschnipsel:
aduc7020.h:
void    (*IRQ)(void);    /*   Function Pointers for Interupts   */

irc.c:
#include "aduc7020.h"
void  ADI_Irq_Handler(void) _attribute_ ((interrupt ("IRQ")));

void  ADI_Irq_Handler(void)   {
  if ( *IRQ !=0x00)  {  IRQ();  }
  }


main.c:
#include "aduc7020.h"
IRQ = IRQ_Function;  // Weise IRQ Funkion
IRQEN = WAKEUP_TIMER_BIT; // Enable Timer1 IRQ



Ich muss zugeben, dass ich selbst nicht genau weiß, was ich da mache.
Der Startup-Code in Assembler legt den Interruptvektor auf 
ADI_IRQ_Handler
fest. Dort wird der Zeiger IRQ ausgeführt, wenn Zeiger IRQ definiert ist
und nicht auf 0x00 zeigt. In der main.c wird der Zeiger IRQ auf 
IRQ_Function
gesetzt. irc.c ist nicht in main.c included.

Ich weiß jetzt leider nicht, wie ich das ganze in Ordnung bringe.
Ich habe mit google nur den Tip gefunden, IRQ in aduc7020.h als "extern"
zu definieren. Dann läuft der Code zwar durch, aber kein IRQ wird 
abgearbeitet.


Ich wäre euch dankbar, wenn ihr mir weiter helfen könnt.


Ich wünsche einen guten Rutsch ins neue Jahr,

Tilo

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.