eGospodarka.pl
eGospodarka.pl poleca

eGospodarka.plGrupypl.misc.elektronikaZagwozdka w C Keil. › Re: Zagwozdka w C Keil.
  • Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.nask.pl!news.nask.org.pl!news.unit
    0.net!feeder.erje.net!1.eu.feeder.erje.net!proxad.net!feeder1-2.proxad.net!clea
    nfeed3-b.proxad.net!nnrp1-1.free.fr!not-for-mail
    From: Mateusz Viste <m...@n...pamietam>
    Subject: Re: Zagwozdka w C Keil.
    Newsgroups: pl.misc.elektronika
    References: <q3q59d$hp9$1@node1.news.atman.pl>
    User-Agent: Pan/0.139 (Sexual Chocolate; GIT bf56508 git://git.gnome.org/pan2)
    MIME-Version: 1.0
    Content-Type: text/plain; charset=UTF-8
    Content-Transfer-Encoding: 8bit
    Date: 10 Feb 2019 22:41:57 GMT
    Lines: 52
    Message-ID: <5c60a8b5$0$21611$426a74cc@news.free.fr>
    Organization: Guest of ProXad - France
    NNTP-Posting-Date: 10 Feb 2019 23:41:57 CET
    NNTP-Posting-Host: 82.64.0.151
    X-Trace: 1549838517 news-1.free.fr 21611 82.64.0.151:54566
    X-Complaints-To: a...@p...net
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:740898
    [ ukryj nagłówki ]

    On Sun, 10 Feb 2019 22:32:33 +0100, Irek.N. wrote:
    > Pytanie do znawców C. Czy zapis taki:
    >
    > volatile unsigned int DEL_STEP;
    >
    > void DELAY(unsigned int Czas) {
    > DEL_STEP = Czas;
    > while(DEL_STEP);
    > }
    >
    > może różnić się wykonaniem od zapisu takiego?
    >
    > void DELAY(unsigned int Czas) {
    > unsigned char DEL_MSB,DEL_LSB;
    > DEL_STEP = Czas;
    > while(1) {
    > DEL_LSB = DEL_STEP/0x100;
    > DEL_MSB = DEL_STEP^0x100;
    > if (DEL_MSB == 0 & DEL_LSB == 0) return;
    > }
    > }

    O "Keil" nigdy nie słyszałem, ale C obiło mi się już o uszy, wrzucę moje
    3 grosze, być może jakkolwiek pomocne :)

    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?

    Ten drugi przykład to w ogóle lichy jest, bo pętla ma teoretyczne prawo
    zostać przerwana za każdym razem kiedy wartość DEL_STEP zostaje zmieniona
    z wartości o zerowym MSB do wartości o zerowym LSB (np. 0x0034 -> 0x1200)
    - a to dlatego, że los może złośliwie zechcieć wykonać twoje przerwanie
    akurat pomiędzy liniami:

    DEL_LSB = DEL_STEP/0x100;
    DEL_MSB = DEL_STEP^0x100;

    Nazewnictwo jest tu nieco pomieszane, bo DEL_LSB będzie faktycznie
    zawierał 8 "ważniejszych" bitów, tj. MSB. A DEL_MSB będzie zawierał 8
    "mniej ważnych" bitów - z resztą celowość operacji XOR całkiem mi tu
    umyka, tym bardziej że operuje na bitach których DEL_MSB i tak nie
    zobaczy (bo jest charem). Może zamiast '^' (xor) miałeś na myśli
    '%' (mod)? Też byłoby niepotrzebnie, ale byłbym wtedy w stanie zrozumieć
    co autor miał na myśli.

    Swoją drogą, trochę dziwnie patrzeć na dzielenie w takiej operacji. Jeśli
    kompilator mądry, to zoptymalizuje twoje "/ 0x100" do ">> 8", ale jeśli
    na to nie wpadnie... to będzie mało ekologicznie.

    Mateusz

Podziel się

Poleć ten post znajomemu poleć

Wydrukuj ten post drukuj


Następne wpisy z tego wątku

Najnowsze wątki z tej grupy


Najnowsze wątki

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: