eGospodarka.pl
eGospodarka.pl poleca

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

  • 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

strony : 1 . [ 2 ] . 3 ... 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: