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

[ATmega][C] Dziwny problem ze zmiennymi.

megaman123 28 Lip 2009 08:35 1473 8
  • #1 6829520
    megaman123
    Poziom 13  
    Witam ,

    otóż mam ostatnimi czasy dziwny problem z wywoływaniem funkcji , dołączanych plików źródłowych .
    Otóż przedstawię może problem w ten sposób : istnieje zmienna globalna używana w pliku xxx.C , zdefiniowana w tym pliku , której używają do obliczeń funkcje z pliku xxx.C . Dopóki wszystko się dzieje w obrębie pliku to jest o.k ( w sensie np , funkcja z pliku xxx.C pomnoży , doda , prześle zmienną ) , ale jak juz chcemy np. w funkcji main ( inny plik ) , wywołać funkcje która np. zwróci nam wartość zmiennej globalnej pomnożonej przez 2 to już pojawiają sie problemy , bo zwracane jest 0 ( w ciele funkcji nawet dodałem wypisywanie zwracanej wartości , i o dziwo wypisywało poprawnie a zwracało dalej 0 ).dodanie przedrostka volatile , czy static nie pomogło . Włączona jest pełna optymalizacja. W samym C programuje już chyba ok.4 lat i czegoś takiego osobiście nie widziałem .

    Może ktoś z szanownych kolegów ma jakiś pomysł ?
  • #3 6829584
    megaman123
    Poziom 13  
    
    
    basemodule.h 
    
    typedef struct
    {
        uint8_t blockParam;
        
        uint8_t signedMove;
        
        uint32_t deviceInitialAdress;
    }glob;
    
    uint8_t returnBlockParam(void);
    
    basemodule.c
    
    volatile static glob globalVariables;
    
    uint8_t returnBlockParam(void)
    {
       uint8_t returningValue = globalVariables.blockParam;
    
       rprintf("Returning : %d",returningValue );
    
       return returningValue ;
    }
    
    main.c :
    
    uint8_t blockParam = returnBlockParam(); 
    
    


    i blockParam = 0 ;Byłoby na tyle "interesujacej" czesci. Wartośći , przyjmujace przez obiekt struktury napewno nie są zerowe + większość tego typu funkcji odstawia takie "fikołki" . Ale jak zaznaczam , wywołanie tej funkcji , w innej z pliku basemodule.c daje zakładany rezultat.
  • #5 6829650
    megaman123
    Poziom 13  
    Tyle ,ze właśnie zasięg tej zmiennej globalnej , jest tylko względem jednego pliku ( static w tym utwierdza ) , więc żadne externy nie wchodzą w grę , i o zasięgu zmiennych trochę wiem , dlatego dziwi mnie to okropnie :)
  • #7 6830304
    arrevalk
    Poziom 25  
    A ta zmienna globalna napewno wypełniona danymi jest?
    Bo zrobiłem mały teścik:
    basemodule.h:
    
    typedef struct {
        uint8_t blockParam;
        uint8_t signedMove;
        uint8_t deviceInitialAddress;
    
    } glob;
    
    uint8_t returnBlockParam(void);
    

    basemodule.c:
    
    volatile static glob globalVariables = {
        .blockParam = 127,
        .signedMove = 23,
        .deviceInitialAddress = 67,
    };
    
    uint8_t returnBlockParam(void){
        uint8_t returnValue = globalVariables.blockParam;
        printf("returnBlockParam() = %d\n", returnValue);
        return returnValue;
    }

    main.c:
    
    int main(void) {
        InitHardware();
        uint8_t getValue = returnBlockParam();
        printf("main() = %d\n", getValue);
        while(1);
        return 0;
    }

    I działa ok.
  • #8 6830415
    megaman123
    Poziom 13  
    Cytat:
    Jak głębokie jest zagnieżdżenie gdy wywołujesz
    Kod:
    uint8_t blockParam = returnBlockParam();
    Może stos się wysypuje?


    W zasadzie żadne , w chwili testowania teraz to najnormalniejsze wywołanie funkcji z innego pliku . Sama w sobie też nie wywołuje innej. A stos w sumie wykluczyłem , bo ledwie 20% pamięci RAM jest zajęte.

    Cytat:
    A ta zmienna globalna napewno wypełniona danymi jest?


    Jest na 100% , Sam już nie wiem , co innego można "obwinić" za ta działanie tego programu.
  • #9 6830796
    markosik20
    Poziom 33  
    zmienną
    uint8_t blockParam
    oczywiście wykorzystujesz w dalszej części kodu ?...bo jak nie to ustawiona optymalizacja....i kompilator stwierdza że takie działanie jest w zupełności niepotrzebne.
REKLAMA