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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.