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

Atmel Studio, AVRGCC - optymalizacja powoduje niedziałanie funkcji

Pocieszny 19 Mar 2016 13:26 1068 12
  • #1 15536845
    Pocieszny
    Poziom 38  
    Mam taką funkcję przyjmującą godzinę w postaci stringa i porównującą ją z atualnym czasem:

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Kiedy w opcjach kompilatora mam wyłączoną optymalizację (-O0), wtedy działa dobrze. Po włączeniu optymalizacji (-O1), zmienne seconds_in_day i seconds_in_day_now są źle obliczane. Np. zamiast około 80000 zmienna ma wartość około 2000. Wygląda to tak jakby optymalizacja psuła dodawanie lub mnożenie liczb 32-bitowych.

    Dodatkowo, używając debugera (ATMEL-ICE), chciałem podejrzeć zmienne. Z włączoną optymalizacją dla wyżej wymienionych zmiennych w linijce, gdzie jest "diff= ..." pojawia się hint "optimized away". Nie wiem czy dobrze rozumiem, ale takie coś powinno się chyba zdarzyć w przypadku jeżeli zmienna jest w tym miejscu już niepotrzebna, ale tutaj jeszcze jest używana.

    Czy ktoś jest w stanie wytłumaczyć co tu się w ogóle dzieje?

    Mikrokontroler to ATMega644PA.


    Moderowany przez dondu:

    Zakładaj proszę tematy we właściwych działach. Temat przeniosłem.

  • Pomocny post
    #2 15536861
    grko
    Poziom 33  
    Dzieje się tak dlatego, że kompilator przy włączonej optymalizacji uznaje że niektóre zmienne nie są potrzebne i się ich pozbybwa. Może to sprawiać takie wrażenie takie jak opisałeś. Ale jeżeli wynik działania funkcji jest taki sam to nie powinieneś się tym martwić. Do deugowania użawa się zazwyczaj optymalizacji O0 albo Og.
  • Pomocny post
    #3 15536862
    Konto nie istnieje
    Konto nie istnieje  
  • #4 15536881
    Pocieszny
    Poziom 38  
    Piotrus_999 napisał:
    lokalne zmienne moga nie byc widziane w debugerze


    Debuguję właśnie z wyłączoną optymalizacją, żeby tego uniknąć. Bardziej martwi mnie to, że po jej włączeniu powyższa funkcja działa inaczej niż bez optymalizacji. Zmienne 32-bitowe są źle liczone.
  • Pomocny post
    #5 15536893
    Konto nie istnieje
    Konto nie istnieje  
  • Pomocny post
    #6 15536899
    grko
    Poziom 33  
    @Pocieszny
    A wynik działania funkcji jest taki sam? Jeżeli twierdzisz, że "kompilator nie działa" to przerzuć te zmienne na czas debugowania do zmiennych globalnych albo nadaj im modyfikator volatile. Wtedy będzie takie zachowanie jak przy O0.
  • #7 15536910
    Pocieszny
    Poziom 38  
    Z optymalizacją wynik funkcji jest inny niż zamierzony. Z analizą kodu asemblerowego chyba sobie nie dam rady, bo go nie znam (wiem, trzeba było się uczyć ;) ). Niestety, volatile nie pomaga. Spróbuję jeszcze ze zmiennymi globalnymi.
  • Pomocny post
    #8 15536924
    grko
    Poziom 33  
    A nie zgłasza nic kompilator przy linii:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #9 15536953
    Pocieszny
    Poziom 38  
    Tylko takie coś:
    Atmel Studio, AVRGCC - optymalizacja powoduje niedziałanie funkcji
  • #10 15536960
    grko
    Poziom 33  
    Bingo. Teraz powinieneś się pozbyć tych warningów i zastanowić się dlaczego kompilator je wogóle zgłosił :)

    EDIT:

    Jeżeli wersja B Ci działa to całkiem przypadkiem:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod


    Co niby to: ("23:59:59") > 0 ma robić ?
  • #11 15536984
    Pocieszny
    Poziom 38  
    Usunąłem część poprzedniego posta, ponieważ zmiana typu zmiennych na int pomogła. Nie sądziłem, że to może mieć aż tak duże znaczenie. Zawsze mi się wydawało, że tak krytyczne rzeczy powodują podczas kompilacji error a nie zwykły warning.

    Co do Twojego pytania: źle sobie tu wpisałem (zgubiłem nazwę funkcji przed argumentem).
  • #12 15537049
    grko
    Poziom 33  
    Taki już urok języka C. Pozwla robić rzeczy potencjalnie niebezpieczne :) Mozna włączyć więcej warningów przez flagi kompilatora (-Wall -Wextra). Stosując zasadę 0 warnings można czasem nawet napisać kod działajacy za 1 razem ;) W twoim przypadku kompilator niebezpośrednio powiedział Ci: piszesz po stosie
  • #13 15537289
    Konto nie istnieje
    Konto nie istnieje  
REKLAMA