Everything
A.1.2 通常時と割り込み時に使用する変数を定義する

通常時の処理と割り込み処理の両方で使用する変数は、volatile指定してください。

volatile修飾子をつけて変数宣言すると、その変数は最適化の対象からはずされ、レジスタに割り付ける最適化などを行わなくなります。volatile指定された変数に対する操作を行うときは、必ずメモリから値を読み込み、操作後にメモリへ値を書き込むコードになります。volatile指定されていない変数は、最適化によってレジスタに割り付けられ、その変数をメモリからロードするコードが削除されることがあります。またvolatile指定されていない変数に同じ値を代入する場合、冗長な処理と解釈されて最適化によりコードが削除されることもあります。