RTV forum PL | NewsGroups PL

Czy różnice w pętli `while` w Keil C mogą wpływać na działanie programu?

Zagwozdka w C Keil.

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Czy różnice w pętli `while` w Keil C mogą wpływać na działanie programu?

Goto page Previous  1, 2, 3, 4, 5, 6  Next

Irek.N.
Guest

Wed Feb 13, 2019 9:18 pm   



Quote:
Zdarzyło mi się kiedyś, że postanowiłem, że coś muszę zmodyfikować w
jednym programie. Wyszukałem miejsce gdzie to należy poprawić - a tu
"już ktoś to zrobił". Według daty pliku wynikało, że góra miesiąc temu Sad

Ostro Smile
Ja czasami robie błąd składni w kodzie, jak wiem że będę musiał
zaglądnąć w jakieś miejsce przy następnej okazji.
Przy kompilacji błąd wskazuje gdzie zaglądnąć, a tam już opis robi swoje Smile
Trza sobie radzić jak szare zszarzały :(

Miłego.
Irek.N.

Grzegorz Niemirowski
Guest

Wed Feb 13, 2019 9:21 pm   



Irek.N. <tajny@jakis.taki.jest.pl> napisał(a):
Quote:
Ostro Smile
Ja czasami robie błąd składni w kodzie, jak wiem że będę musiał zaglądnąć
w jakieś miejsce przy następnej okazji.
Przy kompilacji błąd wskazuje gdzie zaglądnąć, a tam już opis robi swoje
Smile Trza sobie radzić jak szare zszarzały Sad

Jeśli to C, to można skorzystać z dyrektywy preprocesora żeby nie psuć
dobrego kodu:
#error "Tu zrobic zmiany"

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

Irek.N.
Guest

Wed Feb 13, 2019 9:28 pm   



Quote:
Jeśli to C, to można skorzystać z dyrektywy preprocesora żeby nie psuć
dobrego kodu:
#error "Tu zrobic zmiany"


95% mojego kodu to ST, reszta to raczej VB niż C i pokrewne.

Miłego.
Irek.N.

Janusz
Guest

Wed Feb 13, 2019 10:03 pm   



W dniu 2019-02-13 o 21:13, Irek.N. pisze:
Quote:

A swoja droga - czy Keil sam ich nie wylacza ? Dla zmiennych volatile
powinien.

Niestety ale ignoruje zupełnie volatile, a nie powinien moim zdaniem.
Ale volatile oznacza tylko tyle że kompilator nie zoptymalizuje zmiennej

aby ją np wyciąć albo trzymać tylko w rejestrach, taka zmienna będzie zawsze
trzymana w pamięci, a kto i kiedy ją modyfikuje czy czyta to go nie
obchodzi.


--
Pozdr
Janusz

J.F.
Guest

Wed Feb 13, 2019 10:56 pm   



Dnia Wed, 13 Feb 2019 21:47:36 +0000 (UTC), Queequeg napisał(a):
Quote:
J.F. <jfox_xnospamx@poczta.onet.pl> wrote:

A swoja droga - czy Keil sam ich nie wylacza ? Dla zmiennych volatile
powinien.

Wbrew intuicji -- nie Smile 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 ?

Quote:

No i widac ja sie te pomysly nadaja do prostego:
while (ctr) ;

:-)

J.

Janusz
Guest

Wed Feb 13, 2019 10:59 pm   



W dniu 2019-02-13 o 22:47, Queequeg pisze:
Quote:
J.F. <jfox_xnospamx@poczta.onet.pl> wrote:

Ale nie spojrzec jaki to typ przy sprawdzaniu/szukaniu bledu ... czas
na lecytyne :-)

Jak masz w głowie, że to musi być int, to możesz przeoczyć :)

A swoja droga - czy Keil sam ich nie wylacza ? Dla zmiennych volatile
powinien.

Wbrew intuicji -- nie Smile 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.


Quote:

AVR ma to rozwiązane w ten sposób:
https://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html
Mylisz pojęcia, atomic blok i voltaile to są zupełnie dwie różne sprawy.

jakbyś zerknął do kodu to byś zobaczył że dla volatile kompilator
nigdy nie robi atomic bloków, to musi programista w kodzie
zrobić.


--
Pozdr
Janusz

Grzegorz Niemirowski
Guest

Wed Feb 13, 2019 11:07 pm   



J.F. <jfox_xnospamx@poczta.onet.pl> napisał(a):
Quote:
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/

Queequeg
Guest

Wed Feb 13, 2019 11:37 pm   



Irek.N. <tajny@jakis.taki.jest.pl> wrote:

Quote:
Trza sobie radzić jak szare zszarzały Sad

To nawet nie o to chodzi. Im mniej zaśmiecasz swoją pamięć, tym lepiej.
Ja często zapisuję sobie rzeczy, o których pewnie bym pamiętał, właśnie
po to, żeby nie musieć pamiętać Smile Zyskuję wtedy taki dziwny spokój, że
coś do zrobienia już jest zapisane i nie muszę o tym pamiętać (czyli tak
naprawdę myśleć).

To, czy pamiętam o zajrzeniu do notatek i czy w ogóle nad nimi panuję, to
zupełnie osobny temat. Kiedyś je uporządkuję. To również jest zapisane.

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

Queequeg
Guest

Wed Feb 13, 2019 11:47 pm   



J.F. <jfox_xnospamx@poczta.onet.pl> wrote:

Quote:
Ale nie spojrzec jaki to typ przy sprawdzaniu/szukaniu bledu ... czas
na lecytyne Smile

Jak masz w głowie, że to musi być int, to możesz przeoczyć :)

Quote:
A swoja droga - czy Keil sam ich nie wylacza ? Dla zmiennych volatile
powinien.

Wbrew intuicji -- nie Smile 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).

AVR ma to rozwiązane w ten sposób:

https://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html

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

Queequeg
Guest

Wed Feb 13, 2019 11:59 pm   



Irek.N. <tajny@jakis.taki.jest.pl> wrote:

Quote:
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:

#v+
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
#v-

Z volatile:

#v+
ldr r2, .L5
..L2:
ldr r3, [r2] ; tu ładuje zmienną
cmp r3, #42 ; tu porównuje
bne .L2 ; tu skacze z powrotem do załadowania
#v-

Podobnie na amd64. Bez volatile:

#v+
movl i(%rip), %eax ; tu ładuje zmienną
.p2align 4,,10
.p2align 3
..L2:
cmpl $42, %eax ; tu porównuje
jne .L2 ; tu skacze z powrotem do porównania
#v-

Z volatile:

#v+
..L2:
movl i(%rip), %eax ; tu ładuje zmienną
cmpl $42, %eax ; tu porównuje
jne .L2 ; tu skacze z powrotem do załadowania
#v-

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

#v+
..L2:
b .L2
#v-

Bez volatile, amd64:

#v+
..L2:
jmp .L2
#v-

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).

Oczywiście z volatile działa tak, jak byśmy chcieli.

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

Queequeg
Guest

Thu Feb 14, 2019 12:01 am   



Janusz <janusz_kk@o2.pl> wrote:

Quote:
Wbrew intuicji -- nie Smile 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?

Quote:
AVR ma to rozwiązane w ten sposób:
https://www.nongnu.org/avr-libc/user-manual/group__util__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.

Quote:
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ę.

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

Queequeg
Guest

Thu Feb 14, 2019 12:06 am   



J.F. <jfox_xnospamx@poczta.onet.pl> wrote:

Quote:
Wbrew intuicji -- nie Smile 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").

Quote:
AVR ma to rozwiązane w ten sposób:
https://www.nongnu.org/avr-libc/user-manual/group__util__atomic.html

No i widac ja sie te pomysly nadaja do prostego:
while (ctr) ;

No niestety :)

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

HF5BS
Guest

Thu Feb 14, 2019 12:59 am   



Użytkownik "stary grzyb" <starygrzyb@onet.pl> napisał w wiadomości
news:q41co4$aji$5@dont-email.me...
Quote:
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 Smile
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ć Smile

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...?

Mateusz Viste
Guest

Thu Feb 14, 2019 7:35 am   



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

Quote:
J.F. <jfox_xnospamx@poczta.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

Janusz
Guest

Thu Feb 14, 2019 10:30 am   



W dniu 2019-02-13 o 23:01, Queequeg pisze:
Quote:
Janusz <janusz_kk@o2.pl> wrote:

Wbrew intuicji -- nie Smile 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
Quote:
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.


Quote:

AVR ma to rozwiązane w ten sposób:
https://www.nongnu.org/avr-libc/user-manual/group__util__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

Goto page Previous  1, 2, 3, 4, 5, 6  Next

elektroda NewsGroups Forum Index - Elektronika Polska - Czy różnice w pętli `while` w Keil C mogą wpływać na działanie programu?

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map