「volatile」は揮発性という意味で変数の値がコードの介入無しに
変化したり、代入の回数によって結果が異なる、つまりリード、ラ
イトの結果が揮発してしまうことを示します。
例えば
for(sum=i=0;i++;i<100)
sum += port;
average = sum/100;
のようなコードを書くとaverageはコンパイル時に決定可能な結果ですから
ループを100回まわしたりするコードはださず、いきなり
average = port;
のようなコードに置き換えられてしまいます。(必要が有ればsum = 300
やi = 99もコード化されます)
しかし、portは読むたびに値がどうなるかわからないのが普通ですから
これでは困ってしまうのでvolatile宣言でそれを教えるようにします。
すると忠実に100回のループを回して平均を取るコードになるわけです。
書き込みだけのportにvolatile宣言を忘れる人がいます。しかし、
for(i=1;i++;i<100)
port ^= 0xff;
でクロックを出しているつもりがこんなの一回で結果がわかるとコンパ
イル時にport ^= 0xffに最適化されてはたまりません。
これらは一例に過ぎず、いろいろ予期せぬ動作を引き起こすので基本的に
外界に通じている変数は総てvolatile宣言します。
/IMAIZUMI Osamu