[En-Nut-Discussion] Hardware Register Access Using Volatile Pointer
harald.kipp at egnite.de
Mon Apr 25 19:51:25 CEST 2011
today (with GCC) we are using
#define inr(_reg) (*((volatile unsigned int *)(_reg)))
and friend to directly access I/O registers. It seems to work, but that's deceptive.
The problem is, that the compiler will not guarantee, that the sequence of statements is kept. To force this, a memory barrier can be used
asm volatile("": : :"memory");
If used, the volatile attribute in inr() is dispensable, because the memory barrier will enforce the write.
Now, where I stumbled is the case, where I simply want to read an I/O status register to clear a flag. In this case I'm not interested in the value, I simply want to read from the given address and throw away the contents. The question is: Will
#define inr(_reg) (*((unsigned int *)(_reg)))
#define mem_barrier() asm volatile("": : :"memory")
ensure, that a value is read to clear the AT91 timer status register TC0_SR? Or might it be possible that the compiler optimizes out the register access?
More information about the En-Nut-Discussion