A volatile variable is one that can be changed outside the program flow. For instance, an input port on a micro or a global variable that is changed in an interrupt routine.
A compiler will optimise code so that sometimes it puts a variable in a reg and asumes it hasn't changed.
The volatile directive tells the compiler that the value of the variable must be read before using it.