logo elektroda
logo elektroda
X
logo elektroda
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

[ethernut][gcc] problem z kompilacją

Skyttop 06 Lis 2009 07:47 1932 3
  • #1 7221998
    Skyttop
    Poziom 11  
    Witam

    Do uruchomienia systemu ethernut korzystam z kursu "Ethernet i AVR'y" z Elektroniki Praktycznej. Zainstalowałem NutOS'a (w wersji 4.8.5) i wygenerowałem biblioteki systemu, tak jak w instrukcji zamieszczonej w kursie. Skopiowałem potrzebne pliki do WinAVR, postępując zgodnie z instrukcją i próbowałem uruchomoć pierwszy program "hello word". Kod poniżej:

    plik hello.c
    
    #include <dev/board.h>
    #include <stdio.h>
    #include <io.h>
    
    #define UART_SPEED 38400
    
    main()
    {
        u_long baudrate = UART_SPEED;
    
        NutRegisterDevice (&DEV_DEBUG, 0, 0);
        freopen (DEV_DEBUG_NAME, "w", stdout);
        _ioctl(_fileno(stdout), UART_SETSPEED, &baudrate);
    
        printf("Hello, world!\n");
    
        for(;;);
    }
    


    Plik makefile:
    
    #
    # makefile dla zestawu Ethernut BTC.
    # nie modyfikuj, jesli nie znasz sie na Makefilach ;)
    #
    
    include Sources
    
    # architektura, na ktora Ethernut ma byc kompilowany
    ARCH=avr
    
    # nazwa polecenia kompilatora GCC
    CC=avr-gcc
    
    # opcje kompilatora C
    CFLAGS= $(MY_CFLAGS) -mmcu=atmega128 -D__HARVARD_ARCH__ -DNUT_CPU_FREQ=16000000 -DETHERNUT1
    
    # nazwa polecenia programu objcopy
    OBJCOPY=avr-objcopy
    
    # nazwa polecenia programu crurom
    CRUROM=crurom
    
    #nazwa pliku kompilatora GCC (np. avr-gcc.exe)
    GCCNAME=$(shell which $(CC).exe)
    
    # katalog, w którym jest zainstalowane GCC
    GCCDIR=$(dir $(GCCNAME))
    
    
    OBJS = $(SOURCES:.c=.o)
    
    CFLAGS= $(MY_CFLAGS) -mmcu=atmega128 -D__HARVARD_ARCH__ -DNUT_CPU_FREQ=16000000 -DETHERNUT1
    
    all:	$(OBJS)
    ifneq "$(CRUROM_DIR)" ""
    	${CRUROM} -r -o$(CRUROM_DIR)_crurom.c $(CRUROM_DIR)
    	${CC} -c $(CRUROM_DIR)_crurom.c -o $(CRUROM_DIR)_crurom.o $(CFLAGS) -I$(GCCDIR)../NutOS/$(ARCH)/include
    	${CC} -o $(OUTPUT).elf -Wl,--defsym=main=0 -mmcu=atmega128 $(GCCDIR)../NutOS/$(ARCH)/lib/nutinit.o $(OBJS)  $(CRUROM_DIR)_crurom.o -L$(GCCDIR)../NutOS/$(ARCH)/lib $(LIBS) 
    
    else
    	${CC} -o $(OUTPUT).elf -Wl,--defsym=main=0 -mmcu=atmega128 $(GCCDIR)../NutOS/$(ARCH)/lib/nutinit.o $(OBJS) -L$(GCCDIR)../NutOS/$(ARCH)/lib $(LIBS) 
    endif
    	${OBJCOPY} -O ihex -R .eeprom $(OUTPUT).elf $(OUTPUT).hex
    	${OBJCOPY} -O binary -R .eeprom $(OUTPUT).elf $(OUTPUT).bin
    
    %.o:	%.c
    	${CC} -c $^ -o $@ $(CFLAGS) -I$(GCCDIR)../NutOS/$(ARCH)/include
    
    clean:
    	rm -f $(OBJS) $(OUTPUT).bin $(OUTPUT).hex $(OUTPUT).elf
    ifneq "$(CRUROM_DIR)" ""
    	rm -f $(CRUROM_DIR)_crurom.c $(CRUROM_DIR)_crurom.o
    endif
    
    isp: all
    	avrdude -V -c stk200 -p m128 -Uflash:w:$(OUTPUT).hex
    


    plik sources:
    
    #nazwa pliku wyjsciowego - bez rozszerzenia
    #musi byc taka sama jak nazwa projektu w AvrStudio (jesli uzywamy)
    OUTPUT = hello
    
    #lista plikow zrodlowych projektu
    SOURCES = hello.c
    
    #dodatkowe flagi kompilatora GCC
    MY_CFLAGS = -Os
    
    #dolaczone biblioteki
    LIBS =  -lnutarch -lnutos -lnutdev -lnutarch -lnutcrt
    
    #katalog z systemem plikow do umieszczenia w pamieci flash mikrokontrolera
    #jesli nie potrzebujemy, zostawic pusty
    CRUROM_DIR = 
    


    a oto, co dostałem w wyniku kompilacji:

    
    > "make.exe" all
    avr-gcc -c hello.c -o hello.o -Os -mmcu=atmega128 -D__HARVARD_ARCH__ -DNUT_CPU_FREQ=16000000 -DETHERNUT1 -IC:\ Files\winavr\bin\../NutOS/avr/include
    hello.c:1:23: error: dev/board.h: No such file or directory
    hello.c:3:16: error: io.h: No such file or directory
    hello.c: In function 'main':
    hello.c:9: error: 'u_long' undeclared (first use in this function)
    hello.c:9: error: (Each undeclared identifier is reported only once
    hello.c:9: error: for each function it appears in.)
    hello.c:9: error: expected ';' before 'baudrate'
    hello.c:11: error: 'DEV_DEBUG' undeclared (first use in this function)
    hello.c:12: error: 'DEV_DEBUG_NAME' undeclared (first use in this function)
    hello.c:13: error: 'UART_SETSPEED' undeclared (first use in this function)
    hello.c:13: error: 'baudrate' undeclared (first use in this function)
    make.exe: *** [hello.o] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:01
    


    Czy może mi ktoś powiedzieć, co zrobiłem źle? Kompiluję w WinAVR 20081205
  • Pomocny post
    #3 7222566
    szelus
    Poziom 34  
    Czy Twój katalog, w którym zainstalowałeś WinAVR, ma na początku nazwy spację ("<spacja> Files")? Bo na to mi wygląda...
    Jeżeli tak, to najlepiej zainstaluj wszystko jeszcze raz, tylko bez spacji w nazwach katalogów.
  • #4 7222969
    Skyttop
    Poziom 11  
    ta spacja to wynik kopiowania do pliku tekstowego. W rzeczywistości spacji nie ma, więc to może nie być ten problem. To wygląda tak, jakby kompilator nie widział dołączonych nagłówków, ale nie wiem dlaczego.

    Dodano po 22 [minuty]:

    Sorki, a jednak jest spacja, bo zainstalowałem winavr w Program Files. Wyinstalowałem WinAVR i zainstalowałem do c:\winavr. Włączyłem kompilator, poprzednich błędów już nie ma, ale pojawiło się coś nowego:

    
    > "make.exe" all
    avr-gcc -c hello.c -o hello.o -Os -mmcu=atmega128 -D__HARVARD_ARCH__ -DNUT_CPU_FREQ=16000000 -DETHERNUT1 -IC:\WinAVR\bin\../NutOS/avr/include
    avr-gcc -o hello.elf -Wl,--defsym=main=0 -mmcu=atmega128 C:\WinAVR\bin\../NutOS/avr/lib/nutinit.o hello.o -LC:\WinAVR\bin\../NutOS/avr/lib -lnutarch -lnutos -lnutdev -lnutarch -lnutcrt 
    C:\WinAVR\bin\../NutOS/avr/lib\libnutarch.a(eeprom.o): In function `.7_start':
    eeprom.c:(.text+0xe): undefined reference to `__eeprom_read_byte_1C1D1E'
    C:\WinAVR\bin\../NutOS/avr/lib\libnutarch.a(eeprom.o): In function `OnChipNvMemSave':
    eeprom.c:(.text+0x3a): undefined reference to `__eeprom_read_byte_1C1D1E'
    eeprom.c:(.text+0x4a): undefined reference to `__eeprom_write_byte_1C1D1E'
    make.exe: *** [all] Error 1
    
    > Process Exit Code: 2
    > Time Taken: 00:01
    


    Co należy jeszcze poprawić?

    Dodano po 9 [minuty]:

    Problem rozwiązany. Brakowało kilku plików. Dzięki wielkie za pomoc!
REKLAMA