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

Dziwne zachowanie kompilatora AVR-GCC

Digitaler 01 Paź 2009 18:09 1679 4
  • #1 7079445
    Digitaler
    Poziom 2  
    Używam linuxa Gentoo, i kompilatora AVR-GCC. Niedawno zabrałem się za programowanie AVR-ów. Startuję na AT90S2313. Pierwsze programy pisałem w bascomie, ale musiałem je kompilować na osobnym komputerze, na którym jest windows. Postanowiłem przerzucić się na C, ponieważ powinien dobrze chodzić na linuxie, a poza tym pisałem już programy na PC w C++, łatwo mi będzie nauczyć się C. Ja to na początku bywa, nie obyło się bez problemów, ale po trzech dniach udało mi się skompilować AVR-GCC. I tutaj zaczynają się schody. Napisałem prosty program dołączyłem do niego tylko avr/io.h oraz util/delay.h, wydaje mi się, że to absolutne minimum. W programie dałem tylko pętlę nieskończoną for, oraz polecenie _delay_ms(200);. Po kompilacji za pomocą avrdude wgrywałem plik *.hex do procesora, i program wywalił mi następujący komunikat:
    avrdude -c stk200 -p t2313 -U flash:w:prog1.hex
    
    avrdude: AVR device initialized and ready to accept instructions
    
    Reading | ################################################## | 100% 0.00s
    
    avrdude: Device signature = 0x1e910a
    avrdude: NOTE: FLASH memory has been specified, an erase cycle will be performed
             To disable this feature, specify the -D option.
    avrdude: erasing chip
    avrdude: reading input file "prog1.hex"
    avrdude: input file prog1.hex auto detected as Intel Hex
    avrdude: ERROR: address 0x0810 out of range at line 129 of prog1.hex
    avrdude: write to file 'prog1.hex' failed
    
    avrdude: safemode: Fuses OK
    
    avrdude done.  Thank you.


    Wydaje mi się, że plik hex nie mieści się w pamięci FLASH procka. Jeśli tak, to w jaki sposób tak mały programik ma taki rozmiar? Dodam, że avrdude ładował programy z bascoma poprawnie. A ponoć kompilatory C dają mniejsze pliki wynikowe. Wygooglowałem coś na temat optymizacji w AVR-GCC, ale żadnych szczegółów.
    Będę wdzięczny za wskazówki, bardzo mi zależy na rozwiązaniu tego problemu.
  • #3 7079743
    Digitaler
    Poziom 2  
    Cóż, co do sposobu kompilacji to faktycznie powinienem napisać w pierwszym poście. Użyłem poleceń:
    avr-gcc -mmcu=at90s2313 prog1.c -o prog
    avr-objcopy -O ihex prog prog1.hex

    Ładowałem do procka poleceniem:
    avrdude -c stk200 -p t2313 -U flash:w:prog1.hex

    ZA to jeśli chodzi o samą treść programu, to poza
    #define F_CPU 4000000L
    #include <avr/io.h>
    #include <util/delay.h> 

    była funkcja main, pętla nieskończona, i dalej było dużo prób z różnymi poleceniami, wszystkie skutkowały tym co napisałem wyżej. No chyba że poza for-em i main-em nie było nic. Wpisanie w środek _delay_ms(200); powodowało już błąd.
    Dla spokoju podam kod jednego z tych niefortunnych przykładów:
    
    #define F_CPU 4000000L
    #include <avr/io.h>
    #include <util/delay.h>               
    int main(void)
    {
    DDRD = 0x1;
    for(;;)
    {    
    delay_ms(1);
    }
    }
    
  • #4 7079785
    Freddie Chopin
    Specjalista - Mikrokontrolery
    Funkcje z util/delay wymagają KONIECZNIE optymalizacji, ponieważ wewnętrzne obliczenia makr są oparte na liczbach zmiennoprzecinkowych. Bez optymalizacji wszystkie obliczenia wykonywane są w czasie działania programu.

    Dodaj do wywołania gcc (przed kompilowanym plikiem) opcję -Os aby właczyć optymalizację rozmiaru.

    4\/3!!
  • #5 7079814
    Digitaler
    Poziom 2  
    Faktycznie pomogło, program zajął 96 B, wgrał się, a AVR-GCC nie wywalił ostrzeżenia, które wyskakiwało wcześniej. Dzięki za pomoc.
REKLAMA