eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaZagwozdka w C Keil.
Ilość wypowiedzi w tym wątku: 84

  • 41. Data: 2019-02-13 23:06:03
    Temat: Re: Zagwozdka w C Keil - wyjaśnienie.
    Od: q...@t...no1 (Queequeg)

    J.F. <j...@p...onet.pl> wrote:

    >> Wbrew intuicji -- nie :) Modyfikator `volatile` oznacza tylko tyle, że
    >> kompilator nie może robić założeń co do zawartości zmiennej opatrzonej tym
    >> modyfikatorem, bo zmienna może zmienić wartość poza ścieżką wykonania (np.
    >> jest to sprzętowy rejestr, lub inny wątek ją modyfikuje, lub właśnie
    >> przerwanie). `volatile` nie oznacza, że kompilator gwarantuje atomiczny
    >> dostęp do zmiennej (czyli że wyłączy wszystko inne, co może zmienić jej
    >> wartość w trakcie dostępu -- czy to wątki, czy przerwania, czy zewnętrzny
    >> sprzęt).
    >
    > No ale czy nie powinien ? Bo skoro sie moze zmienic w sposob
    > niekontrolowany, to jak mozna wierzyc wartosci odczytanej
    > nieatomicznie ?

    Są do tego inne mechanizmy. Kompilator nawet nie ma takiej możliwości, bo
    volatile nie oznacza nic innego niż "nie optymalizuj dostępu do tej
    zmiennej". Kompilator może, ale nie musi wiedzieć, co zmienia tę zmienną.

    Zobacz, jak w AVR są zrealizowane rejestry 16-bitowe (np. datasheet do
    atmega8 strona 77, "Accessing 16-bit Registers").

    >> AVR ma to rozwiązane w ten sposób:
    >> https://www.nongnu.org/avr-libc/user-manual/group__u
    til__atomic.html
    >
    > No i widac ja sie te pomysly nadaja do prostego:
    > while (ctr) ;

    No niestety :)

    --
    Eksperymentalnie: http://facebook.com/groups/pl.misc.elektronika


  • 42. Data: 2019-02-13 23:07:39
    Temat: Re: Zagwozdka w C Keil - wyjaśnienie.
    Od: "Grzegorz Niemirowski" <g...@p...onet.pl>

    J.F. <j...@p...onet.pl> napisał(a):
    >> to wątki, czy przerwania, czy zewnętrzny sprzęt).
    > No ale czy nie powinien ?

    Ma kontrolować wszystkie te mechanizmy? Byłaby niezła paranoja. Może niech
    jednak kompilator zajmie się kompilacją...

    --
    Grzegorz Niemirowski
    https://www.grzegorz.net/


  • 43. Data: 2019-02-14 00:59:05
    Temat: Re: Zagwozdka w C Keil - wyjaśnienie.
    Od: "HF5BS" <h...@...pl>


    Użytkownik "stary grzyb" <s...@o...pl> napisał w wiadomości
    news:q41co4$aji$5@dont-email.me...
    >>> Przynajmniej jakaś pociecha dla mnie - myślałem, że tylko ja mam
    >>> sklerozę ;)
    >>
    >> Kiedyś mi prawie półtora roku zajęło, aby złapać, dlaczego przy pracy z
    >> TC, wyskakuje mi pewne (niepożądane) okienko. Banał, że śmiać sie chce :)
    >> Czemu tyle? Bo stale zapomniałem wyłapać okoliczności, w jakich się to
    >> staje.
    >
    > Ja mam nawet tabletki na poprawę pamięci, ale co z tego, skoro ...
    > zapominam je brać :)

    Hehe, trudno to celniej ująć... :)

    --
    Łapy, łapy, cztery łapy,
    A na łapach pies kudłaty.
    Kto dogoni psa? Kto dogoni psa?
    Może ty? Może ty? Może jednak ja...?


  • 44. Data: 2019-02-14 07:35:27
    Temat: Re: Zagwozdka w C Keil - wyjaśnienie.
    Od: Mateusz Viste <m...@n...pamietam>

    On Wed, 13 Feb 2019 23:07:39 +0100, Grzegorz Niemirowski wrote:

    > J.F. <j...@p...onet.pl> napisał(a):
    >>> to wątki, czy przerwania, czy zewnętrzny sprzęt).
    >> No ale czy nie powinien ?
    >
    > Ma kontrolować wszystkie te mechanizmy? Byłaby niezła paranoja. Może
    > niech jednak kompilator zajmie się kompilacją...

    Dokładnie. Automatyczne majstrowanie przy przerwaniach podchodziłoby pod
    sabotaż, a nie kompilację :)

    Mateusz


  • 45. Data: 2019-02-14 10:30:47
    Temat: Re: Zagwozdka w C Keil - wyjaśnienie.
    Od: Janusz <j...@o...pl>

    W dniu 2019-02-13 o 23:01, Queequeg pisze:
    > Janusz <j...@o...pl> wrote:
    >
    >>> Wbrew intuicji -- nie :) Modyfikator `volatile` oznacza tylko tyle, że
    >>> kompilator nie może robić założeń co do zawartości zmiennej opatrzonej tym
    >>> modyfikatorem, bo zmienna może zmienić wartość poza ścieżką wykonania (np.
    >>> jest to sprzętowy rejestr, lub inny wątek ją modyfikuje, lub właśnie
    >>> przerwanie). `volatile` nie oznacza, że kompilator gwarantuje atomiczny
    >>> dostęp do zmiennej (czyli że wyłączy wszystko inne, co może zmienić jej
    >>> wartość w trakcie dostępu -- czy to wątki, czy przerwania, czy zewnętrzny
    >>> sprzęt).
    >> G..o prawda.
    >
    > A co konkretnie?

    A to " (czyli że wyłączy wszystko inne, co może zmienić jej
    >>> wartość w trakcie dostępu -- czy to wątki, czy przerwania, czy
    zewnętrzny
    >>> sprzęt)."

    nic takiego kompilator nie robi.
    Przerwania są wyłączane tylko w atomic blok.


    >
    >>> AVR ma to rozwiązane w ten sposób:
    >>> https://www.nongnu.org/avr-libc/user-manual/group__u
    til__atomic.html
    >> Mylisz pojęcia, atomic blok i voltaile to są zupełnie dwie różne sprawy.
    >
    > Nie mylę, może nieprecyzyjnie się wyraziłem. AVR ma wspomniane mechanizmy,
    > których programista może użyć, jeśli interesuje go atomiczny dostęp lub
    > tak naprawdę jakakolwiek inna sekcja krytyczna.
    >
    >> jakbyś zerknął do kodu to byś zobaczył że dla volatile kompilator
    >> nigdy nie robi atomic bloków, to musi programista w kodzie
    >> zrobić.
    >
    > Tak (i prawidłowo), o tym właśnie piszę.
    Nie, wcale o tym nie pisałeś.


    --
    Pozdr
    Janusz


  • 46. Data: 2019-02-14 10:44:29
    Temat: Re: Zagwozdka w C Keil - wyjaśnienie.
    Od: "Grzegorz Niemirowski" <g...@p...onet.pl>

    Janusz <j...@o...pl> napisał(a):
    > A to " (czyli że wyłączy wszystko inne, co może zmienić jej
    >>>> wartość w trakcie dostępu -- czy to wątki, czy przerwania, czy
    > zewnętrzny
    >>>> sprzęt)."
    > nic takiego kompilator nie robi.

    A to "`volatile` nie oznacza, że kompilator gwarantuje atomiczny dostęp do
    zmiennej (czyli że wyłączy"?
    Nie dość, że masz problem z czytaniem ze zrozumieniem, to jeszcze wyciąłeś
    kluczowy fragment, który pokazuje, że czepiasz się bez sensu.

    > Przerwania są wyłączane tylko w atomic blok.

    Tak właśnie napisał Queequeg.

    > Nie, wcale o tym nie pisałeś.

    Masz popsuty czytnik?

    --
    Grzegorz Niemirowski
    https://www.grzegorz.net/


  • 47. Data: 2019-02-14 10:57:50
    Temat: Re: Zagwozdka w C Keil - wyjaśnienie.
    Od: q...@t...no1 (Queequeg)

    Janusz <j...@o...pl> wrote:

    >>>> Wbrew intuicji -- nie :) Modyfikator `volatile` oznacza tylko tyle, że
    >>>> kompilator nie może robić założeń co do zawartości zmiennej opatrzonej tym
    >>>> modyfikatorem, bo zmienna może zmienić wartość poza ścieżką wykonania (np.
    >>>> jest to sprzętowy rejestr, lub inny wątek ją modyfikuje, lub właśnie
    >>>> przerwanie). `volatile` nie oznacza, że kompilator gwarantuje atomiczny
    >>>> dostęp do zmiennej (czyli że wyłączy wszystko inne, co może zmienić jej
    >>>> wartość w trakcie dostępu -- czy to wątki, czy przerwania, czy zewnętrzny
    >>>> sprzęt).
    >>> G..o prawda.
    >>
    >> A co konkretnie?
    >
    >>>> A to " (czyli że wyłączy wszystko inne, co może zmienić jej wartość w
    >>>> trakcie dostępu -- czy to wątki, czy przerwania, czy zewnętrzny
    >>>> sprzęt)."
    >
    > nic takiego kompilator nie robi.

    Ale zauważyłeś, że przed tym jest napisane: "`volatile` nie oznacza, że"?

    > Przerwania są wyłączane tylko w atomic blok.

    I nigdzie nie napisałem inaczej.

    >>> jakbyś zerknął do kodu to byś zobaczył że dla volatile kompilator
    >>> nigdy nie robi atomic bloków, to musi programista w kodzie
    >>> zrobić.
    >>
    >> Tak (i prawidłowo), o tym właśnie piszę.
    > Nie, wcale o tym nie pisałeś.

    Przeczytaj jeszcze raz fragment, który (celowo) zostawiłem niewycięty na
    górze. Ze zrozumieniem.

    --
    Eksperymentalnie: http://facebook.com/groups/pl.misc.elektronika


  • 48. Data: 2019-02-14 11:35:48
    Temat: Re: Zagwozdka w C Keil - wyjaśnienie.
    Od: "J.F." <j...@p...onet.pl>

    Użytkownik "Mateusz Viste" napisał w wiadomości grup
    dyskusyjnych:5c650c2f$0$5597$4...@n...free.fr..
    .
    On Wed, 13 Feb 2019 23:07:39 +0100, Grzegorz Niemirowski wrote:
    >> J.F. <j...@p...onet.pl> napisał(a):
    >>>> to wątki, czy przerwania, czy zewnętrzny sprzęt).
    >>> No ale czy nie powinien ?
    >
    >> Ma kontrolować wszystkie te mechanizmy? Byłaby niezła paranoja.
    >> Może
    >> niech jednak kompilator zajmie się kompilacją...

    >Dokładnie. Automatyczne majstrowanie przy przerwaniach podchodziłoby
    >pod
    >sabotaż, a nie kompilację :)

    Cos w tym jest, ale z drugiej strony - skoro uzywamy volatile, to
    wiadomo ze zmienna moze sie zmieniac w przerwaniach czy w inny
    niekontrolowany sposob,
    i co - kompilator to olewa ?

    No coz, przejsc na ARM i zapomniec o problemie ... na chwile, bo i tam
    sie moga podobne cuda zrobic, jak zmiennych wiecej :-)

    J.


  • 49. Data: 2019-02-14 11:42:00
    Temat: Re: Zagwozdka w C Keil - wyjaśnienie.
    Od: "J.F." <j...@p...onet.pl>

    Użytkownik "Queequeg" napisał w wiadomości grup
    dyskusyjnych:2e88332d-3364-4f9b-b65d-7ecbd98a9931@tr
    ust.no1...
    Irek.N. <t...@j...taki.jest.pl> wrote:
    >>> A swoja droga - czy Keil sam ich nie wylacza ? Dla zmiennych
    >>> volatile
    >>> powinien.
    >
    >> Niestety ale ignoruje zupełnie volatile, a nie powinien moim
    >> zdaniem.

    >Skąd wiesz?
    >Zrób test. Napisz funkcję:
    >int i;
    >void fn(void) { do { } while (i != 42); }
    >Skompiluj z optymalizacją, zobacz kod. Potem dodaj volatile, zobacz
    >kod.

    >Sprawdziłem na raspi (arm), gcc -O2 -S.

    >Bez volatile:
    > ldr r3, .L5
    > ldr r3, [r3] ; tu ładuje zmienną do rejestru
    >.L2:
    > cmp r3, #42 ; tu porównuje rejestr
    > bne .L2 ; tu skacze z powrotem do porównania

    kiepski optymalizator ... czemu porownuje w petli ?

    >Jeszcze ciekawiej się robi, gdy dodasz modyfikator `static`. Bez
    >volatile,
    >arm:
    >.L2:
    > b .L2

    I to jest prawidlowe :-)

    >Dlaczego tak? Bo kompilator wie, że inna jednostka kompilacji nie
    >zmieni
    >wartości tej zmiennej (bo jest statyczna, widoczna tylko w obrębie
    >danej
    >jednostki kompilacji), więc nie ma sensu żadne sprawdzanie, bo
    >zmienna i
    >tak jest zero (bo zmienne globalne są inicjalizowane zerami; spróbuj
    >zamiast 42 wstawić 0 i zobacz, jaki kod wtedy kompilator wygeneruje).

    wstaw 41.

    Albo w jakiejs funkcji wpisz i=40 ...

    J.


  • 50. Data: 2019-02-14 11:49:36
    Temat: Re: Zagwozdka w C Keil - wyjaśnienie.
    Od: "Grzegorz Niemirowski" <g...@p...onet.pl>

    J.F. <j...@p...onet.pl> napisał(a):
    > Cos w tym jest, ale z drugiej strony - skoro uzywamy volatile, to wiadomo
    > ze zmienna moze sie zmieniac w przerwaniach czy w inny niekontrolowany
    > sposob,
    > i co - kompilator to olewa ?

    Nie olewa przecież, bo przestaje względem niej wykonywać optymalizacje.
    Natomiast nie robi nadgorliwych przeróbek, które spowodowałyby
    niekontrolowane zachowanie programu. Naprawdę chciałbyś żeby kompilator
    gdzieś po cichu włączał albo wyłączał Ci przerwania?

    --
    Grzegorz Niemirowski
    https://www.grzegorz.net/

strony : 1 ... 4 . [ 5 ] . 6 ... 9


Szukaj w grupach

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: