-
Data: 2019-02-11 00:10:40
Temat: Re: Zagwozdka w C Keil.
Od: "Grzegorz Niemirowski" <g...@p...onet.pl> szukaj wiadomości tego autora
[ pokaż wszystkie 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/
Następne wpisy z tego wątku
- 11.02.19 00:11 Irek.N.
- 11.02.19 00:14 Irek.N.
- 11.02.19 00:28 Irek.N.
- 11.02.19 09:27 Mateusz Viste
- 11.02.19 09:32 Mateusz Viste
- 11.02.19 09:43 Grzegorz Niemirowski
- 11.02.19 10:02 Grzegorz Niemirowski
- 11.02.19 11:10 Mateusz Viste
- 11.02.19 11:54 Queequeg
- 11.02.19 11:59 Queequeg
- 11.02.19 12:17 J.F.
- 11.02.19 13:45 k...@g...com
- 11.02.19 14:27 Mateusz Viste
- 12.02.19 02:33 k...@g...com
- 12.02.19 09:31 Mateusz Viste
Najnowsze wątki z tej grupy
- Ściąganie hasła frezem
- Koszyk okrągły, walec 3x AA, na duże paluszki R6
- Brak bolca ochronnego ładowarki oznacza pożar
- AMS spalony szybkim zasilaczem USB
- stalowe bezpieczniki
- Wyświtlacz ramki cyfrowej
- bateria na żądanie
- pradnica krokowa
- Nieustający podziw...
- Coś dusi.
- akumulator napięcie 12.0v
- Podłączenie DMA 8257 do 8085
- pozew za naprawę sprzętu na youtube
- gasik
- Zbieranie danych przez www
Najnowsze wątki
- 2025-01-31 Duńskie precedensy w sprawie odsprzedawania terytoriów USA [Wyspy Dziewicze (1917)]
- 2025-01-31 Gdańsk => Specjalista ds. Sprzedaży <=
- 2025-01-31 Katowice => Key Account Manager (ERP) <=
- 2025-01-31 kupujmy części
- 2025-01-30 pogromca ksiezy
- 2025-01-30 Warszawa => Data Engineer (Tech Lead) <=
- 2025-01-30 Czy WYNIESIENIE UE-posła Brauna z sali obrad UE-parlamentu stanowiło naruszenie jego immunitetu i godności?
- 2025-01-30 drukarka potrzebna
- 2025-01-30 Warszawa => QA Engineer (Quality Assurance) <=
- 2025-01-30 Łódź => Programista NodeJS <=
- 2025-01-30 Jest Trump prezydent jest Meta/FBook/Instagram ugoda za 25 mln. USD
- 2025-01-30 Gdańsk => Solution Architect (Java background) <=
- 2025-01-30 Zielona Góra => Senior Field Sales (system ERP) <=
- 2025-01-30 Błonie => Analityk Systemów Informatycznych (TMS SPEED) <=
- 2025-01-30 DeepSeek nie lubi gadać o polityce