This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Problem with optimisation of volatiles

Hi there All,

I have a problem which seemed to be defying explanation, but I have come up with a theory. Could I possibly have some feedback on whether the following is likely, plausible, possible, untrue or downright rubbish?

If one reads the contents of a CAN or ADC chip register at a particular address, then the label volatile is placed upon that address to prevent the compiler optimising out repeat readings of the address. If one reads the contents of the address into a variable, then the compiler would automatically treat the contents of this variable with similar care.

Is it possible that there has been an oversight with statements where the contents of a variable depend on the contents of a volatile by way of an if statement, ie...

normal_var=volatile_var;

...is correctly optimised, but...

normal_var=voltile_var;
if (normal_var=0x00)
   {
   another_normal_var+=1;
   }

...is not correctly optimised all of the time, dependant on the surrounding code, unless normal_var itself is declared to be volatile?

For info - am using optimisation level...

OPTIMIZE(3,SPEED)

...and am using version...

C166 COMPILER V4.11

Any thoughts, or is any or all of the above thoughts and understanding way off the mark?


Yours (grateful for any input),


Richard.

Parents
  • PS I ought to add about this piece of code, that if the loop to detect if any CAN messages are received is repeated further down the piece of code. If these further repeats are removed (by for example the use of the lines...

    while(1)
       {
       Watchdog();
       }
    

    ...before the repeat (which the compilers optimiser should hopefully then regard as dead code and ignore it) or by just deleting it, then the problem goes away.

    To my mind this suggests that perhaps when the optimiser is picking up on repeat code, it is only placing it once in the final code, but making two calls to it, and that it is somewhere in this attempt to optimise that the difference in interpretation of my code is occuring.

    Yours,

    Rich.

Reply
  • PS I ought to add about this piece of code, that if the loop to detect if any CAN messages are received is repeated further down the piece of code. If these further repeats are removed (by for example the use of the lines...

    while(1)
       {
       Watchdog();
       }
    

    ...before the repeat (which the compilers optimiser should hopefully then regard as dead code and ignore it) or by just deleting it, then the problem goes away.

    To my mind this suggests that perhaps when the optimiser is picking up on repeat code, it is only placing it once in the final code, but making two calls to it, and that it is somewhere in this attempt to optimise that the difference in interpretation of my code is occuring.

    Yours,

    Rich.

Children
No data