PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : avr-gcc unter linux



donni
02.03.2006, 12:18
Ich habe den avr-gcc nach dieser anleitung installiert:
http://www.linuxfocus.org/Deutsch/November2004/article352.shtml#352lfindex3
und zum kompilieren die Makefile aus dem mega8ledtest programm für mich angepasst.
Makefile:


# makefile, written by guido socher
MCU=atmega16
CC=avr-gcc
OBJCOPY=avr-objcopy
# optimize for size:
CFLAGS=-g -mmcu=$(MCU) -Wall -Wstrict-prototypes -Os -mcall-prologues
#-------------------
all: test.hex
#-------------------
help:
@echo "Usage: make all|load|load_pre|rdfuses|wrfuse1mhz|wrfuse4mhz|wr fusecrystal"
@echo "Warning: you will not be able to undo wrfusecrystal unless you connect an"
@echo " external crystal! uC is dead after wrfusecrystal if you do not"
@echo " have an external crystal."
#-------------------
test.hex : test.out
$(OBJCOPY) -R .eeprom -O ihex test.out test.hex
test.out : test.o
$(CC) $(CFLAGS) -o test.out -Wl,-Map,test.map test.o
test.o : test.c
$(CC) $(CFLAGS) -Os -c test.c
#------------------
load: test.hex
./prg_load_uc test.hex
# here is a pre-compiled version in case you have trouble with
# your development environment
load_pre: test_pre.hex
./prg_load_uc test.hex
#
loaduisp: test.hex
./prg_load_uc -u test.hex
# here is a pre-compiled version in case you have trouble with
# your development environment
load_preuisp: test_pre.hex
./prg_load_uc -u test.hex
#-------------------
# fuse byte settings:
# Atmel AVR ATmega8
# Fuse Low Byte = 0xe1 (1MHz internal), 0xe3 (4MHz internal), 0xe4 (8MHz internal)
# Fuse High Byte = 0xd9
# Factory default is 0xe1 for low byte and 0xd9 for high byte
# Check this with make rdfuses
#rdfuses:
./prg_fusebit_uc -r
# use internal RC oscillator 1 Mhz
#wrfuse1mhz:
./prg_fusebit_uc -w 1
# use internal RC oscillator 4 Mhz
#wrfuse4mhz:
./prg_fusebit_uc -w 4
# use external 3-8 Mhz crystal
# Warning: you can not reset this to intenal unless you connect a crystal!!
#wrfusecrystal:
# @echo "Warning: The external crystal setting can not be changed back without a working crystal"
# @echo " You have 3 seconds to abort this with crtl-c"
# @sleep 3
# ./prg_fusebit_uc -w 0
#-------------------
clean:
rm -f *.o *.map *.out *t.hex
#-------------------



Mein Source und die o.g. Makefile liegt in meinem Home dir gemeinsam mit dem dir avr in welchem sich alle avr Header befinden.

Die Sourcedatei sieht folgendermassen aus:


#include "avr/io.h"

int main(void)
{
}


...hat also erst mal keine Funktion aber es geht ja darum den Kompiler in betrieb zu bekommen.
wennn ich jetzt make aufrufe kommt folgende Fehlermeldung:


make
avr-gcc -g -mmcu=atmega16 -Wall -Wstrict-prototypes -Os -mcall-prologues -Os -c test.c
In file included from test.c:1:
avr/io.h:86:26: error: avr/sfr_defs.h: No such file or directory
avr/io.h:216:25: error: avr/iom16.h: No such file or directory
avr/io.h:304:26: error: avr/portpins.h: No such file or directory
avr/io.h:314:25: error: avr/version.h: No such file or directory
make: *** [test.o] Error 1


Aus irgentwelchen Gründen können wohl die Header nicht gefunden/darauf zugegriffen werden aber die sind doch vorhanden.

Danke schon im vorraus für eure Bemühungen.

jobe
02.03.2006, 12:26
Du musst dem gcc noch sagen, wo er nach den Headern suchen soll.
Schau mal nach, wo die bei dir sind, ich hab sie unter
/usr/avr/include
Das Verzeichnis musst du dann noch dem gcc übergeben.
Außerdem brauchst du noch das Verzeichnis für die libs, sonst kriegst du später noch ein paar Fehler.



avr-gcc -I/usr/avr/include -B/usr/avr/lib -g -mmcu=atmega16 -Wall -Wstrict-prototypes -Os -mcall-prologues -Os -c test.c

donni
02.03.2006, 12:48
Ich habe gcc, avr-c-lib und binutils nach /usr/locale/avr installiert und meine Makefile folgendermassen ergänzt:


avr-gcc -g -I/usr/locale/avr/include -B/usr/locale/avr/lib -mmcu=atmega16 -Wall -Wstrict-prototypes -Os -mcall-prologues -Os -c test.c

Und im Source include ich nun mit "#include <avr/io.h>".
Jetzt findet gcc schon die version.h etc. nur die io.h bzw iom16.h findet er immer noch nicht:


avr-gcc -g -I/usr/locale/avr/include -B/usr/locale/avr/lib -mmcu=atmega16 -Wall -Wstrict-prototypes -Os -mcall-prologues -Os -c test.c
test.c:1:20: error: avr/io.h: No such file or directory
make: *** [test.o] Error 1

Zu den Libs:
Bei mir existiert foldenes dir: /usr/local/avr/lib/lib
Muss ich -B/usr/locale/avr/lib oder -B/usr/locale/avr/lib/lib angeben? Habe beides probiert und konnte keinen Unterschied feststellen.

SprinterSB
02.03.2006, 13:16
Ich habe den avr-gcc nach dieser anleitung installiert...

Die Sourcedatei sieht folgendermassen aus:

#include "avr/io.h"

Es muss heissen
#include <avr/io.h>

An den Include-Pfaden muss eigentlich nix gefummelt werden bei korrekter Installation.

Hast du beim configure die richtige --prefix angegeben?

donni
02.03.2006, 13:30
Ich habe erst #include "avr/io.h" benutzt da ich die Header in mein Projekt dir kopiert habe. Habe aber auch in meinem 2. Beitrag geschrieben dass ich den Source verändert habe und <> statt "" benutze.
Habe alles mit --prefix=/usr/locale/avr installiert.

SprinterSB
02.03.2006, 13:33
was sagt denn?

avr-gcc -v

donni
02.03.2006, 15:57
avr-gcc -v
Using built-in specs.
Target: avr
Configured with: ../configure --target=avr --prefix=/usr/local/avr --disable-nls --enable-language=c : (reconfigured) ../configure --target=avr --prefix=/usr/local/avr --disable-nls --enable-language=c
Thread model: single
gcc version 4.0.2

SprinterSB
02.03.2006, 16:21
Oben hattest du geschrieben /usr/locale/avr

Möglicherweise hat sich in GCC 4.x auch was geändert (ich verwende avr-gcc 3.x und gedenke auch nicht umzusteigen, solange die 4er noch instabil ist).

donni
02.03.2006, 18:52
Oh du hast recht! Jetzt scheint es auch zu funktionieren, es wird eine .hex erstellt aber es kommt trotzdem noch eine Fehlermeldung:

make
avr-gcc -g -I/usr/local/avr/include -B/usr/local/avr/lib -mmcu=atmega16 -Wall -Wstrict-prototypes -Os -mcall-prologues -Os -c test.c
test.c: In function 'main':
test.c:5: warning: control reaches end of non-void function
avr-gcc -g -I/usr/local/avr/include -B/usr/local/avr/lib -mmcu=atmega16 -Wall -Wstrict-prototypes -Os -mcall-prologues -o test.out -Wl,-Map,test.map test.o
avr-objcopy -R .eeprom -O ihex test.out test.hex


Und wenn ich als Rückgabewert von main void angebe bekomme ich immer eine Fehlermeldung, jedoch steht in meinem "C für Mikrocontroller" Buch void als Rückgabewert von main.

jobe
02.03.2006, 18:57
Du gibst in der main()-Funktion keinen Wert zurück. Häng einfach ein

return 0;
ans Ende der Funktion und gut ists.

donni
02.03.2006, 19:09
Ok jetzt funktioniert alles =)
Ich danke euch allen für eure Hilfe und werde mich jetzt an uisp versuchen.

izaseba
02.03.2006, 20:24
Ich danke euch allen für eure Hilfe und werde mich jetzt an uisp versuchen.

Nimm lieber avrdude ist in meinen Augen einfacher zu handhaben

Gruß Sebastian

stochri
02.03.2006, 21:11
Hallo Zusammen,
beim ct-bot wird Eclipse mit einem patch für den avr-gcc eingesetzt.

Hat von euch schon mal jemand versucht, das für den ASURO zu machen ?
Soweit ich weiß, kann man in Eclipse ja auch den Atmega-Simulator aufrufen. Kann es sein, dass durch Eclipse die ganze Entwicklung etwas komfortabler wird ?

Gruss,
stochri

ManniMammut
02.03.2006, 21:50
Hallo Zusammen,
beim ct-bot wird Eclipse mit einem patch für den avr-gcc eingesetzt.
Kann es sein, dass durch Eclipse die ganze Entwicklung etwas komfortabler wird ?


Eher ein Plugin ;-)


Hallo Zusammen,
Kann es sein, dass durch Eclipse die ganze Entwicklung etwas komfortabler wird ?


Wer braucht außer nem Editor und nem Compiler auf der Konsole denn noch ne IDE?! ^^
Nee, ob's bequemer wird kann ich nich sagen - das muss jeder für sich entscheiden.

Mac Gyver
02.03.2006, 21:52
das mit eclipse würde mich auch interessieren
auch wenn ich gerade an einer eigenen lösung arbeite


mfg macgyver

SprinterSB
03.03.2006, 07:56
Und wenn ich als Rückgabewert von main void angebe bekomme ich immer eine Fehlermeldung, jedoch steht in meinem "C für Mikrocontroller" Buch void als Rückgabewert von main.

Der Rückgabewert von main() ist int, egal was da steht. Oder du sagst avr-gcc -ffreestending (--> GCC)

donni
06.04.2006, 21:57
ja das ist wohl compilerabhängig ich habe das buch auch gelesen und die benutzen dort einen anderen compiler dessen namen ich jetz vergessen habe

ich benutze zum programmieren erstmal ponyprog was mir aber eigentlich zum umständlich ist da man die .hex jedes mal neu ins programm laden muss
ich denke uisp is ne super variante da man es direkt über die makefile aufrufen und compilieren und programmieren mit der eingabe eines befehls erledigen erledigen kann