Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

Błąd przy kompilacji programu

stichus 01 Lip 2012 12:44 3524 16
  • #1 01 Lip 2012 12:44
    stichus
    Poziom 9  

    Witam!

    Rozpoczynam właśnie naukę programowania mikrokontrolerów AVR. Pomaga mi ten kurs.
    Mam problem z kompilacją pierwszego programu z kursu. Oto jego kod

    Code:
    /* "led.c" - programik do testowania środowiska WinAVR */
    
    /* układ ATmega 1MHz */
    /* PB0,PB1 - diody LED; PD0 - przycisk */

    #define F_CPU 1000000L
    #include <avr/io.h>
    #include <util/delay.h>               

    int main(void)
    {
        DDRB  |= _BV(0)|_BV(1);
        PORTB |= _BV(0);
        PORTB &= ~_BV(1);
        DDRD  &= ~_BV(0);
        PORTD |=  _BV(0);

        while (1)
        {
            PORTB ^=_BV(0);
            PORTB ^=_BV(1);
           
            _delay_ms((PIND & _BV(0))? 1000: 200);
        }
    }


    Próbowałem skompilować ten program w WinAVR, ale pokazywały mi się błędy. Polecono mi skorzystanie z innego programu, wybrałem Eclipse z pluginem AVR, który sam wykonuje pliki Makefile. Po zrobieniu wszystkiego zgodnie z instrukcjami
    Pojawia mi się taki błąd
    Code:
    Description    Resource    Path    Location    Type 
    
    make: [led2.lss] Error 128 (ignored)                C/C++ Problem


    oraz 2 ostrzeżenia
    Code:
    Description    Resource    Path    Location    Type 
    
    "F_CPU" redefined    led.c    /led2    line 12    C/C++ Problem


    Code:
    Description    Resource    Path    Location    Type 
    
    #warning "Compiler optimizations disabled; functions from <util/delay.h> won't work as designed"    led2        line 90, external location: e:\winavr-20100110\avr\include\util\delay.h    C/C++ Problem

    Czy mogę zignorować te ostrzeżenia? Jak naprawić pojawiający się błąd? Macie jakieś pomysły, co może być jego przyczyną?

    0 16
  • #2 01 Lip 2012 12:54
    Krauser
    Poziom 26  

    Wyrzuć #define F_CPU 1000000L
    Częstotliwość wybiera się w okienku po wybraniu Project->Propertis. Tam też znajdziesz wybór optymalizacji.

    0
  • #3 01 Lip 2012 12:54
    drzasiek
    Specjalista - Mikrokontrolery

    Podwójnie definiujesz zegar, ale to ostrzeżenie, nie błąd.
    Problem też z optymalizacją.
    Wrzuć wszystko co wypluwa, nie urywki.
    Jeśli dopiero zaczynasz, i nie jesteś przyzwyczajony do żadnego środowiska, warto zacząć od dedykowanego środowiska Atmela:
    http://mikrokontrolery.blogspot.com/2011/04/atmel-studio-pelne-ide-avr-arm-cz1.html
    Jest tam opisane jak stworzyć i skonfigurować pierwszy projekt.
    Masz tam również informację, dlaczego w przypadku AVR nie warto korzystać z Eclipse.
    Poczytaj też o definiowaniu F_CPU:
    http://mikrokontrolery.blogspot.com/2011/03/fcpu-gcc-gdzie-definiowac.html

    0
  • #4 01 Lip 2012 13:02
    Krauser
    Poziom 26  

    drzasiek napisał:
    Masz tam również informację, dlaczego w przypadku AVR nie warto korzystać z Eclipse.
    Ilu programistów tyle opinii, ale moim zdaniem warto używać Eclipse chociażby z tego powodu, że później łatwiej przesiąść się na inne mikrokontrolery.

    0
  • #5 01 Lip 2012 13:04
    stichus
    Poziom 9  

    Wklejam pełen komunikat z konsoli, już po usunięciu częstotliwości z kodu (ostrzeżenia zniknęły).

    Code:
    13:01:24 **** Incremental Build of configuration Release for project led ****
    
    make all
    Building file: ../led.c
    Invoking: AVR Compiler
    avr-gcc -Wall -Os -fpack-struct -fshort-enums -std=gnu99 -funsigned-char -funsigned-bitfields -mmcu=atmega8 -DF_CPU=1000000UL -MMD -MP -MF"led.d" -MT"led.d" -c -o "led.o" "../led.c"
    Finished building: ../led.c
     
    Building target: led.elf
    Invoking: AVR C Linker
    avr-gcc -Wl,-Map,led.map -mmcu=atmega8 -o "led.elf"  ./led.o   
    Finished building target: led.elf
     
    Create Flash image (ihex format)
    avr-objcopy -R .eeprom -O ihex led.elf  "led.hex"
    Finished building: led.hex
     
    Create eeprom image (ihex format)
    avr-objcopy -j .eeprom --no-change-warnings --change-section-lma .eeprom=0 -O ihex led.elf  "led.eep"
    Finished building: led.eep
     
    Invoking: AVR Create Extended Listing
    avr-objdump -h -S led.elf  >"led.lss"
          0 [main] sh 5644 sync_with_child: child 5272(0x124) died before initialization with status code 0x0
         11 [main] sh 5644 sync_with_child: *** child state waiting for longjmp
    /usr/bin/sh: fork: Resource temporarily unavailable
    make: [led.lss] Error 128 (ignored)
    Finished building: led.lss
     
    Invoking: Print Size
    avr-size --format=avr --mcu=atmega8 led.elf
    AVR Memory Usage
    ----------------
    Device: atmega8

    Program:    3072 bytes (37.5% Full)
    (.text + .data + .bootloader)

    Data:          8 bytes (0.8% Full)
    (.data + .bss + .noinit)


    Finished building: sizedummy
     

    13:01:30 Build Finished (took 6s.228ms)

    0
  • #6 01 Lip 2012 13:09
    drzasiek
    Specjalista - Mikrokontrolery

    Krauser Oczywiście, ale na chwilę obecną WinAVR umarł, dodatkowo Eclipse skonfigurowane dla AVR ma dość spore ograniczenia również z tego powodu.
    Jak ktoś ma się uczyć, to lepiej niech uczy się na czymś, co ma pełne wsparcie i nie nakłada tyle ograniczeń. Dodatkowo AS posiada symulator, tak ważny dla początkujących.

    0
  • #7 01 Lip 2012 13:15
    Krauser
    Poziom 26  

    drzasiek napisał:
    na chwilę obecną WinAVR umarł
    Jakby umarł to nikt by go nie używał. Po prostu ktoś uznał, że jeśli udoskonala się coś zbyt długo to na pewno się to popsuje (np. AVRStudio 5).

    0
  • #8 01 Lip 2012 13:23
    drzasiek
    Specjalista - Mikrokontrolery

    Umarł umarł. Albo przynajmniej leży w szpitalu w stanie krytycznym :)
    Teraz korzystanie z Eclipse dla AVR to jak jeździć samochodem, do którego już nie produkują części zamiennych. Natomiast korzystanie z AS6 to jak jeździć nówką samochodem, u którego zużyte podzespoły wymieniają się same.

    Oczywiście nic na siłę, każdy ma wybór.
    Po bugach AS5 powstała jakaś nieprzyjemna opinia o samych środowiskach Atmela i skorzystali na tym miłośnicy Eclipse, aby je wypromować rzucając błoto na AS.
    Warto teraz odbić piłeczkę, bo aby dokonać wyboru trzeba wybór mieć.

    Oczywiście do Eclipse nic nie mam, bo sam korzystam.
    Ale nie dla AVR, palić mostów za sobą nie zamierzam.

    0
  • #9 01 Lip 2012 13:37
    tmf
    Moderator Mikrokontrolery Projektowanie

    Z drugiej strony nie wiem w jaki sposób IDE miałoby utrudniać przesiadkę na inne MCU. W końcu to tylko edytor + trochę bajerów. Z drugiej strony AS6 akurat tą przesiadkę ułatwia, bo w ramach jednego IDE jest obsługa AVR8, AVR32 i ARM.

    0
  • #10 01 Lip 2012 17:14
    stichus
    Poziom 9  

    Po próbie kompilacji w AtmelStudio też jest błąd. Log wygląda następująco

    Code:
    ------ Build started: Project: led, Configuration: Debug AVR ------
    
    Build started.
    Project "led.cproj" (default targets):
    Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
    Target "CoreBuild" in file "E:\Program Files (x86)\Atmel\Atmel Studio 6.0\Vs\Compiler.targets" from project "E:\AVR\led\led\led.cproj" (target "Build" depends on it):
       Task "RunCompilerTask"
          E:\Program Files (x86)\Atmel\Atmel Studio 6.0\make\make.exe all
          Building file: .././led.c
          Invoking: AVR/GNU C Compiler : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2
          "E:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe" -funsigned-char -funsigned-bitfields -O1 -fpack-struct -fshort-enums -g2 -Wall -c -std=gnu99 -MD -MP -MF "led.d" -MT"led.d" -MT"led.o"  -mmcu=atmega8   -o"led.o" ".././led.c"
          In file included from .././led.c:10:0:
          e:\program files (x86)\atmel\atmel studio 6.0\extensions\atmel\avrgcc\3.4.0.65\avrtoolchain\bin\../lib/gcc/avr/4.6.2/../../../../avr/include/util/delay.h: In function 'main':
    e:\program files (x86)\atmel\atmel studio 6.0\extensions\atmel\avrgcc\3.4.0.65\avrtoolchain\bin\../lib/gcc/avr/4.6.2/../../../../avr/include/util/delay.h(164,28): __builtin_avr_delay_cycles expects an integer constant.
          make: *** [led.o] Error 1
       Done executing task "RunCompilerTask" -- FAILED.
    Done building target "CoreBuild" in project "led.cproj" -- FAILED.
    Done building project "led.cproj" -- FAILED.

    Build FAILED.
    ========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========

    0
  • #11 01 Lip 2012 17:33
    435758
    Użytkownik usunął konto  
  • Pomocny post
    #13 01 Lip 2012 17:46
    drzasiek
    Specjalista - Mikrokontrolery
  • Pomocny post
    #14 01 Lip 2012 17:47
    435758
    Użytkownik usunął konto  
  • #15 01 Lip 2012 20:42
    stichus
    Poziom 9  

    Ani jedno, ani drugie rozwiązanie nie zadziałało.

    Log z kompilacji rozwiązania Drzaśka

    Code:
    ------ Build started: Project: led, Configuration: Debug AVR ------
    
    Build started.
    Project "led.cproj" (default targets):
    Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
    Target "CoreBuild" in file "E:\Program Files (x86)\Atmel\Atmel Studio 6.0\Vs\Compiler.targets" from project "E:\AVR\led\led\led.cproj" (target "Build" depends on it):
       Task "RunCompilerTask"
          E:\Program Files (x86)\Atmel\Atmel Studio 6.0\make\make.exe all
          In file included from .././led.c:10:0:
          e:\program files (x86)\atmel\atmel studio 6.0\extensions\atmel\avrgcc\3.4.0.65\avrtoolchain\bin\../lib/gcc/avr/4.6.2/../../../../avr/include/util/delay.h: In function 'main':
          Building file: .././led.c
          Invoking: AVR/GNU C Compiler : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2
          "E:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe" -funsigned-char -funsigned-bitfields -O1 -fpack-struct -fshort-enums -g2 -Wall -c -std=gnu99 -MD -MP -MF "led.d" -MT"led.d" -MT"led.o"  -mmcu=atmega8   -o"led.o" ".././led.c"
    e:\program files (x86)\atmel\atmel studio 6.0\extensions\atmel\avrgcc\3.4.0.65\avrtoolchain\bin\../lib/gcc/avr/4.6.2/../../../../avr/include/util/delay.h(164,28): __builtin_avr_delay_cycles expects an integer constant.
          make: *** [led.o] Error 1
       Done executing task "RunCompilerTask" -- FAILED.
    Done building target "CoreBuild" in project "led.cproj" -- FAILED.
    Done building project "led.cproj" -- FAILED.

    Build FAILED.
    ========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========


    A tu log po kompilacji rozwiązania majeranka53

    Code:
    ------ Build started: Project: led, Configuration: Debug AVR ------
    
    Build started.
    Project "led.cproj" (default targets):
    Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
    Target "CoreBuild" in file "E:\Program Files (x86)\Atmel\Atmel Studio 6.0\Vs\Compiler.targets" from project "E:\AVR\led\led\led.cproj" (target "Build" depends on it):
       Task "RunCompilerTask"
          E:\Program Files (x86)\Atmel\Atmel Studio 6.0\make\make.exe all
          In file included from .././led.c:10:0:
          e:\program files (x86)\atmel\atmel studio 6.0\extensions\atmel\avrgcc\3.4.0.65\avrtoolchain\bin\../lib/gcc/avr/4.6.2/../../../../avr/include/util/delay.h: In function 'main':
          Building file: .././led.c
          Invoking: AVR/GNU C Compiler : (AVR_8_bit_GNU_Toolchain_3.4.0_663) 4.6.2
          "E:\Program Files (x86)\Atmel\Atmel Studio 6.0\extensions\Atmel\AVRGCC\3.4.0.65\AVRToolchain\bin\avr-gcc.exe" -funsigned-char -funsigned-bitfields -O1 -fpack-struct -fshort-enums -g2 -Wall -c -std=gnu99 -MD -MP -MF "led.d" -MT"led.d" -MT"led.o"  -mmcu=atmega8   -o"led.o" ".././led.c"
    e:\program files (x86)\atmel\atmel studio 6.0\extensions\atmel\avrgcc\3.4.0.65\avrtoolchain\bin\../lib/gcc/avr/4.6.2/../../../../avr/include/util/delay.h(164,28): __builtin_avr_delay_cycles expects an integer constant.
          make: *** [led.o] Error 1
       Done executing task "RunCompilerTask" -- FAILED.
    Done building target "CoreBuild" in project "led.cproj" -- FAILED.
    Done building project "led.cproj" -- FAILED.

    Build FAILED.
    ========== Build: 0 succeeded or up-to-date, 1 failed, 0 skipped ==========



    Jakieś inne pomysły?

    0
  • Pomocny post
    #16 01 Lip 2012 21:31
    435758
    Użytkownik usunął konto  
  • #17 01 Lip 2012 21:50
    stichus
    Poziom 9  

    Jeszcze raz spróbowałem skompilować program i... działa.
    Nie wiem, co przedtem robiłem nie tak, ale wydaje mi się, że klikałem build solution, zamiast build led, który był nieaktywny.

    Wybaczcie zamieszanie na koniec i wielkie dzięki za pomoc, bo nareszcie udało mi się skompilować ten program!

    0