最終更新:2010-03-12 (金) 13:46:50 (5152d)  

volatile
Top / volatile

次の条件に当てはまる場合は、常にvolatile修飾子を使って宣言する。

  • 任意の割り込み処理ルーチンからアクセスされるグローバル変数を宣言するとき。
  • 2つ以上のタスクからアクセスされるグローバル変数を宣言するとき。
  • メモリー・マップトI/O方式を採る周辺機器のレジスタ・セットにアクセスするためのポインタ変数を宣言するとき。例「timer_t volatile const *p_timer」。

メモ

因みに変数メモリに置く変数CPU内のレジスタを使う変数の2種類がありまして,通常の考えでは,変数はメモリに置くのですが変数の読み書きを高速で行う場合はレジスタ変数を使います。コンパイラは自動的に高速に動くように変数とかコードを最適化するようになっております。今回の場合global_count_rightはレジスタに置かれたようです。割り込みを使わない場合はレジスタに置かれていてもよいのですが,割り込みを使うときは割り込み処理に入るときレジスタの値をスタック(データ保存エリア)に退避して処理し,割り込み処理が終わるとスタックからレジスタの値を復帰して元の処理に戻ります。そうすると,割り込みルーチンのレジスタ変数global_count_rightとメインルーチンのglobal_count_rightはグローバル変数なんだけどメインルーチンと割り込みルーチンで異なる値を取るわけです。変数に対してvolatile修飾をするとコンパイラは変数をレジスタに置く最適化をしないのでメモリに配置されます。メインルーチン・割り込みルーチンともこのメモリ上のglobal_count_right変数の読み書きをしますので値が異なることがなくなります。

Java