www.mikrocontroller.net

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


Autor: Tilo L. (katagia)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.