Thread View: pl.comp.lang.c
11 messages
11 total messages
Started by Guest
Sun, 25 Jan 1998 10:01
pytanie
Author: Guest
Date: Sun, 25 Jan 1998 10:01
Date: Sun, 25 Jan 1998 10:01
3 lines
495 bytes
495 bytes
Co to jest za typ volatile ? Marcin
Re: pytanie
Author: Czesiek Dlugolecki
Date: Sun, 25 Jan 1998 15:12
Date: Sun, 25 Jan 1998 15:12
7 lines
870 bytes
870 bytes
Guest wrote in message <199801251001.LAA04510@manjak.knm.org.pl>... >Co to jest za typ volatile ? > >Marcin Jest to slowko kluczowe, ktore mowi kompilatorowi ;), ze zmienna moze byc zmieniana przez program, oraz z zewnatrz (dane z jakiegos portu etc.)
Re: pytanie
Author: Witold Przygoda
Date: Mon, 26 Jan 1998 01:43
Date: Mon, 26 Jan 1998 01:43
17 lines
1065 bytes
1065 bytes
On 25 Jan 98 10:01:48 GMT, guest@manjak.knm.org.pl (Guest) wrote: >Co to jest za typ volatile ? To nie jest typ tylko "przydawka do typu" :) ostrzegajaca kompilator przed zakusami optymalizacji. A mowiac wprost, wartosc zmiennej zadeklarowanej z modyfikatorem volatile bedzie odczytywana zawsze, gdy zostanie owa zmienna uzyta. Ma to znaczenie zazwyczaj w przypadku opgrogramowania pomiarowego. Swoja droga, czemu nie zajrzysz do _dowolnej_ ksiazki o c++ (chocby jednej z tych na sieci)... ? :-0 wp
Re: pytanie
Author: Guest
Date: Mon, 26 Jan 1998 08:33
Date: Mon, 26 Jan 1998 08:33
5 lines
801 bytes
801 bytes
> Swoja droga, czemu nie zajrzysz do _dowolnej_ ksiazki o c++ > (chocby jednej z tych na sieci)... ? :-0 A gdzie sa te ksiazki (te na sieci znaczy sie) ? Marcin
Re: pytanie
Author: Jarek Kucypera
Date: Mon, 26 Jan 1998 11:28
Date: Mon, 26 Jan 1998 11:28
24 lines
1749 bytes
1749 bytes
Guest <guest@manjak.knm.org.pl> napisał(a) w artykule <199801251001.LAA04510@manjak.knm.org.pl>... > Co to jest za typ volatile ? > > Marcin > To nie typ, tylko modyfikator. "volatile" informuje kompilator, że dana zmienna może być modyfikowana z zewnątrz programu, czyli nie wolno jej optymalizować (np. trzymać w rejestrach lub zmiennych roboczych), bo w każdej chwili jej wartość może zostać zmodyfikowana przez czynniki zewnętrzne i w takim momencie odczyt jej wartości "z kesza" (np. z rejestru) daje wartość nieaktualną. I tak samo zapis powinien odbywać się bezpośrednio do jej miejsca w pamięci, aby programy zewnętrzne miały jej aktualną wartość. Przy czym można se pewnie wyobrazić, że te "programy zewnętrzne" to asynchroniczna wpółbieżna (chyba że mamy więcej procesorów, to może być równoległa) procedura wewnątrz tego samego programu (precyzyjniej - "procesu"), np. procedura obsługi przerwania IRQ w aplikacji DOSowej. ----------------------------------------- Jaroslaw Kucypera mailto:jark@insert.com.pl -----------------------------------------
Re: pytanie
Author: Mechanik
Date: Mon, 26 Jan 1998 16:34
Date: Mon, 26 Jan 1998 16:34
28 lines
1556 bytes
1556 bytes
Dnia 25 Jan 98 10:01:48 GMT guest@manjak.knm.org.pl (Guest) napisal tak: >Co to jest za typ volatile ? To nie tyle typ co kwalifikator typu jak const. Znaczenie ma takie, ze zmienna moze sie zmieniac sama w sobie, wiec lepiej zeby kompilator nie robil pewnych optymalizacji. Najczesciej taka zmienna jest port do odczytu jakiegos urzadzenia. Kiedy optymalizacja moze byc zgubna? Ano wezmy proste czytanie portu na maszynie gdzie porty sa mapowane w przstrzeni adresowej procesora: *control_port = data_1; status = *status_port; /* ... instrukcje nie zmieniajace wartosci zmiennej *status_port ... */ *control_port = data_2; status = *status_port; Gdyby status_port bylo wskaznikiem na zwykla zmienna, to kompilator moze w ramach optymalizacji pominac ostatnie przypisanie. Tymczasem jesli status_port jest wskaznikiem na port urzadzenia to robic tego nie wolno. Tak samo pewnie bedzie w przypadku pamieci dzielonej. VANITAS VANITATUM ET OMNIA VANITAS Mechanik
Re: pytanie
Author: Marek Kotowski
Date: Fri, 30 Jan 1998 15:49
Date: Fri, 30 Jan 1998 15:49
24 lines
1445 bytes
1445 bytes
Mechanik wrote: > > >Co to jest za typ volatile ? > > To nie tyle typ co kwalifikator typu jak const. To prawda. I volatile i const nazywaja sie kwalifikatorami, bo dodatkowo kwalifikuja zmienna. Przy czym const zostal zapozyczony z C++ (mowie o jezyku C), zas volatile - jak mowia nie bez dumy autorzy standardu ANSI C - jest ich wlasnym wynalazkiem. Do uwag na temat zwiazku volatile z optymalizacja dodalbym jeszcze jedna. Otoz kwalifikator volatile bywa pozyteczny w konstrukcjach z dalekim skokiem (setjmp, longjmp). Jesli chce sie, by wartosci pewnych zmiennych pozostaly niezmienione po wykonaniu longjmp (mowa o zmiennych w funkcji, w ktorej wywolano setjmp), nalezy te zmienne opatrzec kwalifikatorem volatile. Kompilator nie wstawi ich do rejestrow i ewentualny skok longjmp nie zaszkodzi im. Pozdrawiam Marek Kotowski
Re: pytanie
Author: Karpierz
Date: Fri, 30 Jan 1998 19:57
Date: Fri, 30 Jan 1998 19:57
45 lines
1802 bytes
1802 bytes
Marek Kotowski <mkot@imm.org.pl> napisal
[...]
> Do uwag na temat zwiazku volatile z optymalizacja dodalbym
> jeszcze jedna. Otoz kwalifikator volatile bywa pozyteczny
> w konstrukcjach z dalekim skokiem (setjmp, longjmp).
> Jesli chce sie, by wartosci pewnych zmiennych pozostaly
> niezmienione po wykonaniu longjmp (mowa o zmiennych w
> funkcji, w ktorej wywolano setjmp), nalezy te zmienne
> opatrzec kwalifikatorem volatile. Kompilator nie wstawi ich
> do rejestrow i ewentualny skok longjmp nie zaszkodzi im.
Inna wazna sprawa zwiazana z optymalizacja to np. to, ze
volatile zapobiega wylaczeniu przed petle wyrazen
ktorych wartosc nie zalezy od petli:
Przyklad (teoretyczny):
volatile int * a = TIMER_ADDRESS;
int czas;
for (;;)
{
czas = *a;
...
}
Gdyby nie volatile optymalizator moglby zrobic tak:
int * a = TIMER_ADDRESS;
int czas;
czas = *a;
for (;;)
{
...
}
co oczywiscie powodowaloby bledne dzialanie
programu.
--
Pozdrawiam Adam Karpierz
mailto:karpierz@intertele.pl
http://www.intertele.pl/users/karpierz
Re: pytanie
Author: Jaroslaw Lis
Date: Fri, 30 Jan 1998 22:45
Date: Fri, 30 Jan 1998 22:45
9 lines
891 bytes
891 bytes
Karpierz <karpierz@inter.intertele.pl> wrote: : Przyklad (teoretyczny): : volatile int * a = TIMER_ADDRESS; Czekaj czekaj - czy to a jest w tym przykladzie volatile, czy *a ? J.
Re: pytanie
Author: Karpierz
Date: Fri, 30 Jan 1998 23:42
Date: Fri, 30 Jan 1998 23:42
25 lines
1646 bytes
1646 bytes
Jaroslaw Lis <lis@papuga.ict.pwr.wroc.pl> napisal > Karpierz <karpierz@inter.intertele.pl> wrote: > : Przyklad (teoretyczny): > > : volatile int * a = TIMER_ADDRESS; > > Czekaj czekaj - czy to a jest w tym przykladzie volatile, czy *a ? dla mnie *a (identycznie gdyby napisac const zamiast volatile) bo wlasnie *a faktycznie sie zmienia w czasie. a natomiast jest staly. Czyli kompilator nie powinien realizowac optymalizacji *a i o to mi chodzilo. Ja przynajmniej tak to rozumiem... ale 100% pewnosci nie mam. Poprawcie jesli sie myle. A tak w ogole to prawde mowiac raz jedyny chyba uzywalem volatile (i to dawno temu) przy pisaniu wstepnej wersji sterownika SVGA do BGI i to chwilowo... do czasu przepisania go na ASM... Ciekawy jestem jak inni. -- Pozdrawiam Adam Karpierz mailto:karpierz@intertele.pl http://www.intertele.pl/users/karpierz
Re: pytanie
Author: Michal Malecki
Date: Mon, 02 Feb 1998 12:47
Date: Mon, 02 Feb 1998 12:47
20 lines
1637 bytes
1637 bytes
Jaroslaw Lis <lis@papuga.ict.pwr.wroc.pl> wrote:
: Karpierz <karpierz@inter.intertele.pl> wrote:
: : Przyklad (teoretyczny):
: : volatile int * a = TIMER_ADDRESS;
: Czekaj czekaj - czy to a jest w tym przykladzie volatile, czy *a ?
Zanim rzucisz takie pytanie, poczytaj literature. Albo sie sam zastanow.
'volatile' jest kwalifikatorem podobnym do 'const'. W zwiazku z tym
gdyby napisac int * volatile a; to wtedy dopiero a byloby volatile.
Ale nas interesuje przeciez zmiennosc rejestru sprzetowego, a nie jego adres.
Adres wrecz powinien byc staly.
--
.---. . . - Michal Malecki <mmalecki@technologist.com>/The things that
\___ ,-. | , |- ,-. ,- mUd: zly.mud.org.pl 4000. /can't destroy you
\ |-' |< | | | | uRl: www.kis.p.lodz.pl/~sektor /make you
`---' `-' ' ` `' `-' ' pGp: sektor@zly.kis.p.lodz.pl /stronger...
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads