eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaRynek pracy STM32Re: Rynek pracy STM32
  • Data: 2022-07-19 22:37:26
    Temat: Re: Rynek pracy STM32
    Od: heby <h...@p...onet.pl> szukaj wiadomości tego autora
    [ pokaż wszystkie nagłówki ]

    On 19/07/2022 22:15, Grzegorz Niemirowski wrote:
    >> Jesli kompilator wyoptymzliował Ci tą zmienną, a nie powinien, to masz
    >> buga w kodzie, który załatałeś nieprawidłowym volatile.
    > Co to znaczy, że nie powinien?

    Janusz Twierdzi, że kompilator zredukował mu kod do zera, który robił
    coś z jakąs zmienną.

    Odrzucając hipoteze o bugu w kompilatorze:

    Jedynym powodem, że jakiś kod korzystajacy ze zmiennej został
    wyoptymalizowana do zera, to że kompilator w kodzie nie zakładał zmian
    tej zmiennej w zewnątrznych funkcjach, lub mógł je wyliczyć statycznie
    widąc cały kod.

    Skoro tak, to miał prawo zoptymalizować ten kod do zera.

    Janusz narzeka że tak sie stało.

    Wnioskuje więc że:
    1) to nie była zmienna a register - tutaj nalezy użyć volatile
    2) to była zmienna modyfikowana w innym wątku albo przerwaniu - wtedy
    volatile można uzyć tylko, jesli procesor nie wspiera barier. Nawet
    mikrokontrolerowe ARMy miewają bariery.

    https://developer.arm.com/documentation/den0024/a/Th
    e-A64-instruction-set/Memory-access-instructions/Mem
    ory-barrier-and-fence-instructions

    > Jakie to jest nieprawidłowe volatile?

    Użyte w sytuacji, kiedy tak naprawdę chcesz barierę. Bariera mówi
    kompilatorowo: uwaga, ta zmienna może zostać zmodyfikowana przez inny,
    nieznany czynnik, w tym miejscu nie wolno jej przechować ani zakładać że
    ma jakaś starą wartość po przejściu bariery.

    > Janusz podał 3 poprawne przykłady użycia volatile.

    Zaznaczenie "volatile" na zmiennej powoduje, że kompialator wyłączy
    cacheowanie jej wartości, co uniemożliwi optymalizację kodu.

    Tymczasem prawie na pewno w algorytmie jest bug, albo wcale nie chodziło
    o wyłaczenie optymalizacji, tylko o poinformowanie kompilatora, że
    zmienna może być zmodyfikowana poza tym kodem. Od tego są bariery.

    Dla procesorów posiadajacychc cache, baeriery są *JEDYNYM* sposobem
    zapewnienia synchronizacji stanu zmiennych między watkami. Na niektórych
    złośliwych architekturach możliwe jest, że mimo volatile, zmiana
    zmiennej w wątku A nigdy nie będzie widoczna w wątku B bez użycia
    bariery. Na innych może się zdażyć, że zapis z jednego watku w
    kolejności A a potem B, bedzie widziany w innym wątku jako zapis B a
    potem A. Tutaj znowu, volatile nic nie pomoże - od tego są bariery.

    Ponieważ Janusz nie przedstawił spornego kawałka kodu - nie wiadomo
    dlaczego kompilator usunął mu ten kod. Wiec można sobie na sucho
    pogdybać w jakich okolicznościach może i dlaczego volatile nie jest od
    tego, do czego go źle używają prawie wszyscy.

    https://en.wikipedia.org/wiki/Memory_barrier

    [...] The keyword volatile does not guarantee a memory barrier to
    enforce cache-consistency. Therefore, the use of volatile alone is not
    sufficient to use a variable for inter-thread communication on all
    systems and processors.[...]

    PS. To nie aby ja podałem 3 przykłady, w tym dwa błedne ;) ?

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

Szukaj w grupach

Eksperci egospodarka.pl

1 1 1

Wpisz nazwę miasta, dla którego chcesz znaleźć jednostkę ZUS.

Wzory dokumentów

Bezpłatne wzory dokumentów i formularzy.
Wyszukaj i pobierz za darmo: