Regular readers will know that I often comment on the use of volatile in embedded systems. As a result I am occasionally contacted about my opinion on whether a compiler is generating correct code – particularly when hardware is being accessed. Well I was contacted last week by Ratish Punoose who had a classic problem in that his code compiled okay on GCC but not on IAR. He had contacted IAR, who in turn basically said the compiler is correct – and here is the explanation. Ratish turned to me and John Regehr for our opinions. Well John and I came to similar opinions – namely:
- Ratish’s code was a bit weird, but not dramatically so.
- The explanation from IAR made no sense.
- It did indeed appear to be a compiler bug.
Ratish then posted his issue to the Msp430 forum on Yahoo. You can read his post and the responses here.
I’m sure many of you are at this point thinking that IAR is in for another round of bashing from me. Well you’d be wrong. One of the first responders to Ratish’s post was Paul Curtis of Rowley compilers. Paul gives an admirable explanation as to why Ratish’s code is wrong (and by extension so am I). Now I’m sure that IAR and Rowley are fierce competitors, and so Paul is also to be commended for leaping to the defense of IAR.
Furthermore, later in the thread Anders Lindgren of IAR chimes in and adds his detailed and compelling explanation.
Having read the posts from Paul and Anders I think they are right and I’m wrong. So thanks Gentlemen for:
- Setting me straight
- Proving that in the wonderful world of volatile accesses, there is always something more to learn.
I think there are several other lessons to be learned from this episode. However I think I’ll save them for another post.