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

Błąd kompilacji AVR: brak reguły dla `led_eeprom.hex` na ATmega8

sarna 02 Gru 2006 16:45 2003 7
REKLAMA
  • #1 3286537
    sarna
    Poziom 24  
    Posty: 722
    Pomógł: 52
    Ocena: 34
    witam wszystkich jestem początkującym "programistą":D i mam problem z kompilacją
    oto treść programu:

    #include <avr/io.h>
    #define LED_ON (DDRB,PB1);(PORTB,PB1)

    int main (void)
    {
    LED_ON;

    for (;;)
    {

    }
    return (0);
    }

    a oto błąd przy kompilacji:

    > "make.exe" all
    avr-gcc -g -Wall -O2 -mmcu=atmega8 -c -o led.o led.c
    avr-gcc -g -Wall -O2 -mmcu=atmega8 -Wl,-Map,led.map -o led.elf led.o
    avr-objdump -h -S led.elf > led.lst
    avr-objcopy -j .text -j .data -O ihex led.elf led.hex
    avr-objcopy -j .text -j .data -O binary led.elf led.bin
    avr-objcopy -j .text -j .data -O srec led.elf led.srec
    make.exe: *** No rule to make target `led_eeprom.hex', needed by `ehex'. Stop.

    > Process Exit Code: 2
    > Time Taken: 00:01

    należy dodać że używam atmega8
    prosze o pomoc i z góry dzięki
  • REKLAMA
  • #2 3287283
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1463
    Masz problem nie z kompilacją, ale z 'projektem' i programem make.
    Zarządza on co po czym zrobić (np. kompilować po zmianie soursów itd) na podstawie reguł.
    I nie ma reguły na tego 'hexa'. Nie wie czy/jak/dlaczego go zrobić.

    To może być w pliku makefile, ale nazwa może też być inna. Poszukaj tej nazwy pliku i tego czegoś 'ehex'.

    Robiłes go sam czy wygenerował go automat?
  • REKLAMA
  • #3 3288574
    sarna
    Poziom 24  
    Posty: 722
    Pomógł: 52
    Ocena: 34
    makefile było w winavr-rze oryginalnie
    podaje treść:

    PRG = led
    OBJ = led.o
    MCU_TARGET = atmega8
    OPTIMIZE = -O2

    DEFS =
    LIBS =

    # You should not have to change anything below here.

    CC = avr-gcc

    # Override is only needed by avr-lib build system.

    override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS)
    override LDFLAGS = -Wl,-Map,$(PRG).map

    OBJCOPY = avr-objcopy
    OBJDUMP = avr-objdump

    all: $(PRG).elf lst text eeprom

    $(PRG).elf: $(OBJ)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)

    clean:
    rm -rf *.o $(PRG).elf *.eps *.png *.pdf *.bak
    rm -rf *.lst *.map $(EXTRA_CLEAN_FILES)

    lst: $(PRG).lst

    %.lst: %.elf
    $(OBJDUMP) -h -S $< > $@

    # Rules for building the .text rom images

    text: hex bin srec

    hex: $(PRG).hex
    bin: $(PRG).bin
    srec: $(PRG).srec

    %.hex: %.elf
    $(OBJCOPY) -j .text -j .data -O ihex $< $@

    %.srec: %.elf
    $(OBJCOPY) -j .text -j .data -O srec $< $@

    %.bin: %.elf
    $(OBJCOPY) -j .text -j .data -O binary $< $@
    # Rules for building the .eeprom rom images

    eeprom: ehex ebin esrec

    ehex: $(PRG)_eeprom.hex
    ebin: $(PRG)_eeprom.bin
    esrec: $(PRG)_eeprom.srec

    %_eeprom.hex: %.elf
    $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@

    %_eeprom.srec: %.elf
    $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@

    %_eeprom.bin: %.elf
    $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O binary $< $@

    # Every thing below here is used by avr-libc's build system and can be ignored
    # by the casual user.

    FIG2DEV = fig2dev
    EXTRA_CLEAN_FILES = *.hex *.bin *.srec

    dox: eps png pdf

    eps: $(PRG).eps
    png: $(PRG).png
    pdf: $(PRG).pdf

    %.eps: %.fig
    $(FIG2DEV) -L eps $< $@

    %.pdf: %.fig
    $(FIG2DEV) -L pdf $< $@


    %.png: %.fig
    $(FIG2DEV) -L png $< $@


    gdy zmieniłem 55 linijkę
    ehex: $(PRG)_eeprom.hex
    na ehex: $(PRG)_eeprom.ehex
    wyskoczył mi bezsensowny komunikat:
    make.exe: *** No rule to make target `led_eeprom.ehex', needed by `ehex'. Stop.

    nie wiem o co tu chodzi jeszcze sie na tym nie znam mam nadzieje ze rozwiążemy problem
  • REKLAMA
  • #4 3288997
    JacekCz
    Poziom 42  
    Posty: 8670
    Pomógł: 760
    Ocena: 1463
    sarna napisał:
    makefile było w winavr-rze oryginalnie
    podaje treść:

    PRG = led
    OBJ = led.o
    MCU_TARGET = atmega8
    OPTIMIZE = -O2

    DEFS =
    LIBS =

    # You should not have to change anything below here.

    CC = avr-gcc

    # Override is only needed by avr-lib build system.

    override CFLAGS = -g -Wall $(OPTIMIZE) -mmcu=$(MCU_TARGET) $(DEFS)
    override LDFLAGS = -Wl,-Map,$(PRG).map

    OBJCOPY = avr-objcopy
    OBJDUMP = avr-objdump

    all: $(PRG).elf lst text eeprom

    $(PRG).elf: $(OBJ)
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LIBS)

    clean:
    rm -rf *.o $(PRG).elf *.eps *.png *.pdf *.bak
    rm -rf *.lst *.map $(EXTRA_CLEAN_FILES)

    lst: $(PRG).lst

    %.lst: %.elf
    $(OBJDUMP) -h -S $< > $@

    # Rules for building the .text rom images

    text: hex bin srec

    hex: $(PRG).hex
    bin: $(PRG).bin
    srec: $(PRG).srec

    %.hex: %.elf
    $(OBJCOPY) -j .text -j .data -O ihex $< $@

    %.srec: %.elf
    $(OBJCOPY) -j .text -j .data -O srec $< $@

    %.bin: %.elf
    $(OBJCOPY) -j .text -j .data -O binary $< $@
    # Rules for building the .eeprom rom images

    eeprom: ehex ebin esrec

    ehex: $(PRG)_eeprom.hex
    ebin: $(PRG)_eeprom.bin
    esrec: $(PRG)_eeprom.srec

    %_eeprom.hex: %.elf
    $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O ihex $< $@

    %_eeprom.srec: %.elf
    $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O srec $< $@

    %_eeprom.bin: %.elf
    $(OBJCOPY) -j .eeprom --change-section-lma .eeprom=0 -O binary $< $@

    # Every thing below here is used by avr-libc's build system and can be ignored
    # by the casual user.

    FIG2DEV = fig2dev
    EXTRA_CLEAN_FILES = *.hex *.bin *.srec

    dox: eps png pdf

    eps: $(PRG).eps
    png: $(PRG).png
    pdf: $(PRG).pdf

    %.eps: %.fig
    $(FIG2DEV) -L eps $< $@

    %.pdf: %.fig
    $(FIG2DEV) -L pdf $< $@


    %.png: %.fig
    $(FIG2DEV) -L png $< $@


    gdy zmieniłem 55 linijkę
    ehex: $(PRG)_eeprom.hex
    na ehex: $(PRG)_eeprom.ehex
    wyskoczył mi bezsensowny komunikat:
    make.exe: *** No rule to make target `led_eeprom.ehex', needed by `ehex'. Stop.

    nie wiem o co tu chodzi jeszcze sie na tym nie znam mam nadzieje ze rozwiążemy problem


    Komunikat jest sensowny.
    Powiedz, dlaczego właściwie zmienaiłeś skoro nie rozumiesz?

    Ja te z do konca nie rozumiem (nie używam make na co dzień), ale zerwałeś łańcuch zależności. Do kompletu by trzeba zmienic we wszystkich (a może nie wszystkich, ale większości) lewych częsciach reguły hex na ehex tylko po co.
    Program make skacze z reguły na regułe. Reguły są konkretne (na jeden plik, może nieściśle plik, dokładnie to 'target') lub szerokie, np. na rozszerzenie pliku. I te reguły sie zerwały i jest SENSOWNY komunikat.

    Sorry ale moja wiedza z make zatrzymała się z 8-10 lat temu.
  • #5 3292790
    wierk
    Poziom 11  
    Posty: 18
    Dla początkujących dobrze jest zrobić następująco - ja tak zaczynałem programować, bo mi makefile nie chciały działać, a szczególnie te gotowe -

    Skopiować sobie jakiś cały katalog z możliwie najprostrzym przykładowym programem (w WinAVR jest katalog z przykładami), nie zmieniać żadnych nazw, otworzyć odpowiedni plik, np. "demo.c", skasować treść programu, wpisać swój i skompilować.

    Powodzenia
  • REKLAMA
  • #6 3344474
    sarna
    Poziom 24  
    Posty: 722
    Pomógł: 52
    Ocena: 34
    Wielkie dzięki Wierk zrobiłem tak jak powiedziałeś i atmega pracuje polecam wszystkim na początek ten sposób :D
  • #7 3346484
    johny_w
    Poziom 24  
    Posty: 673
    Pomógł: 80
    Ocena: 63
    Witam. A ja polecam AVRStudio zintegrowane z Win-AVR (wciskamy F7 i po kłopocie). Gdybym oprócz uczenia się AVRów, języka C i planowania programu miał się jeszcze głowić jak napisać makefile'a - chyba dostałbym w głowę.

    Po to dostajemy gotowe (i darmowe) narzędzia, abyśmy mogli skupić się na własnym projekcie a nie na metodach jego kompilacji - takie jest moje zdanie, pozdrawiam.
  • #8 3364269
    Innos
    Poziom 11  
    Posty: 75
    Pozwolę sobie dokączyć wypowiedz poprzednika.
    Korzystając z AVR Studio 4.12 + SP1,SP2,SP3,SP4 i sprzęgnięty z nim WinAVR ver. 20060421 można bezkonfliktowo pisać programy w C, a plik make jest generowany prawie automatycznie.
    Gdy już sobie stworzysz nowy projekt w AVR Studio, to wejdź w następujące opcje.

    Project/Configuration Options. W polu "active configuration" wybierz "Edit Configurations" , teraz w wyświetlonym okienku naciśni "default" a następnie przycisk "rename" i nadaj taka sama nazwę jak całemu projektowi. Teraz tylko dajesz "Rename" i "OK".
    Poniżej jest okienko gdzie pisze "Freguency" - tam wpisz częstotliwość kwarcu w Hz. 1MHz to 1000000 Hz.
    Pod spodem jest już ostatnia opcja dotyczącą optymalizacji kodu, ustaw ja na "03"

    Tym samym mamy w pełni skonfigurowany plik "make" pod nasz projekt.
    Po naciśnięciu F7, plik hex zostanie wygenerowany w katalogu naszego projektu.
    Życze owocnej pracy.

Podsumowanie tematu

✨ Problem dotyczy błędu kompilacji w projekcie AVR dla mikrokontrolera ATmega8, gdzie narzędzie make zgłasza brak reguły do utworzenia pliku led_eeprom.hex potrzebnego przez cel ehex. Przyczyną jest niepoprawna lub niekompletna definicja reguł w pliku makefile, który pochodzi z WinAVR. Wskazano, że makefile zarządza zależnościami i procesem kompilacji, a brak reguły dla pliku eeprom powoduje zatrzymanie procesu. Zalecane jest korzystanie z oryginalnych, niezmienionych przykładów z WinAVR, aby uniknąć problemów z makefile. Alternatywnie, polecono użycie środowiska AVR Studio zintegrowanego z WinAVR, które automatycznie generuje poprawne pliki make i ułatwia kompilację. Konfiguracja projektu w AVR Studio pozwala na automatyczne tworzenie pliku hex i eliminuje konieczność ręcznej edycji makefile. Dzięki temu początkujący programiści mogą skupić się na pisaniu kodu, a nie na problemach z narzędziami kompilacyjnymi.
Podsumowanie wygenerowane przez AI na podstawie treści dyskusji.
REKLAMA