-
Path: news-archive.icm.edu.pl!news.icm.edu.pl!news.chmurka.net!.POSTED.pi.v.chmurka.n
et!not-for-mail
From: q...@t...no1 (Queequeg)
Newsgroups: pl.misc.elektronika
Subject: Re: Zagwozdka w C Keil - wyjaśnienie.
Date: Thu, 14 Feb 2019 12:59:28 +0000 (UTC)
Organization: news.chmurka.net
Message-ID: <4...@t...no1>
References: <q3q59d$hp9$1@node1.news.atman.pl> <q3vee4$o74$1@node1.news.atman.pl>
<5c63f185$0$476$65785112@news.neostrada.pl>
<e...@t...no1>
<y...@4...net>
<q424f8$8b4$1@node2.news.atman.pl>
<5c650c2f$0$5597$426a74cc@news.free.fr>
<5c6544d5$0$486$65785112@news.neostrada.pl>
<c...@t...no1>
<5c655b35$0$490$65785112@news.neostrada.pl>
NNTP-Posting-Host: pi.v.chmurka.net
Mime-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-2
Content-Transfer-Encoding: 8bit
Injection-Date: Thu, 14 Feb 2019 12:59:28 +0000 (UTC)
Injection-Info: news.chmurka.net; posting-account="gof";
posting-host="pi.v.chmurka.net:172.24.44.20"; logging-data="15125";
mail-complaints-to="abuse-news.(at).chmurka.net"
User-Agent: tin/2.4.2-20171224 ("Lochhead") (UNIX) (Linux/4.4.50-v7+ (armv7l))
Cancel-Lock: sha1:vDC6zElc/maZdSUiFxUNrBoTBMk=
Xref: news-archive.icm.edu.pl pl.misc.elektronika:741027
[ ukryj nagłówki ]J.F. <j...@p...onet.pl> wrote:
>>Ale co kompilator może zrobić, jak sam procesor nie obsługuje
>>atomicznego dostępu do tej zmiennej (bo np. jest 8-bitowy, a zmienna
>>16-bitowa)?
>
> To samo, co programista ma zrobic :-)
Programista ma kontekst, którego nie ma kompilator. Programista wie, kiedy
chce mieć sekcję krytyczną (która nie musi obejmować wyłącznie atomicznego
dostępu do zmiennej szerszej niż magistrala adresowa).
>>Zmienna może się zmienić między każdą z tych instrukcji.
>
> Cos w tym jest.
Jest jest... po to są sekcje krytyczne.
>>Czemu? Co ma do tego ARM? Chodzi o szerokość magistrali danych? To
>>rozwiązuje tylko jeden problem,
>
> Tak, problemu z int nie bedzie :-)
Z odczytem int nie, ale np. z read-modify-write już tak.
>>ale inne (chociażby ten pierwszy przykład wyżej) pozostają.
>
> Ciezkie jest zycie programisty.
A to swoją drogą... ale raczej przez ludzi a nie przez komputery :)
Trzeba po prostu pamiętać, że (przynajmniej w przypadku C i C++)
kompilator nie tłumaczy kodu na język maszynowy jeden do jednego. Kod to
tylko pewien abstrakcyjny opis, który kompilator może traktować z dosyć
dużą dowolnością. Dochodzą do tego chociażby zagadnienia związane z
reorderingiem.
Przykładowo:
https://www.nongnu.org/avr-libc/user-manual/optimiza
tion.html
1. Dzielimy (powolna operacja)
2. Wyłączamy przerwania cli
3. Zapisujemy wynik dzielenia do zmiennej (szybka operacja)
4. Włączamy przerwania
A optymalizator twierdzi, że wyłączy sobie przerwania przed dzieleniem, bo
tak mu mnieszy kod wychodzi :)
Gdy zagłębimy się w optymalizowanie "undefined behavior", to robi się
jeszcze ciekawiej. Przykładowo:
#v+
void fn(int *p)
{
int a = *p; // martwy kod
if (p == 0) return; // nadmiarowe sprawdzenie
*p = 1;
}
#v-
Spodziewalibyśmy się, że `if (p == 0) return;` nie zostanie usunięte, ale
ponieważ programista wcześniej dokonał dereferencji, a dereferencja null
pointera jest UB, to kompilator może usunąć ten drugi, nadmiarowy test bo
zakłada, że nie ma UB (czyli że p nie może być 0). Moje gcc nie usuwa, bo
najpierw usuwa martwy kod, ale wcale nie musi -- inna wersja lub inny
kompilator może zachowywać się inaczej i najpierw usunąć nadmiarowe
sprawdzenie, a dopiero potem martwy kod.
Kolejny przykład.
#v+
#include <limits.h>
#include <stdio.h>
int fn(int i)
{
if (i + 1 > i)
printf("Nie ma integer overflow\n");
else
printf("Uwaga: integer overflow\n");
}
int main(void)
{
fn(INT_MAX);
return 0;
}
#v-
Kompilujemy z -O0, dostajemy wynik, że jest integer overflow. Kompilujemy
z -O2, optymalizator stwierdza, że przepełnienie typu ze znakiem jest UB,
więc usuwa nam ten warunek (ustawia go na true).
> I co sie dziwic, ze MS w C# zrobil stringi niemodyfikowalne ...
W C# pisałem coś tylko raz i tylko dlatego, że musiałem :) Zupełnie nie
moja działka.
--
Eksperymentalnie: http://facebook.com/groups/pl.misc.elektronika
Następne wpisy z tego wątku
- 14.02.19 14:01 Grzegorz Niemirowski
- 14.02.19 14:02 Queequeg
- 14.02.19 14:04 Queequeg
- 14.02.19 14:07 Queequeg
- 14.02.19 17:03 J.F.
- 14.02.19 17:10 J.F.
- 14.02.19 17:14 Queequeg
- 14.02.19 18:27 J.F.
- 14.02.19 19:42 Grzegorz Niemirowski
- 14.02.19 22:13 Janusz
- 14.02.19 22:46 Irek.N.
- 14.02.19 23:02 Janusz
- 14.02.19 23:03 Grzegorz Niemirowski
- 15.02.19 08:57 Mateusz Viste
- 15.02.19 11:07 J.F.
Najnowsze wątki z tej grupy
- Dławik CM
- JDG i utylizacja sprzetu
- Identyfikacja układ SO8 w sterowniku migających światełek choinkowych
- DS1813-10 się psuje
- Taki tam szkolny problem...
- LIR2032 a ML2032
- SmartWatch Multimetr bezprzewodowy
- olej psuje?
- Internet w lesie - Starlink
- Opis produktu z Aliexpress
- No proszę, a śmialiście się z hindusów.
- Zewnętrzne napięcie referencyjne LM385 1,2V -> 100mV dla ICL7106, Metex M-3800
- karta parkingowa
- Wl/Wyl (On/Off) bialy/niebieski
- I3C
Najnowsze wątki
- 2024-11-29 Dławik CM
- 2024-11-29 [OT] Lewe oprogramowanie
- 2024-11-29 Błonie => Sales Specialist <=
- 2024-11-29 Warszawa => IT Expert (Network Systems area) <=
- 2024-11-29 Warszawa => Ekspert IT (obszar systemów sieciowych) <=
- 2024-11-29 Warszawa => Head of International Freight Forwarding Department <=
- 2024-11-29 Białystok => Inżynier Serwisu Sprzętu Medycznego <=
- 2024-11-29 Pómpy ciepła darmo rozdajoo
- 2024-11-29 Białystok => Application Security Engineer <=
- 2024-11-29 Białystok => Programista Full Stack (.Net Core) <=
- 2024-11-29 Gdańsk => Software .Net Developer <=
- 2024-11-29 Wrocław => Key Account Manager <=
- 2024-11-29 Gdańsk => Specjalista ds. Sprzedaży <=
- 2024-11-29 Chrzanów => Specjalista ds. public relations <=
- 2024-11-27 Re: UseGalileo -- PRODUKTY I APLIKACJE UŻYWAJĄ JUŻ DZIŚ SYSTEMU GALILEO