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.