8.9.2 Volatile Type Qualifier
The volatile type qualifier is used to tell the compiler
         that an object cannot be guaranteed to retain its value between successive accesses. This
         prevents the optimizer from eliminating apparently redundant references to objects declared
            volatile because it may alter the behavior of the program to do so.
Any SFR which can be modified by hardware or which drives hardware is
         qualified as volatile, and any variables which may be modified by
         interrupt routines should use this qualifier as well. For example:
extern volatile unsigned int WDTCON
            __attribute__((section("sfrs")));
The volatile qualifier does not guarantee that any access
         will be atomic, but the compiler will try to implement this.
The code produced by the compiler to access volatile
         objects may be different than that to access ordinary variables, and typically the code
         will be longer and slower for volatile objects, so only use this qualifier
         if it is necessary. However failure to use this qualifier when it is required may lead to
         code failure.
Another use of the volatile keyword is to prevent
         variables from being removed if they are not used in the C/C++ source. If a
            non-volatile variable is never used, or used in a way that has no
         effect on the program’s function, then it may be removed before code is generated by the
         compiler.
A C/C++ statement that consists only of a volatile
         variable’s name will produce code that reads the variable’s memory location and discards
         the result. For example the entire statement:
PORTB;
will produce assembly code that reads PORTB, but does
         nothing with this value. This is useful for some peripheral registers that require reading
         to reset the state of interrupt flags. Normally such a statement is not encoded as it has
         no effect.
