🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.c
11 messages
11 total messages Started by Guest Sun, 25 Jan 1998 10:01
pytanie
#921
Author: Guest
Date: Sun, 25 Jan 1998 10:01
3 lines
495 bytes
Co to jest za typ volatile ?

Marcin
Re: pytanie
#922
Author: Czesiek Dlugolecki
Date: Sun, 25 Jan 1998 15:12
7 lines
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
#923
Author: Witold Przygoda
Date: Mon, 26 Jan 1998 01:43
17 lines
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
#924
Author: Guest
Date: Mon, 26 Jan 1998 08:33
5 lines
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
#925
Author: Jarek Kucypera
Date: Mon, 26 Jan 1998 11:28
24 lines
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
#926
Author: Mechanik
Date: Mon, 26 Jan 1998 16:34
28 lines
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
#927
Author: Marek Kotowski
Date: Fri, 30 Jan 1998 15:49
24 lines
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
#928
Author: Karpierz
Date: Fri, 30 Jan 1998 19:57
45 lines
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
#929
Author: Jaroslaw Lis
Date: Fri, 30 Jan 1998 22:45
9 lines
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
#930
Author: Karpierz
Date: Fri, 30 Jan 1998 23:42
25 lines
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
#931
Author: Michal Malecki
Date: Mon, 02 Feb 1998 12:47
20 lines
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