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

[STM32][C] Zmienna const i volatile.

shy_moon 14 Kwi 2019 16:32 432 8
  • #1 14 Kwi 2019 16:32
    shy_moon
    Poziom 4  

    Cześć,
    Mam taki fragment kodu:

    Kod: c
    Zaloguj się, aby zobaczyć kod


    który się nie kompiluje, dostaję taki błąd kompilacji.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Z tego co wiem powinno się skompilować ponieważ inkrementacja zmiennej jest tylko w przerwaniu i w takiej sytuacji może być zadeklarowana jako const i volatile. Nie mam racji?

    0 8
  • Computer Controls
  • #2 14 Kwi 2019 16:43
    khoam
    Poziom 28  

    shy_moon napisał:
    w takiej sytuacji może być zadeklarowana jako const i volatile

    Jeżeli jest zadeklarowana jako const, to powtórnie jej wartości nie można już zmieniać - błąd kompilacji jest jednoznaczny.

    0
  • Computer Controls
  • #3 14 Kwi 2019 16:51
    shy_moon
    Poziom 4  

    Ok, Jest jakieś sensowne zastosowanie zmiennej const i volatile?

    0
  • #4 14 Kwi 2019 16:58
    khoam
    Poziom 28  

    shy_moon napisał:
    Ok, Jest jakieś sensowne zastosowanie zmiennej const i volatile?

    To są dwa niezależne kwalifikatory. Wyjaśnienie ich zastosowania w systemach embedded jest tutaj.

    Kwalifikator volatile stosuje się do tych zmiennych, które są współdzielone pomiędzy ISR a resztą programu. W wypadku Twojego kodu wydaje się, że kwalifikator const w odniesieniu do zmiennej systick jest niepotrzebny, ponieważ chcesz zmieniać wartość tej zmiennej.

    0
  • #5 14 Kwi 2019 19:31
    szelus
    Specjalista - Mikrokontrolery

    shy_moon napisał:
    Ok, Jest jakieś sensowne zastosowanie zmiennej const i volatile?

    Stricte zmiennej to nie ma. Taka kombinacja może mieć ewentualnie sens w przypadku wskaźnika odnoszącego się do sprzętowego rejestru tylko do odczytu.

    0
  • #6 14 Kwi 2019 20:11
    _lazor_
    Moderator Projektowanie

    volatile ma wiele zastosowań, ten kwantyfikator jest traktowany jako side effect przez co kompilator nie może kawałka kodu w pełni zoptymalizować (np zapisywanie danych w pętli for nie może być zastąpione przez memcpy)

    Użycie zmiennej const volatile nie ma sensu, const volatile może nieść tylko informację dla programisty, że w danym kawałku kodu, nie powiennien jej modyfikować, ale kompilato tego nie zoptymalizuje i zawsze będzie to czytać z pamięci.

    0
  • #7 14 Kwi 2019 21:11
    tmf
    Moderator Mikrokontrolery Projektowanie

    _lazor_ napisał:
    Użycie zmiennej const volatile nie ma sensu, const volatile może nieść tylko informację dla programisty, że w danym kawałku kodu, nie powiennien jej modyfikować, ale kompilato tego nie zoptymalizuje i zawsze będzie to czytać z pamięci.


    Ma sens, jak najbardziej. const powoduje, że takiej zmiennej nie można przypisać wartości. volatile powoduje, że zmiennej nie można zoptymalizować i zawsze trzeba odczytać jej nową wartość. W efekcie const volatile ma sens dla zasobów sprzętowych, które zmieniają się niezależnie od sekwencji instrukcji programu, a do których nie wolno nam nic zapisywać. Np. systick możemy dzięki temu odczytać, ale nie możemy zmienić jego wartości. Oczywiście systick nie powinien być zwykłą zmienną, a powinien wskazywać np. na rejestr układu timera - czyli albo być wskaźnikiem, albo linker fizycznie powinien umieścić go pod adresem rejestru.

    0
  • #8 15 Kwi 2019 18:01
    BlueDraco
    Specjalista - Mikrokontrolery

    W kwestii formalnej - takie cóś z atrybutem const nazwy się stałą, a nie zmienną. Zmienna, jak sam nazwa wskazuje, daje się zmieniać, a stała - nie.

    0
  • #9 15 Kwi 2019 18:07
    khoam
    Poziom 28  

    BlueDraco napisał:
    W kwestii formalnej - takie cóś z atrybutem const nazwy się stałą, a nie zmienną. Zmienna, jak sam nazwa wskazuje, daje się zmieniać, a stała - nie.

    W zasadzie masz rację, ale w standardzie C formalnie to się to nazywa "const variable" :)
    W C++ jest już bardziej wyraźna różnica pomiędzy const a constexpr (ta druga to już jest na 100% stała).

    0