Reputation: 1
I was just going through concepts of the volatile
keyword. I just gone through this link, this link is telling about why to use the volatile
keyword in case of program using interrupt handler. They have mentioned in one example:
int etx_rcvd = FALSE;
void main()
{
...
while (!ext_rcvd)
{
// Wait
}
...
}
interrupt void rx_isr(void)
{
...
if (ETX == rx_char)
{
etx_rcvd = TRUE;
}
...
}
They are saying since compiler is not able to know ext_rcvd
is getting updated in an interrupt handler. So compiler uses optimization intelligence and assumes that this variable value is always FALSE
and it never enters into the while{}
condition. So to prevent these situation we use volatile
keyword, which stops compiler to use its own intelligence.
My question is, While compiling, how compiler is not able to know that ext_rcvd
is getting updated in interrupt handler? PLease help me to find its answer, I am not getting correct answer for this.
Upvotes: 0
Views: 104
Reputation: 153508
interrupt
is not a C specified keyword, so whatever is discussed is not C specified behavior.
Yes the compiler could see that etx_rcvd
is modified inside an interrupt
routine and therefore assume etx_rcvd
could change at any time outside the interrupt function and make int etx_rcvd
--> volatile int etx_rcvd
.
Now the question is should it do that?
IMO: No, it is not needed.
An interrupt
function could modify global variables and the code flow is such that non-interrupt functions access only happens in a interrupt protected block. An optimizing compiler would be hindered by having implied volatile
with int etx_rcvd
. So now code needs a way to say non_volatile int etx_rcvd
to prevent the volatile
assumption OP seeks.
C all ready provides a method to declare variables volatile (add volatile
) and non-volatile (do not add volatile
). If an interrupt
routine could make variables volatile
without them being declared so, the code would need a new keyword to insure non-volatility.
Upvotes: 0
Reputation: 5570
The compiler cannot analyze all the codes or running processes that can modify the memory location of ext_rcvd
.
In your example, you mentioned that ext_rcvd
is being updated in an interrupt handler. That is correct. The interrupt handler is a piece of code launched by the Operating System, when the CPU receives an interrupt. That piece of code is actually the driver code. In the driver code, ext_rcvd
may have another name but point to the same memory location.
So in order to know if ext_rcvd
is updated somewhere else, the compiler needs to analyze the libraries and drivers' code and to figure out that they are updating the exact same memory location that you name ext_rcvd
in your code. This cannot be done before execution time.
The same goes for multi-threading. The compiler cannot know a-priori if a certain thread is updating the exact memory location used by another thread. For example if another thread makes a syscall()
then the compiler needs to look in the code handling the syscall()
.
Upvotes: 1
Reputation: 769
When the CPU receives an interrupt, it stops whatever it's doing (unless it's processing a more important interrupt, in which case it will deal with this one only when the more important one is done), saves certain parameters on the stack and calls the interrupt handler. This means that certain things are not allowed in the interrupt handler itself, because the system is in an unknown state. The solution to this problem is for the interrupt handler to do what needs to be done immediately, usually read something from the hardware or send something to the hardware, and then schedule the handling of the new information at a later time (this is called the "bottom half") and return. The kernel is then guaranteed to call the bottom half as soon as possible -- and when it does, everything allowed in kernel modules will be allowed.
I think when the interrupt is called whatever is working is stopped and the variable is set to TRUE, not satisfying the while condition. But when you use volatile keyword it makes C checks the variable value again.
Of course, I'm not 100% sure about this, I'm open for answers for change mine.
Upvotes: 0