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!newsfeed2.atman.pl!newsfeed.atman.pl!.P
    OSTED!not-for-mail
    From: "Grzegorz Niemirowski" <g...@p...onet.pl>
    Newsgroups: pl.misc.elektronika
    Subject: Re: Zagwozdka w C Keil.
    Date: Mon, 11 Feb 2019 00:10:40 +0100
    Organization: ATMAN - ATM S.A.
    Lines: 47
    Message-ID: <q3qb1a$20r$1@node2.news.atman.pl>
    References: <q3q59d$hp9$1@node1.news.atman.pl>
    NNTP-Posting-Host: 89-74-238-96.dynamic.chello.pl
    Mime-Version: 1.0
    Content-Type: text/plain; format=flowed; charset="iso-8859-2"; reply-type=response
    Content-Transfer-Encoding: 8bit
    X-Trace: node2.news.atman.pl 1549840235 2075 89.74.238.96 (10 Feb 2019 23:10:35 GMT)
    X-Complaints-To: u...@a...pl
    NNTP-Posting-Date: Sun, 10 Feb 2019 23:10:35 +0000 (UTC)
    X-Priority: 3
    X-MSMail-Priority: Normal
    X-Newsreader: OE PowerTool 4.5
    X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.7623
    X-WWW: http://www.grzegorz.net/
    Xref: news-archive.icm.edu.pl pl.misc.elektronika:740903
    [ ukryj nagłówki ]

    Irek.N. <t...@j...taki.jest.pl> napisał(a):
    > 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;
    > }
    > }
    > Znalazłem błąd w starym kodzie. Ze zdziwieniem odkryłem, że w komendzie
    > while(DEL_STEP); kompilator sprawdza tylko LSB zmiennej. Oczywiście
    > generuje to kłopoty, gdy DEL_STEP przekracza wartość 255.
    > Przepisanie jak niżej rozwiązuje problem, ale nie kumam powodu jego
    > wystąpienia. Sprawdziłem optymalizacje, to nie to, po prostu kod jest
    > generowany źle. Ktoś ma pomysł dlaczego kompilator uprościł, a może ja
    > czegoś nie zauważam?
    > Miłego.
    > Irek.N.
    > ps. DEL_STEP jest modyfikowana w przerwaniu, inaczej procedura nie miała
    > by sensu.

    LSB to least significant bit. Wątpię aby sprawdzany był najmniej znaczący
    bit, może chodziło o bajt. Szkoda, że nie ma kodu asemblerowego. W każdy
    razie to też wątpliwe, raczej sprawdzane jest wszystko, tylko pewnie nie
    naraz. Jeśli procesor jest 8-bitowy, to int ma 16 bitów i obsługiwany jest
    po bajcie a nie atomowo. Czyli de facto są dwa testy, dla młodszego i
    starszego bajtu. Jeśli przerwanie nastąpi między testami to mamy problem.
    Np. jeśli mamy wartość 256, to test młodszego bajtu da 0. Następnie
    przerwanie zmieni wartość na 255. Wówczas wykonany zostanie test starszego
    bajtu i też da zero. A więc zostanie uznane, że cała zmienna ma wartość
    zero, skoro testy obu bajtów wykazały zera. W takich sytuacjach stosuje się
    sekcje krytyczne.

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

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: