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

optymalizacja kodu dla zmiennych wskaźnikowych AVR GCC

rpal 26 Sie 2015 22:27 1017 13
  • #1 14949881
    rpal
    Poziom 27  
    Witam,
    mam dość dziwny kłopot z optymalizacją kodu, nie będę zamieszczał tu jego bo szkoda miejsca na całość. Chodzi mianowicie o coś takiego.
    mam zadeklarowane zmienne
    volatile unsigned int *zmienna1;
    volatile unsigned int zmienna2;
    volatile unsigned int zmienna3;
    .
    Kłopot pojawia się dopiero podczas inicjowania wskaźnika bo o ile w epilogu głównej procedury main przypisanie adresu za pomocą
    zmienna1=&zmienna2;

    odnosi skutek, natomiast już zmiana tego adresu w pętli while już nie, czyli coś takiego
    while(1){
    zmienna1=&zmienna3;
    // reszta programu
    }

    nie przynosi żadnego efektu. Kompilator pomija te fragmenty kodu. Nie przynosi oczywiście przy włączonej optymalizacji kodu, z wyłączoną optymalizacją wszystko jest w porządku. Reasumując mam kłopot ze zmianą adresów zmiennych przypisanych do jednego wskaźnika.
    Czy ktoś ma jakiś pomysł jak to "pokonać" ? Chodzi o AVR Studio v4 i AVR GCC
  • #2 14949989
    p.kaczmarek2
    Moderator Smart Home
    To bardzo dziwne i nie powinno mieć miejsca. Na pewno nie pominąłeś czegoś istotnego? Czy przy takim kodzie dalej jest nie tak?

    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
    Pomogłem? Kup mi kawę.
  • Pomocny post
    #3 14950001
    michalko12
    Specjalista - Mikrokontrolery
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #4 14950007
    tadzik85
    Poziom 38  
    p.kaczmarek2 napisał:
    To bardzo dziwne i nie powinno mieć miejsca. Na pewno nie pominąłeś czegoś istotnego? Czy przy takim kodzie dalej jest nie tak?

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


    Dlaczego dziwne? skoro volatile nie dotyczy wskaźnika?
  • #5 14950010
    rpal
    Poziom 27  
    Niestety tak jest, podglądam plik *lss i tak właśnie się dzieje. Wstępne inicjowanie zmiennych jak i brak inicjowania nie ma żadnego wpływu na to co wyprawia kompilator.
  • #6 14950015
    tadzik85
    Poziom 38  
    rpal napisał:
    Niestety tak jest, podglądam plik *lss i tak właśnie się dzieje. Wstępne inicjowanie zmiennych jak i brak inicjowania nie ma żadnego wpływu na to co wyprawia kompilator.


    Wyprawia dokładnie to co napisałeś...... odpowiedź wyżej.
  • #7 14950020
    rpal
    Poziom 27  
    A co konkretnie masz na myśli? Liczę na pomoc a nie na szarady?
  • #8 14950024
    tadzik85
    Poziom 38  
    rpal napisał:
    A co konkretnie masz na myśli? Liczę na pomoc a nie na szarady?


    Ze modyfikujesz wskaźnik który nie jest volatile i nic dalej z nim nie robisz a to oznacza martwy kod który jest wycinany.....
  • #9 14950035
    rpal
    Poziom 27  
    wskaźnik jest deklarowany jako volatile
  • #11 14950043
    tadzik85
    Poziom 38  
    rpal napisał:
    wskaźnik jest deklarowany jako volatile


    Bzdura...Zadeklarowałeś wskaźnik NA volatile
  • #12 14950053
    rpal
    Poziom 27  
    chcesz powiedzieć że to nie jest odpowiednia deklaracja ?
    volatile unsigned int *zmienna1;

    Jeśli wg. Ciebie nie jest to jaka powinna być skoro tak uważasz
  • #13 14950054
    tadzik85
    Poziom 38  
    michalko12 napisał:
    Kod: C / C++
    Zaloguj się, aby zobaczyć kod
  • #14 14950059
    rpal
    Poziom 27  
    OK, dzięki za pomoc
REKLAMA