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
Ostro
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
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
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

Trza sobie radzić jak szare zszarzały
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

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

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

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

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

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

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

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