-
11. Data: 2019-02-11 09:27:44
Temat: Re: Zagwozdka w C Keil.
Od: Mateusz Viste <m...@n...pamietam>
On Mon, 11 Feb 2019 00:11:08 +0100, Irek.N. wrote:
>> Pierwszy wariant wydaje się bardzo sensowny. Kompilator zepsuty? A może
>> typ int nie jest atomiczny, i kompilator sprawdza najpierw jednego
>> nibbla,
>> i dopiero jeśli ten okaże się zerowy to zajmie się drugim?
>> Próbowałeś może zastąpić jakimś sig_atomic_t?
>
> Nie, na razie nic nie próbowałem.
Dodam, że jeśli teoria z nie-atomicznym intem miałaby się potwierdzić, to
mam wątpliwości czy jakikolwiek sig_atomic_t (jeśli w ogóle taki istnieje
na tym kompilatorze) będzie w stanie przechować więcej jak 8 bitów. Z
drugiej strony, nie-atomiczny int to byłby trochę dziwoląg... Musiałby
być albo procesor 8-bitowy, albo szyna pamięci. W obecnych czasach wydaje
się to (chyba?) mało prawdopodobne.
Mateusz
-
12. Data: 2019-02-11 09:32:11
Temat: Re: Zagwozdka w C Keil.
Od: Mateusz Viste <m...@n...pamietam>
On Mon, 11 Feb 2019 00:28:20 +0100, Irek.N. wrote:
> Zgoda, Mateusz też to zauważył. Ale to nie jest istotne w tym przypadku.
> Warunek jest sprawdzany poza przerwaniami, a zmienna jest modyfikowana w
> przerwaniu. Zastanawiam się, czy może to mieć jakikolwiek znaczenie.
> Może należało by sprawdzić najpierw jedną połówkę, później drugą i
> ponownie pierwszą, dla pewności.
Brzmi trochę jak drutowanie. :)
A czy - strzelam - kod wykonujący się w przerwaniu nie mógłby, zamiast
pastwić się nad 16-bitowym DEL_STEP, ustawiać jakiegoś globalnego,
jednobajtowego 'breakloop = 1'? Wtedy pętla ma łatwo, a sprawdzanie kiedy
dokładnie ustawić breakloop leżeć będzie w obowiązkach kodu obsługi
przerwania który to kod, niejako z definicji, przerwany być nie może.
Mateusz
-
13. Data: 2019-02-11 09:43:00
Temat: Re: Zagwozdka w C Keil.
Od: "Grzegorz Niemirowski" <g...@p...onet.pl>
Mateusz Viste <m...@n...pamietam> napisał(a):
> Musiałby
> być albo procesor 8-bitowy, albo szyna pamięci. W obecnych czasach wydaje
> się to (chyba?) mało prawdopodobne.
AVR-y nadal trzymają się mocno, ale tu pewnie coś innego skoro Keil.
--
Grzegorz Niemirowski
https://www.grzegorz.net/
-
14. Data: 2019-02-11 10:02:24
Temat: Re: Zagwozdka w C Keil.
Od: "Grzegorz Niemirowski" <g...@p...onet.pl>
Irek.N. <t...@j...taki.jest.pl> napisał(a):
> Warunek jest sprawdzany poza przerwaniami, a zmienna jest modyfikowana w
> przerwaniu.
No właśnie. Zaczyna się sprawdzenie warunku, bach przerwanie, kończy się
sprawdzanie warunku.
> Może należało by sprawdzić najpierw jedną połówkę, później drugą i
> ponownie pierwszą, dla pewności.
Można. Można też zastosować sekcję krytyczną czyli wyłączyć przerwania na
moment testu.
https://serwis.avt.pl/files/kurs_c/29_KursAVR_cz08.p
df - ostatnia strona
Lub też tak jak pisze Mateusz, sprawdzanie wartości licznika przenieść do
obsługi przerwania a w głównym kodzie sprawdzać tylko flagę.
Co to w ogóle za procesor programujesz? 8-bitowy?
--
Grzegorz Niemirowski
https://www.grzegorz.net/
-
15. Data: 2019-02-11 11:10:21
Temat: Re: Zagwozdka w C Keil.
Od: Mateusz Viste <m...@n...pamietam>
On Mon, 11 Feb 2019 10:02:24 +0100, Grzegorz Niemirowski wrote:
>> Może należało by sprawdzić najpierw jedną połówkę, później drugą i
>> ponownie pierwszą, dla pewności.
>
> Można.
Niby można, ale to dalej będzie lichota, bo nic nie gwarantuje, że przy
trzecim sprawdzaniu BAM! znów interrupt nie strzeli.
Ktoś mógłby powiedzieć "no tak, ale to przerwanie wyzwala się raz na
jakiś czas, kilka cykli CPU to za krótko by dwa razy zdążyło się
wyzwolić" - ale to nie do końca słuszne założenie. Może być tak, że
uruchomi się nasze przerwanie, zaraz za nim jakieś obce przerwanie które
robi coś dłuuuugo i zaraz po nim znów wraca to nasze, z nowym (złośliwie
ustawionym) DEL_STEP.
> Można też zastosować sekcję krytyczną czyli wyłączyć przerwania
> na moment testu.
To tak. Ale moje skromne i niezobowiązujące zdanie jest takie, że z
_disable() należy obchodzić się tak jak z goto. Są przypadki gdzie można
się tym pokusić bo coś uprości i będzie wszystkim żyło się lepiej, ale
jeśli tylko można - lepiej unikać, bo potem człowiek się uzależni i
zacznie produkować potworki. No i oczywiście wyłączenie przerwań
poskutkuje tym, że ich wykonywanie obarczone będzie jitterem (bo przy
dłuższych sprawach przerwania nam się zakolejkują) - a to może być, w
niektórych zastosowaniach/warunkach, jakimś problemem. Do tego takie
ręczne wyłączanie przerwań wprowadza stan, o którym należy pamiętać (tj.
nie zapomnieć o włączeniu przerwań z powrotem) - przy większym codeflow
który może różnymi ścieżkami pobiec łatwo robi się wtedy mętlik.
Mateusz
-
16. Data: 2019-02-11 11:54:07
Temat: Re: Zagwozdka w C Keil.
Od: q...@t...no1 (Queequeg)
J.F. <j...@p...onet.pl> wrote:
> ewentualnie ... kompilator potraktowal to jako wartosc logiczna, i
> uznal ze mu LSB wystarczy, albo wrecz ma niejawny typ logiczny,
> 8-bit, dokonal konwersji i sprawdzenia ... i mu sie MSB zoptymalzowal.
Nie mógł tak zrobić. Przecież 0x0100 to prawda a nie fałsz. Tylko zero
jest fałszem.
> Sprobuj
> while(DEL_STEP != 0);
To tożsame z `while(DEL_STEP);`.
--
Eksperymentalnie: http://facebook.com/groups/pl.misc.elektronika
-
17. Data: 2019-02-11 11:59:29
Temat: Re: Zagwozdka w C Keil.
Od: q...@t...no1 (Queequeg)
Irek.N. <t...@j...taki.jest.pl> wrote:
> Znalazłem błąd w starym kodzie. Ze zdziwieniem odkryłem, że w komendzie
> while(DEL_STEP); kompilator sprawdza tylko LSB zmiennej.
W jaki sposób to odkryłeś i potwierdziłeś?
Masz wygenerowany kod assemblerowy?
Czy jeżeli na sztywno przypiszesz do DEL_STEP wartość np. 0x0100, i
nigdzie nie będziesz jej zmieniał, to pętla z `while` się nie "odetka",
a odetka się, gdy przypiszesz 0x0101?
(zakładam że to '51, czyli 8-bitowiec)
--
Eksperymentalnie: http://facebook.com/groups/pl.misc.elektronika
-
18. Data: 2019-02-11 12:17:40
Temat: Re: Zagwozdka w C Keil.
Od: "J.F." <j...@p...onet.pl>
Użytkownik "Queequeg" napisał w wiadomości grup
dyskusyjnych:6ec55fa2-26d9-449d-ac7e-42741c8f7c6b@tr
ust.no1...
J.F. <j...@p...onet.pl> wrote:
>> ewentualnie ... kompilator potraktowal to jako wartosc logiczna, i
>> uznal ze mu LSB wystarczy, albo wrecz ma niejawny typ logiczny,
>> 8-bit, dokonal konwersji i sprawdzenia ... i mu sie MSB
>> zoptymalzowal.
>Nie mógł tak zrobić. Przecież 0x0100 to prawda a nie fałsz. Tylko
>zero
>jest fałszem.
Ale jesli wewnetrznie uwaza, ze typ bool (wymysl Keil, bo w C nie ma)
jest reprezentowany przez char,
to dokonuje konwersji ... i choc prawidlowe to nie jest, to
wiedzielibysmy z grubsza dlaczego :-)
>> Sprobuj
>> while(DEL_STEP != 0);
>To tożsame z `while(DEL_STEP);`.
Czy tozsame to sie na listingu w assemblerze okaze :-)
J.
-
19. Data: 2019-02-11 13:45:35
Temat: Re: Zagwozdka w C Keil.
Od: k...@g...com
W dniu poniedziałek, 11 lutego 2019 12:18:54 UTC+1 użytkownik J.F. napisał:
> Ale jesli wewnetrznie uwaza, ze typ bool (wymysl Keil, bo w C nie ma)
> jest reprezentowany przez char,
Hej, standard C99 będzie niedługo obchodził swoje dwudzieste urodziny:)
Ja wiem, że embedded to skansen ale idąc drogą "C to tylko C90" nie można
by było uznać za program w C nawet takiego, który deklaruje zmienną gdzie
indziej niż na początku programu/funkcji.
Pozdrawiam,
--
Karol Piotrowski
-
20. Data: 2019-02-11 14:27:53
Temat: Re: Zagwozdka w C Keil.
Od: Mateusz Viste <m...@n...pamietam>
On Mon, 11 Feb 2019 04:45:35 -0800, kropelka wrote:
> Ja wiem, że embedded to skansen ale idąc drogą "C to tylko C90" nie
> można by było uznać za program w C nawet takiego, który deklaruje
> zmienną gdzie indziej niż na początku programu/funkcji.
Bo to zaiste nie (ANSI) C. Na co komu deklarowanie zmiennych w środku
kodu? Jeśli odczuwasz taką potrzebę, to zapewne twój kod wymaga
refaktoryzacji. Prawdziwe C to C89, wszystko inne to wymysły młodzieży,
której się nudziło.
No ok - uczciwie muszę przyznać, że zdarza mi się korzystać z 'long
long', ale to jedyna rzecz której mi czasem braknie w C89. :)
Mateusz