- Labornetzteil AliExpress         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 17

Thema: avr-gcc unter linux

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    17.10.2005
    Ort
    Eberswalde
    Alter
    37
    Beiträge
    40

    avr-gcc unter linux

    Anzeige

    Praxistest und DIY Projekte
    Ich habe den avr-gcc nach dieser anleitung installiert:
    http://www.linuxfocus.org/Deutsch/No...ml#352lfindex3
    und zum kompilieren die Makefile aus dem mega8ledtest programm für mich angepasst.
    Makefile:
    Code:
    # 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|wrfusecrystal"
    	@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:
    Code:
    #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.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    27.03.2005
    Beiträge
    14
    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.

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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    17.10.2005
    Ort
    Eberswalde
    Alter
    37
    Beiträge
    40
    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.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802

    Re: avr-gcc unter linux

    Zitat Zitat von donni
    Ich habe den avr-gcc nach dieser anleitung installiert...

    Die Sourcedatei sieht folgendermassen aus:
    Code:
    #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?
    Disclaimer: none. Sue me.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    17.10.2005
    Ort
    Eberswalde
    Alter
    37
    Beiträge
    40
    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.

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    was sagt denn?

    avr-gcc -v
    Disclaimer: none. Sue me.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    17.10.2005
    Ort
    Eberswalde
    Alter
    37
    Beiträge
    40
    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

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    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).
    Disclaimer: none. Sue me.

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    17.10.2005
    Ort
    Eberswalde
    Alter
    37
    Beiträge
    40
    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.

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    27.03.2005
    Beiträge
    14
    Du gibst in der main()-Funktion keinen Wert zurück. Häng einfach ein
    Code:
    return 0;
    ans Ende der Funktion und gut ists.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress