Makefile und Unterverzeichnisse

Gast #428053
Lesenswert?

Hallo,

Vielleicht kann mir jemand weiterhelfen. Ich benutze derzeit den IAR AVR 
compiler. Nun würde ich gerne auf den GCC umsteigen. Bzw. jederzeit 
zwischen beiden wechseln können. Derzeit habe ich folgende Probleme:

1. Mein Sourcode ist in mehrere Domains aufgeteilt:
Source
      -->ChassInf/CHASSINF.c
      -->ECU/Adc.c
            /AnalogSwitch.c
            /ECU/ECU.c
            /Ports.c
            /Spi.c
            /Timer.c
      -->FaultMan/FaultMan.c
                 /MonitorStatus.c
      -->InfoBase/InfoBase.c
      -->IPC/IPC.c
      -->NVMEM/NVMEM.c
      -->OS/OS.c
           /main.c
      -->SandA/ERD.c
              /Motor.c
              /SandA.c
              /Switch.c

2. Weiterhin befinden sich in der domain OS noch Assembler Dateien die 
auch zum Quellcode gehoeren.

3. main() befindet sich in der main.c.
   Die main.c ist aber nicht die Datei die als erstes ausgefuehrt wird. 
Sondern dies ist die Startup.asm!


Fragen:
Kann ich dies ohne weiteres compilieren? Oder müssen alle Source Dateien 
in einem Ordner liegen?

Was mache ich falsch?
Ich erhalte momentan den Fehler:

-------- begin --------
avr-gcc (GCC) 3.4.6
Copyright (C) 2006 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is 
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR 
PURPOSE.

Compiling C: OS/main.c
avr-gcc -c -mmcu=atmega128 -I. -gdwarf-2 -DF_CPU=8000000UL -Os 
-funsigned-char -
funsigned-bitfields -fpack-struct -fshort-enums -Wall 
-Wstrict-prototypes -Wunde
f -Wa,-adhlns=/OS/main.lst  -std=gnu99 -Wundef -MD -MP -MF .dep/main.o.d 
OS/main
.c -o /OS/main.o
OS/main.c:117: warning: return type of 'main' is not `int'
Assembler messages:
FATAL: can't create /OS/main.o: No such file or directory
Angehängte Dateien:
Gast #428175
Lesenswert?

Hallo,

und vielen Dank für die Antwort.

Ich habe das Makefile jetzt geändert:

# List C source files here. (C dependencies are automatically 
generated.)
SRC += ./OS/main.c
SRC += ./Chassinf/chassinf.c
SRC += ./ECU/Adc.c
SRC += ./ECU/AnalogSwitch.c
SRC += ./ECU/ECU.c
SRC += ./ECU/Ports.c
SRC += ./ECU/Timer.c
SRC += ./FaultMan/FaultMan.c
SRC += ./FaultMan/MonitorStatus.c
SRC += ./InfoBase/InfoBase.c
SRC += ./IPC/IPC.c
SRC += ./NVMEM/NVMEM.c
SRC += ./OS/main.c
SRC += ./OS/OS.c
SRC += ./ERD/ERD.c
SRC += ./ERD/Motor.c
SRC += ./ERD/SandA.c
SRC += ./ERD/Switch.c


Die Datei make.exe befindet sich wie oben beschrieben im Ordner Source. 
Jetzt erhalte ich folgende Fehlermeldung:
.
.
.
.
.
 storage class
./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:173: error: syntax error before 
"DDRB"
./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:173: warning: type defaults to `int' 
in decl
aration of `DDRB'
./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:173: warning: data definition has no 
type or
 storage class
./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:174: error: syntax error before 
"PINB"
./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:174: warning: type defaults to `int' 
in decl
aration of `PINB'
./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:174: warning: data definition has no 
type or
 storage class
./OS/main.c:121: warning: return type of 'main' is not `int'
make: *** [/./OS/main.o] Error 1
Angehängte Dateien:
Moderator Persönliche Seite #428285
Lesenswert?

Christoph Daun wrote:

> SRC += ./OS/main.c
1
SRC += OS/main.c
hätte es sicher auch getan.

>  storage class
> ./OS/..\ECU\/..\ECU\/..\ECU\iom88.h:173: error: syntax error before
> "DDRB"

Sieht so aus, als hättest du einige grundlegende Dinge hier daneben
geschrieben.  Das kannst du aber nur durch Review deines Sourcecodes
lösen.  Vermutung: hast du <avr/iom88.h> statt <avr/io.h> included?

> ./OS/main.c:121: warning: return type of 'main' is not `int'

Entsprechend dem C-Standard hat main() den Rückkehrwert `int'.
Gast #428641
Lesenswert?

Ich vermute gerade , dass es bei IAR Unterschiede in der iom88.h gibt. 
Wahrscheinlich sind bestimmte libaries auch anders.
Also der von mir programmierte code läuft unter IAR einwandfrei. Wobei 
ich darauf geachtet habe, nur Standard C code zu verwenden.

>>Vermutung: hast du <avr/iom88.h> statt <avr/io.h> included?

Warum sollte ich denn nur die io.h includieren und nicht die iom88.h?
Gast #428804
Lesenswert?

>Also der von mir programmierte code läuft unter IAR einwandfrei. Wobei
>ich darauf geachtet habe, nur Standard C code zu verwenden.

Eine Headerdatei die die Prozessorperipherieregister oder Interrupts 
beschreibt ist mit 99% Sicherheit Compilerspezifisch.

>Warum sollte ich denn nur die io.h includieren und nicht die iom88.h?
Das findest du raus wenn du die avrlibc Dokumentation liest, die ist 
Pflichtlektüre.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren