Where to use volatile?
The most common case in my world is when you are programming microcontrollers that use memory-mapped I/O. The value in a register could change due to external digital inputs, but if you don't declare a variable as volatile
, the compiler might optimize the code out completely and you'll be wondering why nothing works.
Matt suggested that I embellish on the statement regarding code getting "optimized out". Memory mapped I/O is accessed in code via pointers. When you want to check the state of a button, you will typically bitwise AND the value of the register with the bitmask for the button. If you don't specify volatile, the compiler will say, "hey, your code never actually changes the value of that pointer, so I'm going to just remove that statement where you've bitwise ANDed it, because the value is always the same!".
Hopefully this clears my statement up a bit. Thanks for the suggestion, Matt.
As you've marked this with the linux-device-driver
tag, some specific advice for coding within the Linux kernel is possibly in order.
In general, you shouldn't need to write volatile
in your Linux kernel code. In the cases where volatile
might be required, its use is wrapped in core kernel functions that you should call instead. For example, if you're doing memory-mapped I/O, then you should be using ioremap()
, writel()
, readl()
etc.
Apart form what others have said, volatile keyword is generally to prevent the compiler form doing the optimization. In certain memory mapped registers where the value of the registers keep on changing (e.g. an RTC clock register) volatile key word is used. Take a look at this example :
RTC_CLOCK _time;
TIME _currentTime = _time ;
while(_currentTime - _time >= 100)
{
//Do something
}
//rest of the code
If we do not append the volatile keyword before TIME this code will be like this as _currentTime - _time = 0 and the compiler will not consider the while loop below it.:
RTC_CLOCK _time;
TIME _currentTime = _time ;
//rest of the code
to prevent this we have to use the volatile keyword with the TIME.